tx · 8tXVQm6SFBAYUdaksw7J6LVQ2iFNykUcksK6LVrMa6zg

3M6FGGwhnZmuToyPzHiojzmk2DVwtUhsjdj:  -0.06000000 Waves

2026.06.01 23:11 [765026] smart account 3M6FGGwhnZmuToyPzHiojzmk2DVwtUhsjdj > SELF 0.00000000 Waves

{ "type": 13, "id": "8tXVQm6SFBAYUdaksw7J6LVQ2iFNykUcksK6LVrMa6zg", "fee": 6000000, "feeAssetId": null, "timestamp": 1780344680781, "version": 2, "chainId": 82, "sender": "3M6FGGwhnZmuToyPzHiojzmk2DVwtUhsjdj", "senderPublicKey": "HK2G1mj8PSLPc3rNrmZPcxjUcDzMUD9P6EMcq7SqkAdy", "proofs": [ "41HFYTrbiULz4WtBN1MbkDWNQwMQT7zGBGPitTHsb8A6bbeBDdj7QEQWtWhPRBEpwba96VtKHcreGuEJbA7ho6vW" ], "script": "base64:BgItCAISAwoBCBIECgIBCBIDCgEIEgQKAggIEgMKAQgSBAoCAQgSAwoBCBIDCgEECwAHVkVSU0lPTgIRUG9vbHNMYXllcjItMS4wLjIADUNPTlRSQUNUX1RZUEUCDFBPT0xTX0xBWUVSMgAIbWFuYWdlcnMJAMwIAgkBB0FkZHJlc3MBARoBUl6Pvx9AHTw1Npfg4xX5u5jVZifSgnfKWwkAzAgCCQEHQWRkcmVzcwEBGgFSXo+/H0AdPDU2l+DjFfm7mNVmJ9KCd8pbCQDMCAIJAQdBZGRyZXNzAQEaAVJej78fQB08NTaX4OMV+buY1WYn0oJ3ylsJAMwIAgkBB0FkZHJlc3MBARoBUl6Pvx9AHTw1Npfg4xX5u5jVZifSgnfKWwkAzAgCCQEHQWRkcmVzcwEBGgFSXo+/H0AdPDU2l+DjFfm7mNVmJ9KCd8pbBQNuaWwBCmlzU2h1dGRvd24ABAckbWF0Y2gwCQCbCAIJAQdBZGRyZXNzAQEaAVJej78fQB08NTaX4OMV+buY1WYn0oJ3ylsCC2lzX3NodXRkb3duAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgHAQ1nZXRBc3NldEJ5dGVzAQphc3NldElkU3RyAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTBQR1bml0CQDZBAEFCmFzc2V0SWRTdHIBDmdldEFzc2V0U3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAIFV0FWRVMBD2dldFRva2VuQmFsYW5jZQEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAF0BQckbWF0Y2gwCQDwBwIFBHRoaXMFAXQICQDvBwEFBHRoaXMJYXZhaWxhYmxlARJnZXRQb29sV2VpZ2h0c1N1bW0BC21haW5BZGRyZXNzCgEBZgIFYWNjdW0EaXRlbQkAZAIFBWFjY3VtCQERQGV4dHJOYXRpdmUoMTA1MCkCBQttYWluQWRkcmVzcwkArAICCQCsAgICB3N0YXRpY18FBGl0ZW0CB193ZWlnaHQECGFzc2V0SWRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFC21haW5BZGRyZXNzAg9zdGF0aWNfdG9rZW5JZHMCASwKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBAWYCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBE2FkZEFzc2V0Qnl0ZXNUb0xpc3QCBWFjY3VtBGl0ZW0JAM4IAgUFYWNjdW0JAMwIAgkBDWdldEFzc2V0Qnl0ZXMBBQRpdGVtBQNuaWwBEHdoaXRlbGlzdEVuYWJsZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMCFnNldHVwX3doaXRlbGlzdEVuYWJsZWQHAQ9wb29sV2hpdGVsaXN0ZWQBB2FkZHJlc3MDCQEBIQEJARB3aGl0ZWxpc3RFbmFibGVkAAYEF3doaXRlbGlzdENvb3JkaW5hdG9yU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMCGnNldHVwX3doaXRlbGlzdENvb3JkaW5hdG9yAgAEFHdoaXRlbGlzdENvb3JkaW5hdG9yAwkBAiE9AgUXd2hpdGVsaXN0Q29vcmRpbmF0b3JTdHICAAkApggBBRd3aGl0ZWxpc3RDb29yZGluYXRvclN0cgUEdW5pdAMJAQIhPQIFFHdoaXRlbGlzdENvb3JkaW5hdG9yBQR1bml0CQELdmFsdWVPckVsc2UCCQCbCAIJAQV2YWx1ZQEFFHdoaXRlbGlzdENvb3JkaW5hdG9yCQCsAgIFB2FkZHJlc3MCEF9wb29sV2hpdGVsaXN0ZWQHBwgBaQEhZ2VuZXJhdGVJbmRleFdpdGhPbmVUb2tlbkFuZFN0YWtlAQ5tYWluQWRkcmVzc1N0cgQKX3ZhbGlkUG9vbAMJAQ9wb29sV2hpdGVsaXN0ZWQBBQ5tYWluQWRkcmVzc1N0cgYJAAIBCQCsAgIJAKwCAgIFUG9vbCAFDm1haW5BZGRyZXNzU3RyAhMgaXMgbm90IHdoaXRlbGlzdGVkAwkAAAIFCl92YWxpZFBvb2wFCl92YWxpZFBvb2wEB3Rva2VuSWQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLYmFzZUFzc2V0SWQFB3Rva2VuSWQEC21haW5BZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUObWFpbkFkZHJlc3NTdHIECGFzc2V0SWRzCgACJGwJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgULbWFpbkFkZHJlc3MCD3N0YXRpY190b2tlbklkcwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQETYWRkQXNzZXRCeXRlc1RvTGlzdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQPcG9vbFdlaWdodHNTdW1tCQESZ2V0UG9vbFdlaWdodHNTdW1tAQULbWFpbkFkZHJlc3MECl92YWxpZFN1bW0DCQAAAgUPcG9vbFdlaWdodHNTdW1tAJBOBgkAAgEJAKwCAgkArAICCQCsAgICGkludmFsaWQgcG9vbCB3ZWlnaHRzIHN1bW0gBQ5tYWluQWRkcmVzc1N0cgIILCBzdW1tOiAJAKQDAQUPcG9vbFdlaWdodHNTdW1tAwkAAAIFCl92YWxpZFN1bW0FCl92YWxpZFN1bW0EEXNlY29uZGFyeUFzc2V0SWRzCQDRCAIFCGFzc2V0SWRzCQEFdmFsdWUBCQDPCAIFCGFzc2V0SWRzBQd0b2tlbklkBAtwb29sSW5kZXhJZAkBEUBleHRyTmF0aXZlKDEwNTIpAgULbWFpbkFkZHJlc3MCE2dsb2JhbF9wb29sVG9rZW5faWQEBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQKAQdoYW5kbGVyAgVhY2N1bQdhc3NldElkBAphc3NldElkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBBQdhc3NldElkBAthc3NldFdlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgULbWFpbkFkZHJlc3MJAKwCAgkArAICAgdzdGF0aWNfBQphc3NldElkU3RyAgdfd2VpZ2h0BAdfYW1vdW50CQBrAwUGYW1vdW50BQthc3NldFdlaWdodAUPcG9vbFdlaWdodHNTdW1tBAJpbgQHJG1hdGNoMAkA/AcEBQttYWluQWRkcmVzcwIEc3dhcAkAzAgCCQEOZ2V0QXNzZXRTdHJpbmcBBQdhc3NldElkCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQtiYXNlQXNzZXRJZAUHX2Ftb3VudAUDbmlsAwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAAAAwkAAAIFAmluBQJpbgkAzggCBQVhY2N1bQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUCaW4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQPYmFzZUFzc2V0V2VpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQttYWluQWRkcmVzcwkArAICCQCsAgICB3N0YXRpY18JAQ5nZXRBc3NldFN0cmluZwEFC2Jhc2VBc3NldElkAgdfd2VpZ2h0BAhfYmFtb3VudAkAawMFBmFtb3VudAUPYmFzZUFzc2V0V2VpZ2h0BQ9wb29sV2VpZ2h0c1N1bW0ED2V4Y2hhbmdlSW52b2tlcwoAAiRsBRFzZWNvbmRhcnlBc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC2Jhc2VBc3NldElkBQhfYmFtb3VudAUDbmlsCgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdoYW5kbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAwkAAAIFD2V4Y2hhbmdlSW52b2tlcwUPZXhjaGFuZ2VJbnZva2VzBA1QSXNzdWVkQW1vdW50BAckbWF0Y2gwCQD8BwQFC21haW5BZGRyZXNzAg1nZW5lcmF0ZUluZGV4CQDMCAIHBQNuaWwFD2V4Y2hhbmdlSW52b2tlcwMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgAAAMJAAACBQ1QSXNzdWVkQW1vdW50BQ1QSXNzdWVkQW1vdW50BAtzdGFrZUludm9rZQkA/AcEBQttYWluQWRkcmVzcwIKc3Rha2VJbmRleAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQtwb29sSW5kZXhJZAUNUElzc3VlZEFtb3VudAUDbmlsAwkAAAIFC3N0YWtlSW52b2tlBQtzdGFrZUludm9rZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBH3Vuc3Rha2VJbmRleEFuZFJlZGVlbUFzT25lVG9rZW4CC2luZGV4QW1vdW50Dm1haW5BZGRyZXNzU3RyBApfdmFsaWRQb29sAwkBD3Bvb2xXaGl0ZWxpc3RlZAEFDm1haW5BZGRyZXNzU3RyBgkAAgEJAKwCAgkArAICAgVQb29sIAUObWFpbkFkZHJlc3NTdHICEyBpcyBub3Qgd2hpdGVsaXN0ZWQDCQAAAgUKX3ZhbGlkUG9vbAUKX3ZhbGlkUG9vbAQLbWFpbkFkZHJlc3MJAQdBZGRyZXNzAQkA2QQBBQ5tYWluQWRkcmVzc1N0cgQIYXNzZXRJZHMKAAIkbAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQttYWluQWRkcmVzcwIPc3RhdGljX3Rva2VuSWRzAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARNhZGRBc3NldEJ5dGVzVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtiYXNlQXNzZXRJZAkBDWdldEFzc2V0Qnl0ZXMBCQERQGV4dHJOYXRpdmUoMTA1MykCBQttYWluQWRkcmVzcwISc3RhdGljX2Jhc2VUb2tlbklkBBFzZWNvbmRhcnlBc3NldElkcwkA0QgCBQhhc3NldElkcwkBBXZhbHVlAQkAzwgCBQhhc3NldElkcwULYmFzZUFzc2V0SWQEC3Bvb2xJbmRleElkCQERQGV4dHJOYXRpdmUoMTA1MikCBQttYWluQWRkcmVzcwITZ2xvYmFsX3Bvb2xUb2tlbl9pZAoBDGZvbGRIYW5kbGVyMQIFYWNjdW0HYXNzZXRJZAkAzggCBQVhY2N1bQkAzAgCCQEPZ2V0VG9rZW5CYWxhbmNlAQUHYXNzZXRJZAUDbmlsBA5iYWxhbmNlc0JlZm9yZQoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMZm9sZEhhbmRsZXIxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAwkAAAIFDmJhbGFuY2VzQmVmb3JlBQ5iYWxhbmNlc0JlZm9yZQQPYmFzZUFzc2V0QmVmb3JlCQEPZ2V0VG9rZW5CYWxhbmNlAQULYmFzZUFzc2V0SWQDCQAAAgUPYmFzZUFzc2V0QmVmb3JlBQ9iYXNlQXNzZXRCZWZvcmUEDXVuc3Rha2VJbnZva2UJAPwHBAULbWFpbkFkZHJlc3MCDHVuc3Rha2VJbmRleAkAzAgCBQtpbmRleEFtb3VudAUDbmlsBQNuaWwDCQAAAgUNdW5zdGFrZUludm9rZQUNdW5zdGFrZUludm9rZQQMcmVkZWVtSW52b2tlCQD8BwQFC21haW5BZGRyZXNzAgtyZWRlZW1JbmRleAkAzAgCBwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQtwb29sSW5kZXhJZAULaW5kZXhBbW91bnQFA25pbAMJAAACBQxyZWRlZW1JbnZva2UFDHJlZGVlbUludm9rZQQNYmFsYW5jZXNBZnRlcgoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMl8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMZm9sZEhhbmRsZXIxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYyXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMl8yAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAwkAAAIFDWJhbGFuY2VzQWZ0ZXIFDWJhbGFuY2VzQWZ0ZXIEDmJhc2VBc3NldEFmdGVyCQEPZ2V0VG9rZW5CYWxhbmNlAQULYmFzZUFzc2V0SWQDCQAAAgUOYmFzZUFzc2V0QWZ0ZXIFDmJhc2VBc3NldEFmdGVyCgEMZm9sZEhhbmRsZXIyAgVhY2N1bQdhc3NldElkBAhhc3NldE51bQkBBXZhbHVlAQkAzwgCBQhhc3NldElkcwUHYXNzZXRJZAQGYW1vdW50CQBlAgkAkQMCBQ1iYWxhbmNlc0FmdGVyBQhhc3NldE51bQkAkQMCBQ5iYWxhbmNlc0JlZm9yZQUIYXNzZXROdW0EAmluBAckbWF0Y2gwCQD8BwQFC21haW5BZGRyZXNzAgRzd2FwCQDMCAIJAQ5nZXRBc3NldFN0cmluZwEFC2Jhc2VBc3NldElkCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBQZhbW91bnQFA25pbAMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgAAAMJAAACBQJpbgUCaW4JAGQCBQVhY2N1bQUCaW4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECWVnZ0Ftb3VudAoAAiRsBRFzZWNvbmRhcnlBc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmM18xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMZm9sZEhhbmRsZXIyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYzXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYzXzICCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAwkAAAIFCWVnZ0Ftb3VudAUJZWdnQW1vdW50BAZfY2hlY2sDAwkAZgIAAAUJZWdnQW1vdW50BgkAZgIAAAkAZQIFDmJhc2VBc3NldEFmdGVyBQ9iYXNlQXNzZXRCZWZvcmUJAAIBAg9JbnZhbGlkIGFtb3VudHMGAwkAAAIFBl9jaGVjawUGX2NoZWNrCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZAIFCWVnZ0Ftb3VudAkAZQIFDmJhc2VBc3NldEFmdGVyBQ9iYXNlQXNzZXRCZWZvcmUFC2Jhc2VBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUZ2VuZXJhdGVXaXRoT25lVG9rZW4BDm1haW5BZGRyZXNzU3RyBApfdmFsaWRQb29sAwkBD3Bvb2xXaGl0ZWxpc3RlZAEFDm1haW5BZGRyZXNzU3RyBgkAAgEJAKwCAgkArAICAgVQb29sIAUObWFpbkFkZHJlc3NTdHICEyBpcyBub3Qgd2hpdGVsaXN0ZWQDCQAAAgUKX3ZhbGlkUG9vbAUKX3ZhbGlkUG9vbAQLYmFzZUFzc2V0SWQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLbWFpbkFkZHJlc3MJAQdBZGRyZXNzAQkA2QQBBQ5tYWluQWRkcmVzc1N0cgQIYXNzZXRJZHMKAAIkbAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQttYWluQWRkcmVzcwIPc3RhdGljX3Rva2VuSWRzAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARNhZGRBc3NldEJ5dGVzVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA9wb29sV2VpZ2h0c1N1bW0JARJnZXRQb29sV2VpZ2h0c1N1bW0BBQttYWluQWRkcmVzcwQKX3ZhbGlkU3VtbQMJAAACBQ9wb29sV2VpZ2h0c1N1bW0AkE4GCQACAQkArAICCQCsAgIJAKwCAgIaSW52YWxpZCBwb29sIHdlaWdodHMgc3VtbSAFDm1haW5BZGRyZXNzU3RyAggsIHN1bW06IAkApAMBBQ9wb29sV2VpZ2h0c1N1bW0DCQAAAgUKX3ZhbGlkU3VtbQUKX3ZhbGlkU3VtbQQRc2Vjb25kYXJ5QXNzZXRJZHMJANEIAgUIYXNzZXRJZHMJAQV2YWx1ZQEJAM8IAgUIYXNzZXRJZHMFC2Jhc2VBc3NldElkBAtwb29sSW5kZXhJZAkBEUBleHRyTmF0aXZlKDEwNTIpAgULbWFpbkFkZHJlc3MCE2dsb2JhbF9wb29sVG9rZW5faWQECXBheUFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQKAQdoYW5kbGVyAgVhY2N1bQdhc3NldElkBAphc3NldElkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBBQdhc3NldElkBAthc3NldFdlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgULbWFpbkFkZHJlc3MJAKwCAgkArAICAgdzdGF0aWNfBQphc3NldElkU3RyAgdfd2VpZ2h0BAZhbW91bnQJAGsDBQlwYXlBbW91bnQFC2Fzc2V0V2VpZ2h0BQ9wb29sV2VpZ2h0c1N1bW0EAmluBAckbWF0Y2gwCQD8BwQFC21haW5BZGRyZXNzAgRzd2FwCQDMCAIJAQ5nZXRBc3NldFN0cmluZwEFB2Fzc2V0SWQJAMwIAgAABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC2Jhc2VBc3NldElkBQZhbW91bnQFA25pbAMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgAAAMJAAACBQJpbgUCaW4JAM4IAgUFYWNjdW0JAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFAmluBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECnJldHVybkZsYWcHBA9iYXNlQXNzZXRXZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFC21haW5BZGRyZXNzCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQULYmFzZUFzc2V0SWQCB193ZWlnaHQEDWJhc2VQYXlBbW91bnQJAGsDBQlwYXlBbW91bnQFD2Jhc2VBc3NldFdlaWdodAUPcG9vbFdlaWdodHNTdW1tBA9leGNoYW5nZUludm9rZXMKAAIkbAURc2Vjb25kYXJ5QXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQtiYXNlQXNzZXRJZAUNYmFzZVBheUFtb3VudAUDbmlsCgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdoYW5kbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAwkAAAIFD2V4Y2hhbmdlSW52b2tlcwUPZXhjaGFuZ2VJbnZva2VzBA1QSXNzdWVkQW1vdW50BAckbWF0Y2gwCQD8BwQFC21haW5BZGRyZXNzAg1nZW5lcmF0ZUluZGV4CQDMCAIFCnJldHVybkZsYWcFA25pbAUPZXhjaGFuZ2VJbnZva2VzAwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAAAAwkAAAIFDVBJc3N1ZWRBbW91bnQFDVBJc3N1ZWRBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ1QSXNzdWVkQW1vdW50BQtwb29sSW5kZXhJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnJlZGVlbVdpdGhPbmVUb2tlbgIObWFpbkFkZHJlc3NTdHINb3V0QXNzZXRJZFN0cgQKX3ZhbGlkUG9vbAMJAQ9wb29sV2hpdGVsaXN0ZWQBBQ5tYWluQWRkcmVzc1N0cgYJAAIBCQCsAgIJAKwCAgIFUG9vbCAFDm1haW5BZGRyZXNzU3RyAhMgaXMgbm90IHdoaXRlbGlzdGVkAwkAAAIFCl92YWxpZFBvb2wFCl92YWxpZFBvb2wEC21haW5BZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUObWFpbkFkZHJlc3NTdHIECGFzc2V0SWRzCgACJGwJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgULbWFpbkFkZHJlc3MCD3N0YXRpY190b2tlbklkcwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQETYWRkQXNzZXRCeXRlc1RvTGlzdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLYmFzZUFzc2V0SWQJAQ1nZXRBc3NldEJ5dGVzAQUNb3V0QXNzZXRJZFN0cgQRc2Vjb25kYXJ5QXNzZXRJZHMJANEIAgUIYXNzZXRJZHMJAQV2YWx1ZQEJAM8IAgUIYXNzZXRJZHMFC2Jhc2VBc3NldElkBAtwb29sSW5kZXhJZAkBEUBleHRyTmF0aXZlKDEwNTIpAgULbWFpbkFkZHJlc3MCE2dsb2JhbF9wb29sVG9rZW5faWQKAQxmb2xkSGFuZGxlcjECBWFjY3VtB2Fzc2V0SWQJAM4IAgUFYWNjdW0JAMwIAgkBD2dldFRva2VuQmFsYW5jZQEFB2Fzc2V0SWQFA25pbAQOcmV0dXJuVG9PcmlnaW4HBA5iYWxhbmNlc0JlZm9yZQoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMZm9sZEhhbmRsZXIxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAwkAAAIFDmJhbGFuY2VzQmVmb3JlBQ5iYWxhbmNlc0JlZm9yZQQPYmFzZUFzc2V0QmVmb3JlCQEPZ2V0VG9rZW5CYWxhbmNlAQULYmFzZUFzc2V0SWQDCQAAAgUPYmFzZUFzc2V0QmVmb3JlBQ9iYXNlQXNzZXRCZWZvcmUEDXVuc3Rha2VJbnZva2UJAPwHBAULbWFpbkFkZHJlc3MCC3JlZGVlbUluZGV4CQDMCAIFDnJldHVyblRvT3JpZ2luBQNuaWwJAMwIAgkAkQMCCAUBaQhwYXltZW50cwAABQNuaWwDCQAAAgUNdW5zdGFrZUludm9rZQUNdW5zdGFrZUludm9rZQQNYmFsYW5jZXNBZnRlcgoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMl8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMZm9sZEhhbmRsZXIxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYyXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMl8yAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAwkAAAIFDWJhbGFuY2VzQWZ0ZXIFDWJhbGFuY2VzQWZ0ZXIEDmJhc2VBc3NldEFmdGVyCQEPZ2V0VG9rZW5CYWxhbmNlAQULYmFzZUFzc2V0SWQDCQAAAgUOYmFzZUFzc2V0QWZ0ZXIFDmJhc2VBc3NldEFmdGVyCgEMZm9sZEhhbmRsZXIyAgVhY2N1bQdhc3NldElkBAhhc3NldE51bQkBBXZhbHVlAQkAzwgCBQhhc3NldElkcwUHYXNzZXRJZAQGYW1vdW50CQBlAgkAkQMCBQ1iYWxhbmNlc0FmdGVyBQhhc3NldE51bQkAkQMCBQ5iYWxhbmNlc0JlZm9yZQUIYXNzZXROdW0EAmluAwkAAAIFB2Fzc2V0SWQFC2Jhc2VBc3NldElkBQZhbW91bnQEByRtYXRjaDAJAPwHBAULbWFpbkFkZHJlc3MCBHN3YXAJAMwIAgkBDmdldEFzc2V0U3RyaW5nAQULYmFzZUFzc2V0SWQJAMwIAgAABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFBmFtb3VudAUDbmlsAwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAAAAwkAAAIFAmluBQJpbgkAZAIFBWFjY3VtBQJpbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQDb3V0CgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYzXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxmb2xkSGFuZGxlcjICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjNfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYzXzICCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQAAAgUDb3V0BQNvdXQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQNvdXQFC2Jhc2VBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVZ2VuZXJhdGVJbmRleEFuZFN0YWtlAQ5tYWluQWRkcmVzc1N0cgQKX3ZhbGlkUG9vbAMJAQ9wb29sV2hpdGVsaXN0ZWQBBQ5tYWluQWRkcmVzc1N0cgYJAAIBCQCsAgIJAKwCAgIFUG9vbCAFDm1haW5BZGRyZXNzU3RyAhMgaXMgbm90IHdoaXRlbGlzdGVkAwkAAAIFCl92YWxpZFBvb2wFCl92YWxpZFBvb2wEC21haW5BZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUObWFpbkFkZHJlc3NTdHIECGFzc2V0SWRzCgACJGwJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgULbWFpbkFkZHJlc3MCD3N0YXRpY190b2tlbklkcwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQETYWRkQXNzZXRCeXRlc1RvTGlzdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLYmFzZUFzc2V0SWQJAQ1nZXRBc3NldEJ5dGVzAQkBEUBleHRyTmF0aXZlKDEwNTMpAgULbWFpbkFkZHJlc3MCEnN0YXRpY19iYXNlVG9rZW5JZAQRc2Vjb25kYXJ5QXNzZXRJZHMJANEIAgUIYXNzZXRJZHMJAQV2YWx1ZQEJAM8IAgUIYXNzZXRJZHMFC2Jhc2VBc3NldElkBAtwb29sSW5kZXhJZAkBEUBleHRyTmF0aXZlKDEwNTIpAgULbWFpbkFkZHJlc3MCE2dsb2JhbF9wb29sVG9rZW5faWQEDVBJc3N1ZWRBbW91bnQEByRtYXRjaDAJAPwHBAULbWFpbkFkZHJlc3MCDWdlbmVyYXRlSW5kZXgJAMwIAgYFA25pbAgFAWkIcGF5bWVudHMDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4AAADCQAAAgUNUElzc3VlZEFtb3VudAUNUElzc3VlZEFtb3VudAQLc3Rha2VJbnZva2UJAPwHBAULbWFpbkFkZHJlc3MCCnN0YWtlSW5kZXgFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULcG9vbEluZGV4SWQFDVBJc3N1ZWRBbW91bnQFA25pbAMJAAACBQtzdGFrZUludm9rZQULc3Rha2VJbnZva2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARV1bnN0YWtlQW5kUmVkZWVtSW5kZXgCBmFtb3VudA5tYWluQWRkcmVzc1N0cgQKX3ZhbGlkUG9vbAMJAQ9wb29sV2hpdGVsaXN0ZWQBBQ5tYWluQWRkcmVzc1N0cgYJAAIBCQCsAgIJAKwCAgIFUG9vbCAFDm1haW5BZGRyZXNzU3RyAhMgaXMgbm90IHdoaXRlbGlzdGVkAwkAAAIFCl92YWxpZFBvb2wFCl92YWxpZFBvb2wEC21haW5BZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUObWFpbkFkZHJlc3NTdHIECGFzc2V0SWRzCgACJGwJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgULbWFpbkFkZHJlc3MCD3N0YXRpY190b2tlbklkcwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQETYWRkQXNzZXRCeXRlc1RvTGlzdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLYmFzZUFzc2V0SWQJAQ1nZXRBc3NldEJ5dGVzAQkBEUBleHRyTmF0aXZlKDEwNTMpAgULbWFpbkFkZHJlc3MCEnN0YXRpY19iYXNlVG9rZW5JZAQRc2Vjb25kYXJ5QXNzZXRJZHMJANEIAgUIYXNzZXRJZHMJAQV2YWx1ZQEJAM8IAgUIYXNzZXRJZHMFC2Jhc2VBc3NldElkBAtwb29sSW5kZXhJZAkBEUBleHRyTmF0aXZlKDEwNTIpAgULbWFpbkFkZHJlc3MCE2dsb2JhbF9wb29sVG9rZW5faWQEDXVuc3Rha2VJbnZva2UJAPwHBAULbWFpbkFkZHJlc3MCDHVuc3Rha2VJbmRleAkAzAgCBQZhbW91bnQFA25pbAgFAWkIcGF5bWVudHMDCQAAAgUNdW5zdGFrZUludm9rZQUNdW5zdGFrZUludm9rZQQMcmVkZWVtSW52b2tlCQD8BwQFC21haW5BZGRyZXNzAgtyZWRlZW1JbmRleAkAzAgCBgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQtwb29sSW5kZXhJZAUGYW1vdW50BQNuaWwDCQAAAgUMcmVkZWVtSW52b2tlBQxyZWRlZW1JbnZva2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARdzZXRXaGl0ZWxpc3RDb29yZGluYXRvcgELY29vcmRpbmF0b3IDCQAAAgkAzwgCBQhtYW5hZ2VycwgFAWkGY2FsbGVyBQR1bml0CQACAQIKYWRtaW4gb25seQQHYWRkcmVzcwkApggBBQtjb29yZGluYXRvcgMJAAACBQdhZGRyZXNzBQR1bml0CQACAQIPaW52YWxpZCBhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQICGnNldHVwX3doaXRlbGlzdENvb3JkaW5hdG9yBQtjb29yZGluYXRvcgUDbmlsAWkBE3NldFdoaXRlbGlzdEVuYWJsZWQBA3ZhbAMJAAACCQDPCAIFCG1hbmFnZXJzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAgphZG1pbiBvbmx5BBd3aGl0ZWxpc3RDb29yZGluYXRvclN0cgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAhpzZXR1cF93aGl0ZWxpc3RDb29yZGluYXRvcgIABBR3aGl0ZWxpc3RDb29yZGluYXRvcgMJAQIhPQIFF3doaXRlbGlzdENvb3JkaW5hdG9yU3RyAgAJAKYIAQUXd2hpdGVsaXN0Q29vcmRpbmF0b3JTdHIFBHVuaXQDAwkAAAIFFHdoaXRlbGlzdENvb3JkaW5hdG9yBQR1bml0BQN2YWwHCQACAQIfc2V0IHdoaXRlbGlzdCBjb29yZGluYXRvciBmaXJzdAkAzAgCCQEMQm9vbGVhbkVudHJ5AgIWc2V0dXBfd2hpdGVsaXN0RW5hYmxlZAUDdmFsBQNuaWwBAnR4AQZ2ZXJpZnkABAttdWx0aXNpZ1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBAhBBUFBST1ZFUl9BRERSRVNTAgAED211bHRpc2lnQWRkcmVzcwkApggBBQttdWx0aXNpZ1N0cgQKbXVsdGlzaWdPawQHJG1hdGNoMAUPbXVsdGlzaWdBZGRyZXNzAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAXQFByRtYXRjaDAGBwQIaXNJbml0ZWQDBQptdWx0aXNpZ09rCQELdmFsdWVPckVsc2UCCQCbCAIJAQV2YWx1ZQEFD211bHRpc2lnQWRkcmVzcwIGSU5JVEVEBwcECWhhc0FkbWlucwMFCm11bHRpc2lnT2sJAQIhPQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgkBBXZhbHVlAQUPbXVsdGlzaWdBZGRyZXNzAgtBRE1JTlNfUEJLUwIAAgAHAwMDBQptdWx0aXNpZ09rBQhpc0luaXRlZAcFCWhhc0FkbWlucwcEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACFFNldFNjcmlwdFRyYW5zYWN0aW9uBAN0dHgFByRtYXRjaDAEByRtYXRjaDEIBQN0dHgGc2NyaXB0AwkAAQIFByRtYXRjaDECCkJ5dGVWZWN0b3IEBnNjcmlwdAUHJG1hdGNoMQQLc2NyaXB0SGFzaGEJANgEAQkA9gMBBQZzY3JpcHQECXZhbGlkRnJvbQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIJAQV2YWx1ZQEFD211bHRpc2lnQWRkcmVzcwkArAICCQCsAgIJAKwCAgkArAICAghzY3JpcHQlJQUNQ09OVFJBQ1RfVFlQRQICJSUFC3NjcmlwdEhhc2hhAgslJXZhbGlkRnJvbQIRdmFsaWRGcm9tIG5vdCBzZXQEB3ZhbGlkVG8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQEFdmFsdWUBBQ9tdWx0aXNpZ0FkZHJlc3MJAKwCAgkArAICCQCsAgIJAKwCAgIIc2NyaXB0JSUFDUNPTlRSQUNUX1RZUEUCAiUlBQtzY3JpcHRIYXNoYQIJJSV2YWxpZFRvAg92YWxpZFRvIG5vdCBzZXQEDW5vdFNhbWVTY3JpcHQDCQAAAgkA8QcBBQR0aGlzCQD2AwEFBnNjcmlwdAkAAgECFlNhbWUgc2NyaXB0LCByZWplY3RpbmcGBAVmZWVPawMJAGYCCAUDdHR4A2ZlZQCAttwFCQACAQILVG9vIGJpZyBmZWUGAwMDCQBnAgUGaGVpZ2h0BQl2YWxpZEZyb20JAGcCBQd2YWxpZFRvBQZoZWlnaHQHBQ1ub3RTYW1lU2NyaXB0BwUFZmVlT2sHBwQDb3R4BQckbWF0Y2gwBAZ0YXNrSWQJAKwCAgkArAICCQCsAgICA3R4XwkApQgBBQR0aGlzAgFfCQDYBAEIBQNvdHgCaWQECmlzQXBwcm92ZWQJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBBXZhbHVlAQUPbXVsdGlzaWdBZGRyZXNzCQCsAgIJAKwCAgkArAICCQClCAEFBHRoaXMCAV8JANgEAQgFA290eAJpZAIKX19hcHByb3ZlZAcEDGFwcHJvdmVkRnJvbQkBC3ZhbHVlT3JFbHNlAgkAmggCCQEFdmFsdWUBBQ9tdWx0aXNpZ0FkZHJlc3MJAKwCAgUGdGFza0lkAg5fX2FwcHJvdmVkRnJvbQAAAwUKaXNBcHByb3ZlZAkAZwIFBmhlaWdodAUMYXBwcm92ZWRGcm9tBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleZgG56s=", "height": 765026, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let VERSION = "PoolsLayer2-1.0.2"
5+
6+let CONTRACT_TYPE = "POOLS_LAYER2"
7+
8+let managers = [Address(base58'3M9rsXRSh9BXVUCJgVbfTL2C7jJ3FgDg6Dx'), Address(base58'3M9rsXRSh9BXVUCJgVbfTL2C7jJ3FgDg6Dx'), Address(base58'3M9rsXRSh9BXVUCJgVbfTL2C7jJ3FgDg6Dx'), Address(base58'3M9rsXRSh9BXVUCJgVbfTL2C7jJ3FgDg6Dx'), Address(base58'3M9rsXRSh9BXVUCJgVbfTL2C7jJ3FgDg6Dx')]
9+
10+func isShutdown () = match getBoolean(Address(base58'3M9rsXRSh9BXVUCJgVbfTL2C7jJ3FgDg6Dx'), "is_shutdown") {
11+ case x: Boolean =>
12+ x
13+ case _ =>
14+ false
15+}
16+
17+
18+func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
19+ then unit
20+ else fromBase58String(assetIdStr)
21+
22+
23+func getAssetString (assetId) = match assetId {
24+ case b: ByteVector =>
25+ toBase58String(value(assetId))
26+ case _ =>
27+ "WAVES"
28+}
29+
30+
31+func getTokenBalance (assetId) = match assetId {
32+ case t: ByteVector =>
33+ assetBalance(this, t)
34+ case _ =>
35+ wavesBalance(this).available
36+}
37+
38+
39+func getPoolWeightsSumm (mainAddress) = {
40+ func f (accum,item) = (accum + getIntegerValue(mainAddress, (("static_" + item) + "_weight")))
41+
42+ let assetIds = split(getStringValue(mainAddress, "static_tokenIds"), ",")
43+ let $l = assetIds
44+ let $s = size($l)
45+ let $acc0 = 0
46+ func $f0_1 ($a,$i) = if (($i >= $s))
47+ then $a
48+ else f($a, $l[$i])
49+
50+ func $f0_2 ($a,$i) = if (($i >= $s))
51+ then $a
52+ else throw("List size exceeds 10")
53+
54+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
55+ }
56+
57+
58+func addAssetBytesToList (accum,item) = (accum ++ [getAssetBytes(item)])
59+
60+
61+func whitelistEnabled () = valueOrElse(getBoolean(this, "setup_whitelistEnabled"), false)
62+
63+
64+func poolWhitelisted (address) = if (!(whitelistEnabled()))
65+ then true
66+ else {
67+ let whitelistCoordinatorStr = valueOrElse(getString(this, "setup_whitelistCoordinator"), "")
68+ let whitelistCoordinator = if ((whitelistCoordinatorStr != ""))
69+ then addressFromString(whitelistCoordinatorStr)
70+ else unit
71+ if ((whitelistCoordinator != unit))
72+ then valueOrElse(getBoolean(value(whitelistCoordinator), (address + "_poolWhitelisted")), false)
73+ else false
74+ }
75+
76+
77+@Callable(i)
78+func generateIndexWithOneTokenAndStake (mainAddressStr) = {
79+ let _validPool = if (poolWhitelisted(mainAddressStr))
80+ then true
81+ else throw((("Pool " + mainAddressStr) + " is not whitelisted"))
82+ if ((_validPool == _validPool))
83+ then {
84+ let tokenId = i.payments[0].assetId
85+ let baseAssetId = tokenId
86+ let mainAddress = Address(fromBase58String(mainAddressStr))
87+ let assetIds = {
88+ let $l = split(getStringValue(mainAddress, "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 10")
98+
99+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
100+ }
101+ let poolWeightsSumm = getPoolWeightsSumm(mainAddress)
102+ let _validSumm = if ((poolWeightsSumm == 10000))
103+ then true
104+ else throw(((("Invalid pool weights summ " + mainAddressStr) + ", summ: ") + toString(poolWeightsSumm)))
105+ if ((_validSumm == _validSumm))
106+ then {
107+ let secondaryAssetIds = removeByIndex(assetIds, value(indexOf(assetIds, tokenId)))
108+ let poolIndexId = getBinaryValue(mainAddress, "global_poolToken_id")
109+ let amount = i.payments[0].amount
110+ func handler (accum,assetId) = {
111+ let assetIdStr = getAssetString(assetId)
112+ let assetWeight = getIntegerValue(mainAddress, (("static_" + assetIdStr) + "_weight"))
113+ let _amount = fraction(amount, assetWeight, poolWeightsSumm)
114+ let in = match invoke(mainAddress, "swap", [getAssetString(assetId), 0], [AttachedPayment(baseAssetId, _amount)]) {
115+ case x: Int =>
116+ x
117+ case _ =>
118+ 0
119+ }
120+ if ((in == in))
121+ then (accum ++ [AttachedPayment(assetId, in)])
122+ else throw("Strict value is not equal to itself.")
123+ }
124+
125+ let baseAssetWeight = getIntegerValue(mainAddress, (("static_" + getAssetString(baseAssetId)) + "_weight"))
126+ let _bamount = fraction(amount, baseAssetWeight, poolWeightsSumm)
127+ let exchangeInvokes = {
128+ let $l = secondaryAssetIds
129+ let $s = size($l)
130+ let $acc0 = [AttachedPayment(baseAssetId, _bamount)]
131+ func $f1_1 ($a,$i) = if (($i >= $s))
132+ then $a
133+ else handler($a, $l[$i])
134+
135+ func $f1_2 ($a,$i) = if (($i >= $s))
136+ then $a
137+ else throw("List size exceeds 9")
138+
139+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
140+ }
141+ if ((exchangeInvokes == exchangeInvokes))
142+ then {
143+ let PIssuedAmount = match invoke(mainAddress, "generateIndex", [false], exchangeInvokes) {
144+ case x: Int =>
145+ x
146+ case _ =>
147+ 0
148+ }
149+ if ((PIssuedAmount == PIssuedAmount))
150+ then {
151+ let stakeInvoke = invoke(mainAddress, "stakeIndex", nil, [AttachedPayment(poolIndexId, PIssuedAmount)])
152+ if ((stakeInvoke == stakeInvoke))
153+ then nil
154+ else throw("Strict value is not equal to itself.")
155+ }
156+ else throw("Strict value is not equal to itself.")
157+ }
158+ else throw("Strict value is not equal to itself.")
159+ }
160+ else throw("Strict value is not equal to itself.")
161+ }
162+ else throw("Strict value is not equal to itself.")
163+ }
164+
165+
166+
167+@Callable(i)
168+func unstakeIndexAndRedeemAsOneToken (indexAmount,mainAddressStr) = {
169+ let _validPool = if (poolWhitelisted(mainAddressStr))
170+ then true
171+ else throw((("Pool " + mainAddressStr) + " is not whitelisted"))
172+ if ((_validPool == _validPool))
173+ then {
174+ let mainAddress = Address(fromBase58String(mainAddressStr))
175+ let assetIds = {
176+ let $l = split(getStringValue(mainAddress, "static_tokenIds"), ",")
177+ let $s = size($l)
178+ let $acc0 = nil
179+ func $f0_1 ($a,$i) = if (($i >= $s))
180+ then $a
181+ else addAssetBytesToList($a, $l[$i])
182+
183+ func $f0_2 ($a,$i) = if (($i >= $s))
184+ then $a
185+ else throw("List size exceeds 10")
186+
187+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
188+ }
189+ let baseAssetId = getAssetBytes(getStringValue(mainAddress, "static_baseTokenId"))
190+ let secondaryAssetIds = removeByIndex(assetIds, value(indexOf(assetIds, baseAssetId)))
191+ let poolIndexId = getBinaryValue(mainAddress, "global_poolToken_id")
192+ func foldHandler1 (accum,assetId) = (accum ++ [getTokenBalance(assetId)])
193+
194+ let balancesBefore = {
195+ let $l = assetIds
196+ let $s = size($l)
197+ let $acc0 = nil
198+ func $f1_1 ($a,$i) = if (($i >= $s))
199+ then $a
200+ else foldHandler1($a, $l[$i])
201+
202+ func $f1_2 ($a,$i) = if (($i >= $s))
203+ then $a
204+ else throw("List size exceeds 10")
205+
206+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
207+ }
208+ if ((balancesBefore == balancesBefore))
209+ then {
210+ let baseAssetBefore = getTokenBalance(baseAssetId)
211+ if ((baseAssetBefore == baseAssetBefore))
212+ then {
213+ let unstakeInvoke = invoke(mainAddress, "unstakeIndex", [indexAmount], nil)
214+ if ((unstakeInvoke == unstakeInvoke))
215+ then {
216+ let redeemInvoke = invoke(mainAddress, "redeemIndex", [false], [AttachedPayment(poolIndexId, indexAmount)])
217+ if ((redeemInvoke == redeemInvoke))
218+ then {
219+ let balancesAfter = {
220+ let $l = assetIds
221+ let $s = size($l)
222+ let $acc0 = nil
223+ func $f2_1 ($a,$i) = if (($i >= $s))
224+ then $a
225+ else foldHandler1($a, $l[$i])
226+
227+ func $f2_2 ($a,$i) = if (($i >= $s))
228+ then $a
229+ else throw("List size exceeds 10")
230+
231+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
232+ }
233+ if ((balancesAfter == balancesAfter))
234+ then {
235+ let baseAssetAfter = getTokenBalance(baseAssetId)
236+ if ((baseAssetAfter == baseAssetAfter))
237+ then {
238+ func foldHandler2 (accum,assetId) = {
239+ let assetNum = value(indexOf(assetIds, assetId))
240+ let amount = (balancesAfter[assetNum] - balancesBefore[assetNum])
241+ let in = match invoke(mainAddress, "swap", [getAssetString(baseAssetId), 0], [AttachedPayment(assetId, amount)]) {
242+ case x: Int =>
243+ x
244+ case _ =>
245+ 0
246+ }
247+ if ((in == in))
248+ then (accum + in)
249+ else throw("Strict value is not equal to itself.")
250+ }
251+
252+ let eggAmount = {
253+ let $l = secondaryAssetIds
254+ let $s = size($l)
255+ let $acc0 = 0
256+ func $f3_1 ($a,$i) = if (($i >= $s))
257+ then $a
258+ else foldHandler2($a, $l[$i])
259+
260+ func $f3_2 ($a,$i) = if (($i >= $s))
261+ then $a
262+ else throw("List size exceeds 9")
263+
264+ $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
265+ }
266+ if ((eggAmount == eggAmount))
267+ then {
268+ let _check = if (if ((0 > eggAmount))
269+ then true
270+ else (0 > (baseAssetAfter - baseAssetBefore)))
271+ then throw("Invalid amounts")
272+ else true
273+ if ((_check == _check))
274+ then [ScriptTransfer(i.caller, (eggAmount + (baseAssetAfter - baseAssetBefore)), baseAssetId)]
275+ else throw("Strict value is not equal to itself.")
276+ }
277+ else throw("Strict value is not equal to itself.")
278+ }
279+ else throw("Strict value is not equal to itself.")
280+ }
281+ else throw("Strict value is not equal to itself.")
282+ }
283+ else throw("Strict value is not equal to itself.")
284+ }
285+ else throw("Strict value is not equal to itself.")
286+ }
287+ else throw("Strict value is not equal to itself.")
288+ }
289+ else throw("Strict value is not equal to itself.")
290+ }
291+ else throw("Strict value is not equal to itself.")
292+ }
293+
294+
295+
296+@Callable(i)
297+func generateWithOneToken (mainAddressStr) = {
298+ let _validPool = if (poolWhitelisted(mainAddressStr))
299+ then true
300+ else throw((("Pool " + mainAddressStr) + " is not whitelisted"))
301+ if ((_validPool == _validPool))
302+ then {
303+ let baseAssetId = i.payments[0].assetId
304+ let mainAddress = Address(fromBase58String(mainAddressStr))
305+ let assetIds = {
306+ let $l = split(getStringValue(mainAddress, "static_tokenIds"), ",")
307+ let $s = size($l)
308+ let $acc0 = nil
309+ func $f0_1 ($a,$i) = if (($i >= $s))
310+ then $a
311+ else addAssetBytesToList($a, $l[$i])
312+
313+ func $f0_2 ($a,$i) = if (($i >= $s))
314+ then $a
315+ else throw("List size exceeds 10")
316+
317+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
318+ }
319+ let poolWeightsSumm = getPoolWeightsSumm(mainAddress)
320+ let _validSumm = if ((poolWeightsSumm == 10000))
321+ then true
322+ else throw(((("Invalid pool weights summ " + mainAddressStr) + ", summ: ") + toString(poolWeightsSumm)))
323+ if ((_validSumm == _validSumm))
324+ then {
325+ let secondaryAssetIds = removeByIndex(assetIds, value(indexOf(assetIds, baseAssetId)))
326+ let poolIndexId = getBinaryValue(mainAddress, "global_poolToken_id")
327+ let payAmount = i.payments[0].amount
328+ func handler (accum,assetId) = {
329+ let assetIdStr = getAssetString(assetId)
330+ let assetWeight = getIntegerValue(mainAddress, (("static_" + assetIdStr) + "_weight"))
331+ let amount = fraction(payAmount, assetWeight, poolWeightsSumm)
332+ let in = match invoke(mainAddress, "swap", [getAssetString(assetId), 0], [AttachedPayment(baseAssetId, amount)]) {
333+ case x: Int =>
334+ x
335+ case _ =>
336+ 0
337+ }
338+ if ((in == in))
339+ then (accum ++ [AttachedPayment(assetId, in)])
340+ else throw("Strict value is not equal to itself.")
341+ }
342+
343+ let returnFlag = false
344+ let baseAssetWeight = getIntegerValue(mainAddress, (("static_" + getAssetString(baseAssetId)) + "_weight"))
345+ let basePayAmount = fraction(payAmount, baseAssetWeight, poolWeightsSumm)
346+ let exchangeInvokes = {
347+ let $l = secondaryAssetIds
348+ let $s = size($l)
349+ let $acc0 = [AttachedPayment(baseAssetId, basePayAmount)]
350+ func $f1_1 ($a,$i) = if (($i >= $s))
351+ then $a
352+ else handler($a, $l[$i])
353+
354+ func $f1_2 ($a,$i) = if (($i >= $s))
355+ then $a
356+ else throw("List size exceeds 9")
357+
358+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
359+ }
360+ if ((exchangeInvokes == exchangeInvokes))
361+ then {
362+ let PIssuedAmount = match invoke(mainAddress, "generateIndex", [returnFlag], exchangeInvokes) {
363+ case x: Int =>
364+ x
365+ case _ =>
366+ 0
367+ }
368+ if ((PIssuedAmount == PIssuedAmount))
369+ then [ScriptTransfer(i.caller, PIssuedAmount, poolIndexId)]
370+ else throw("Strict value is not equal to itself.")
371+ }
372+ else throw("Strict value is not equal to itself.")
373+ }
374+ else throw("Strict value is not equal to itself.")
375+ }
376+ else throw("Strict value is not equal to itself.")
377+ }
378+
379+
380+
381+@Callable(i)
382+func redeemWithOneToken (mainAddressStr,outAssetIdStr) = {
383+ let _validPool = if (poolWhitelisted(mainAddressStr))
384+ then true
385+ else throw((("Pool " + mainAddressStr) + " is not whitelisted"))
386+ if ((_validPool == _validPool))
387+ then {
388+ let mainAddress = Address(fromBase58String(mainAddressStr))
389+ let assetIds = {
390+ let $l = split(getStringValue(mainAddress, "static_tokenIds"), ",")
391+ let $s = size($l)
392+ let $acc0 = nil
393+ func $f0_1 ($a,$i) = if (($i >= $s))
394+ then $a
395+ else addAssetBytesToList($a, $l[$i])
396+
397+ func $f0_2 ($a,$i) = if (($i >= $s))
398+ then $a
399+ else throw("List size exceeds 10")
400+
401+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
402+ }
403+ let baseAssetId = getAssetBytes(outAssetIdStr)
404+ let secondaryAssetIds = removeByIndex(assetIds, value(indexOf(assetIds, baseAssetId)))
405+ let poolIndexId = getBinaryValue(mainAddress, "global_poolToken_id")
406+ func foldHandler1 (accum,assetId) = (accum ++ [getTokenBalance(assetId)])
407+
408+ let returnToOrigin = false
409+ let balancesBefore = {
410+ let $l = assetIds
411+ let $s = size($l)
412+ let $acc0 = nil
413+ func $f1_1 ($a,$i) = if (($i >= $s))
414+ then $a
415+ else foldHandler1($a, $l[$i])
416+
417+ func $f1_2 ($a,$i) = if (($i >= $s))
418+ then $a
419+ else throw("List size exceeds 10")
420+
421+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
422+ }
423+ if ((balancesBefore == balancesBefore))
424+ then {
425+ let baseAssetBefore = getTokenBalance(baseAssetId)
426+ if ((baseAssetBefore == baseAssetBefore))
427+ then {
428+ let unstakeInvoke = invoke(mainAddress, "redeemIndex", [returnToOrigin], [i.payments[0]])
429+ if ((unstakeInvoke == unstakeInvoke))
430+ then {
431+ let balancesAfter = {
432+ let $l = assetIds
433+ let $s = size($l)
434+ let $acc0 = nil
435+ func $f2_1 ($a,$i) = if (($i >= $s))
436+ then $a
437+ else foldHandler1($a, $l[$i])
438+
439+ func $f2_2 ($a,$i) = if (($i >= $s))
440+ then $a
441+ else throw("List size exceeds 10")
442+
443+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
444+ }
445+ if ((balancesAfter == balancesAfter))
446+ then {
447+ let baseAssetAfter = getTokenBalance(baseAssetId)
448+ if ((baseAssetAfter == baseAssetAfter))
449+ then {
450+ func foldHandler2 (accum,assetId) = {
451+ let assetNum = value(indexOf(assetIds, assetId))
452+ let amount = (balancesAfter[assetNum] - balancesBefore[assetNum])
453+ let in = if ((assetId == baseAssetId))
454+ then amount
455+ else match invoke(mainAddress, "swap", [getAssetString(baseAssetId), 0], [AttachedPayment(assetId, amount)]) {
456+ case x: Int =>
457+ x
458+ case _ =>
459+ 0
460+ }
461+ if ((in == in))
462+ then (accum + in)
463+ else throw("Strict value is not equal to itself.")
464+ }
465+
466+ let out = {
467+ let $l = assetIds
468+ let $s = size($l)
469+ let $acc0 = 0
470+ func $f3_1 ($a,$i) = if (($i >= $s))
471+ then $a
472+ else foldHandler2($a, $l[$i])
473+
474+ func $f3_2 ($a,$i) = if (($i >= $s))
475+ then $a
476+ else throw("List size exceeds 10")
477+
478+ $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
479+ }
480+ if ((out == out))
481+ then [ScriptTransfer(i.caller, out, baseAssetId)]
482+ else throw("Strict value is not equal to itself.")
483+ }
484+ else throw("Strict value is not equal to itself.")
485+ }
486+ else throw("Strict value is not equal to itself.")
487+ }
488+ else throw("Strict value is not equal to itself.")
489+ }
490+ else throw("Strict value is not equal to itself.")
491+ }
492+ else throw("Strict value is not equal to itself.")
493+ }
494+ else throw("Strict value is not equal to itself.")
495+ }
496+
497+
498+
499+@Callable(i)
500+func generateIndexAndStake (mainAddressStr) = {
501+ let _validPool = if (poolWhitelisted(mainAddressStr))
502+ then true
503+ else throw((("Pool " + mainAddressStr) + " is not whitelisted"))
504+ if ((_validPool == _validPool))
505+ then {
506+ let mainAddress = Address(fromBase58String(mainAddressStr))
507+ let assetIds = {
508+ let $l = split(getStringValue(mainAddress, "static_tokenIds"), ",")
509+ let $s = size($l)
510+ let $acc0 = nil
511+ func $f0_1 ($a,$i) = if (($i >= $s))
512+ then $a
513+ else addAssetBytesToList($a, $l[$i])
514+
515+ func $f0_2 ($a,$i) = if (($i >= $s))
516+ then $a
517+ else throw("List size exceeds 10")
518+
519+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
520+ }
521+ let baseAssetId = getAssetBytes(getStringValue(mainAddress, "static_baseTokenId"))
522+ let secondaryAssetIds = removeByIndex(assetIds, value(indexOf(assetIds, baseAssetId)))
523+ let poolIndexId = getBinaryValue(mainAddress, "global_poolToken_id")
524+ let PIssuedAmount = match invoke(mainAddress, "generateIndex", [true], i.payments) {
525+ case x: Int =>
526+ x
527+ case _ =>
528+ 0
529+ }
530+ if ((PIssuedAmount == PIssuedAmount))
531+ then {
532+ let stakeInvoke = invoke(mainAddress, "stakeIndex", nil, [AttachedPayment(poolIndexId, PIssuedAmount)])
533+ if ((stakeInvoke == stakeInvoke))
534+ then nil
535+ else throw("Strict value is not equal to itself.")
536+ }
537+ else throw("Strict value is not equal to itself.")
538+ }
539+ else throw("Strict value is not equal to itself.")
540+ }
541+
542+
543+
544+@Callable(i)
545+func unstakeAndRedeemIndex (amount,mainAddressStr) = {
546+ let _validPool = if (poolWhitelisted(mainAddressStr))
547+ then true
548+ else throw((("Pool " + mainAddressStr) + " is not whitelisted"))
549+ if ((_validPool == _validPool))
550+ then {
551+ let mainAddress = Address(fromBase58String(mainAddressStr))
552+ let assetIds = {
553+ let $l = split(getStringValue(mainAddress, "static_tokenIds"), ",")
554+ let $s = size($l)
555+ let $acc0 = nil
556+ func $f0_1 ($a,$i) = if (($i >= $s))
557+ then $a
558+ else addAssetBytesToList($a, $l[$i])
559+
560+ func $f0_2 ($a,$i) = if (($i >= $s))
561+ then $a
562+ else throw("List size exceeds 10")
563+
564+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
565+ }
566+ let baseAssetId = getAssetBytes(getStringValue(mainAddress, "static_baseTokenId"))
567+ let secondaryAssetIds = removeByIndex(assetIds, value(indexOf(assetIds, baseAssetId)))
568+ let poolIndexId = getBinaryValue(mainAddress, "global_poolToken_id")
569+ let unstakeInvoke = invoke(mainAddress, "unstakeIndex", [amount], i.payments)
570+ if ((unstakeInvoke == unstakeInvoke))
571+ then {
572+ let redeemInvoke = invoke(mainAddress, "redeemIndex", [true], [AttachedPayment(poolIndexId, amount)])
573+ if ((redeemInvoke == redeemInvoke))
574+ then nil
575+ else throw("Strict value is not equal to itself.")
576+ }
577+ else throw("Strict value is not equal to itself.")
578+ }
579+ else throw("Strict value is not equal to itself.")
580+ }
581+
582+
583+
584+@Callable(i)
585+func setWhitelistCoordinator (coordinator) = if ((indexOf(managers, i.caller) == unit))
586+ then throw("admin only")
587+ else {
588+ let address = addressFromString(coordinator)
589+ if ((address == unit))
590+ then throw("invalid address")
591+ else [StringEntry("setup_whitelistCoordinator", coordinator)]
592+ }
593+
594+
595+
596+@Callable(i)
597+func setWhitelistEnabled (val) = if ((indexOf(managers, i.caller) == unit))
598+ then throw("admin only")
599+ else {
600+ let whitelistCoordinatorStr = valueOrElse(getString(this, "setup_whitelistCoordinator"), "")
601+ let whitelistCoordinator = if ((whitelistCoordinatorStr != ""))
602+ then addressFromString(whitelistCoordinatorStr)
603+ else unit
604+ if (if ((whitelistCoordinator == unit))
605+ then val
606+ else false)
607+ then throw("set whitelist coordinator first")
608+ else [BooleanEntry("setup_whitelistEnabled", val)]
609+ }
610+
611+
612+@Verifier(tx)
613+func verify () = {
614+ let multisigStr = valueOrElse(getString("APPROVER_ADDRESS"), "")
615+ let multisigAddress = addressFromString(multisigStr)
616+ let multisigOk = match multisigAddress {
617+ case t: Address =>
618+ true
619+ case _ =>
620+ false
621+ }
622+ let isInited = if (multisigOk)
623+ then valueOrElse(getBoolean(value(multisigAddress), "INITED"), false)
624+ else false
625+ let hasAdmins = if (multisigOk)
626+ then (valueOrElse(getString(value(multisigAddress), "ADMINS_PBKS"), "") != "")
627+ else false
628+ if (if (if (multisigOk)
629+ then isInited
630+ else false)
631+ then hasAdmins
632+ else false)
633+ then match tx {
634+ case ttx: SetScriptTransaction =>
635+ match ttx.script {
636+ case script: ByteVector =>
637+ let scriptHasha = toBase58String(blake2b256(script))
638+ let validFrom = valueOrErrorMessage(getInteger(value(multisigAddress), (((("script%%" + CONTRACT_TYPE) + "%%") + scriptHasha) + "%%validFrom")), "validFrom not set")
639+ let validTo = valueOrErrorMessage(getInteger(value(multisigAddress), (((("script%%" + CONTRACT_TYPE) + "%%") + scriptHasha) + "%%validTo")), "validTo not set")
640+ let notSameScript = if ((scriptHash(this) == blake2b256(script)))
641+ then throw("Same script, rejecting")
642+ else true
643+ let feeOk = if ((ttx.fee > 12000000))
644+ then throw("Too big fee")
645+ else true
646+ if (if (if ((height >= validFrom))
647+ then (validTo >= height)
648+ else false)
649+ then notSameScript
650+ else false)
651+ then feeOk
652+ else false
653+ case _ =>
654+ false
655+ }
656+ case otx =>
657+ let taskId = ((("tx_" + toString(this)) + "_") + toBase58String(otx.id))
658+ let isApproved = valueOrElse(getBoolean(value(multisigAddress), (((toString(this) + "_") + toBase58String(otx.id)) + "__approved")), false)
659+ let approvedFrom = valueOrElse(getInteger(value(multisigAddress), (taskId + "__approvedFrom")), 0)
660+ if (isApproved)
661+ then (height >= approvedFrom)
662+ else false
663+ }
664+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
665+ }
666+

github/deemru/w8io
46.38 ms