2023.05.03 14:23 [3627116] smart account 3PDB1pdcw6fPCM1WsFmx9VAidTyMouYERC1 > SELF 0.00000000 Waves

{ "type": 13, "id": "Bou7LM8zUBziSmHzxB5BMLw8nVZvmSwQG8fQeAwhQsPJ", "fee": 2600000, "feeAssetId": null, "timestamp": 1683113139377, "version": 2, "chainId": 87, "sender": "3PDB1pdcw6fPCM1WsFmx9VAidTyMouYERC1", "senderPublicKey": "FAdS85KG2ee4mAB8XCDybKpFu79txSRTHQHTFzHcULDn", "proofs": [ "4BLFYeb1MZJVSnqJDyqmPZ5uGSH7QS1USpXPRFyKqCAGy3vdJtMmy8VM6rH9cWDgTcHREkmWGqkhU6BUQH4yzish" ], "script": "base64:BgJCCAISBQoDCAgBEgASBgoECAgICBIDCgEIEgQKAggBEgMKAQQSABIDCgEBEgQKAggBEgUKAwQBCBIAEgcKBQgBAQgIMQAJc3RhcnRUc01zAOjnjqzyMAEXY2FsY3VsYXRlRGF5c1NpbmNlU3RhcnQABARkaWZmCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFCXN0YXJ0VHNNcwQKZGF5c1Bhc3NlZAkAaQIFBGRpZmYJAGgCAICjBQDoBwUKZGF5c1Bhc3NlZAEKYXNJbnRUdXBsZQEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACCihJbnQsIEludCkEA2ludAUHJG1hdGNoMAUDaW50CQACAQIfV3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IFR1cGxlIEludAEQZ2V0T3JhY2xlQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwINc3RhdGljX29yYWNsZQIRb3JhY2xlIG5vdCBmb3VuZCECFmNvdWxkIG5vdCBwYXJzZSBvcmFjbGUBDmdldEZlZXNBY2NvdW50AAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJARBnZXRPcmFjbGVBZGRyZXNzAAIUc3RhdGljX2ZlZUFnZ3JlZ2F0b3ICH3N0YXRpY19mZWVBZ2dyZWdhdG9yIG5vdCBmb3VuZCEBDmdldE5vZGVBY2NvdW50AAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJARBnZXRPcmFjbGVBZGRyZXNzAAISc3RhdGljX25vZGVBZGRyZXNzAhdub2RlX2FkZHJlc3Mgbm90IGZvdW5kIQENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAEMdHJ5R2V0QmluYXJ5AQNrZXkEByRtYXRjaDAJAJwIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAFAWIBAAEMdHJ5R2V0U3RyaW5nAQNrZXkEByRtYXRjaDAJAJ0IAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYgUHJG1hdGNoMAUBYgIAAQ5nZXRBc3NldFN0cmluZwEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWICBVdBVkVTAQ1nZXRBc3NldEJ5dGVzAQphc3NldElkU3RyAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTBQR1bml0CQDZBAEFCmFzc2V0SWRTdHIBE2FkZEFzc2V0Qnl0ZXNUb0xpc3QCBWFjY3VtBGl0ZW0JAM4IAgUFYWNjdW0JAMwIAgkBDWdldEFzc2V0Qnl0ZXMBBQRpdGVtBQNuaWwBFGFkZEFzc2V0V2VpZ2h0VG9MaXN0AgVhY2N1bQRpdGVtCQDOCAIFBWFjY3VtCQDMCAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB3N0YXRpY18JAQ5nZXRBc3NldFN0cmluZwEFBGl0ZW0CB193ZWlnaHQFA25pbAEWYWRkQXNzZXREZWNpbWFsc1RvTGlzdAIFYWNjdW0EaXRlbQkAzggCBQVhY2N1bQkAzAgCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdzdGF0aWNfCQEOZ2V0QXNzZXRTdHJpbmcBBQRpdGVtAglfZGVjaW1hbHMFA25pbAETYWRkQXNzZXRTY2FsZVRvTGlzdAIFYWNjdW0EaXRlbQkAzggCBQVhY2N1bQkAzAgCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdzdGF0aWNfCQEOZ2V0QXNzZXRTdHJpbmcBBQRpdGVtAgZfc2NhbGUFA25pbAEMYWRkSW50VG9MaXN0AgVhY2N1bQRpdGVtCQDOCAIFBWFjY3VtCQDMCAIJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQUDbmlsARRyZXZlbmV1Rm9yRGF5QnlBc3NldAIDZGF5B2Fzc2V0SWQJAKwCAgkArAICCQCsAgICDHJldmVuZXVfZGF5XwUHYXNzZXRJZAIBXwkApAMBBQNkYXkAAVQJAQ10cnlHZXRJbnRlZ2VyAQITc3RhdGljX3Rva2Vuc0Ftb3VudAAIYXNzZXRJZHMKAAIkbAkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIPc3RhdGljX3Rva2VuSWRzAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARNhZGRBc3NldEJ5dGVzVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAA1Bc3NldHNXZWlnaHRzCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARRhZGRBc3NldFdlaWdodFRvTGlzdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAIRGVjaW1hbHMKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjJfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBFmFkZEFzc2V0RGVjaW1hbHNUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjJfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjJfMgIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIFBSRhY2MwAAAAAQACAAMABlNjYWxlcwoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmM18xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQETYWRkQXNzZXRTY2FsZVRvTGlzdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmM18yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmM18yAgkBBSRmM18xAgkBBSRmM18xAgkBBSRmM18xAgUFJGFjYzAAAAABAAIAAwAHc3Rha2VJZAkBDHRyeUdldFN0cmluZwECDWxhc3Rfc3Rha2VfaWQAA0ZlZQkBDXRyeUdldEludGVnZXIBAgpzdGF0aWNfZmVlABVBc3NldHNXZWlnaHRzRGVjaW1hbHMAAgAFU2NhbGUAkE4ABlNjYWxlOACAwtcvAAhGZWVTY2FsZQCQTgARUG9vbFRva2VuRGVjaW1hbHMACAAOUG9vbFRva2VuU2NhbGUJAGwGAAoAAAURUG9vbFRva2VuRGVjaW1hbHMAAAAABQZIQUxGVVAADGVhcm5lZEFzc2V0cwUIYXNzZXRJZHMBCmlzU2h1dGRvd24ABAhzaHV0ZG93bgMJAQIhPQIJAQx0cnlHZXRTdHJpbmcBAg1zdGF0aWNfb3JhY2xlAgAEByRtYXRjaDAJAJsIAgkBEGdldE9yYWNsZUFkZHJlc3MAAgxhbW1fc2h1dGRvd24DCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBeAUHJG1hdGNoMAUBeAcHBAlzaHV0ZG93bjIEByRtYXRjaDAJAJsIAgUEdGhpcwILaXNfc2h1dGRvd24DCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBeAUHJG1hdGNoMAUBeAcDBQhzaHV0ZG93bgYFCXNodXRkb3duMgEJY2FuVXBkYXRlAAMJAQIhPQIJAQx0cnlHZXRTdHJpbmcBAg1zdGF0aWNfb3JhY2xlAgAEByRtYXRjaDAJAJsIAgkBEGdldE9yYWNsZUFkZHJlc3MAAgZhbW1fdHgDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBeAUHJG1hdGNoMAUBeAYGARZnZXRDdXJyZW50VG9rZW5CYWxhbmNlAQl0b2tlblR5cGUEB3Rva2VuSWQJAQ5nZXRBc3NldFN0cmluZwEJAJEDAgUIYXNzZXRJZHMFCXRva2VuVHlwZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwUHdG9rZW5JZAIIX2JhbGFuY2UBEGNhbGN1bGF0ZVBJc3N1ZWQCBmFtb3VudAd0b2tlbklkBAdQc3VwcGx5CQENdHJ5R2V0SW50ZWdlcgECF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50BAdCYWxhbmNlCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAghfYmFsYW5jZQkAbgQFBmFtb3VudAUHUHN1cHBseQUHQmFsYW5jZQUERE9XTgENZ2V0TWluUElzc3VlZAEIcGF5bWVudHMKAQdoYW5kbGVyAgVhY2N1bQdjdXJyZW50BAdQSXNzdWVkCQEQY2FsY3VsYXRlUElzc3VlZAIIBQdjdXJyZW50BmFtb3VudAgFB2N1cnJlbnQHYXNzZXRJZAMJAAACBQdQSXNzdWVkAAAJAAIBAiRvbmUgb2YgdGhlIHRva2VucyBhbW91bnRzIGlzIHRvbyBsb3cDAwkAAAIFBWFjY3VtAAAGCQBmAgUFYWNjdW0FB1BJc3N1ZWQFB1BJc3N1ZWQFBWFjY3VtBAltaW5QSXNzZWQKAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2hhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjRfMgIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIFBSRhY2MwAAAAAQACAAMFCW1pblBJc3NlZAETY2hlY2tUb2tlbnNWYWxpZGl0eQEIcGF5bWVudHMKAQhoYW5kbGVyMQIFYWNjdW0HcGF5bWVudAkAzggCBQVhY2N1bQkAzAgCCAUHcGF5bWVudAdhc3NldElkBQNuaWwEA2lkcwoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmNF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIaGFuZGxlcjECBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjRfMgIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIFBSRhY2MwAAAAAQACAAMDCQAAAgUDaWRzBQNpZHMKAQhoYW5kbGVyMgIFYWNjdW0HYXNzZXRJZAMJAQIhPQIJAM8IAgUDaWRzBQdhc3NldElkBQR1bml0CQBkAgUFYWNjdW0AAQkAAgEJAKwCAgIUYXNzZXQgbm90IGF0dGFjaGVkOiAJAQ5nZXRBc3NldFN0cmluZwEFB2Fzc2V0SWQEBmNoZWNrcwoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmNV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIaGFuZGxlcjICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjVfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjVfMgIJAQUkZjVfMQIJAQUkZjVfMQIJAQUkZjVfMQIFBSRhY2MwAAAAAQACAAMDCQAAAgUGY2hlY2tzBQZjaGVja3MGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxzdGFrZVVuc3Rha2UDBXN0YWtlBmFtb3VudAdhc3NldElkAwMJAAACBQdhc3NldElkAgVXQVZFUwkAZgIFBmFtb3VudAAABwQNbGVhc2luZ0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg5sZWFzaW5nX2Ftb3VudAAABA5uZXdMZWFzZUFtb3VudAMFBXN0YWtlCQBkAgUNbGVhc2luZ0Ftb3VudAUGYW1vdW50CQBlAgUNbGVhc2luZ0Ftb3VudAUGYW1vdW50BAhuZXdMZWFzZQkAxAgCCQEOZ2V0Tm9kZUFjY291bnQABQ5uZXdMZWFzZUFtb3VudAQKbmV3TGVhc2VJZAkAuQgBBQhuZXdMZWFzZQQEZGF0YQkAzAgCBQhuZXdMZWFzZQkAzAgCCQELU3RyaW5nRW50cnkCAg1sYXN0X3N0YWtlX2lkCQDYBAEFCm5ld0xlYXNlSWQJAMwIAgkBDEludGVnZXJFbnRyeQICDmxlYXNpbmdfYW1vdW50BQ5uZXdMZWFzZUFtb3VudAUDbmlsAwkBAiE9AgUHc3Rha2VJZAIACQDOCAIJAMwIAgkBC0xlYXNlQ2FuY2VsAQkA2QQBBQdzdGFrZUlkBQNuaWwFBGRhdGEFBGRhdGEFA25pbAETaGFuZGxlUG9vbFRva2Vuc0FkZAQHUElzc3VlZAhwYXltZW50cwt1c2VyQWRkcmVzcwpuZWVkQ2hhbmdlCgEVZ2V0VG9rZW5QYXltZW50QW1vdW50AQd0b2tlbklkCgEHaGFuZGxlcgIFYWNjdW0HcGF5bWVudAMJAAACCAUHcGF5bWVudAdhc3NldElkBQd0b2tlbklkCAUHcGF5bWVudAZhbW91bnQFBWFjY3VtCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdoYW5kbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADCgERaGFuZGxlVG9rZW5DaGFuZ2UCBWFjY3VtB3Rva2VuSWQEAkJrCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAghfYmFsYW5jZQQHUFN1cHBseQkBDXRyeUdldEludGVnZXIBAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAQNdG9rZW5EZWNpbWFscwkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAIGX3NjYWxlBAZEa1RlbXAJAG4ECQBlAgkAbgQJAGQCBQdQU3VwcGx5BQdQSXNzdWVkBQ10b2tlbkRlY2ltYWxzBQdQU3VwcGx5BQdDRUlMSU5HBQ10b2tlbkRlY2ltYWxzBQJCawUNdG9rZW5EZWNpbWFscwUHQ0VJTElORwQNcGF5bWVudEFtb3VudAkBFWdldFRva2VuUGF5bWVudEFtb3VudAEFB3Rva2VuSWQEAkRrCQCXAwEJAMwIAgUGRGtUZW1wCQDMCAIFDXBheW1lbnRBbW91bnQFA25pbAQIdG9SZXR1cm4JAGUCAwkBAiE9AgUNcGF5bWVudEFtb3VudAAABQ1wYXltZW50QW1vdW50AAAFAkRrBAF0AwMFCm5lZWRDaGFuZ2UJAGYCBQh0b1JldHVybgAABwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUIdG9SZXR1cm4FB3Rva2VuSWQFA25pbAUDbmlsBBBzdGFrZVVuc3Rha2VEYXRhAwkAAAIJAQ5nZXRBc3NldFN0cmluZwEFB3Rva2VuSWQCBVdBVkVTCQEMc3Rha2VVbnN0YWtlAwYFAkRrAgVXQVZFUwUDbmlsBA1jaGFuZ2VCYWxhbmNlCQD8BwQFBHRoaXMCDXVwZGF0ZUJhbGFuY2UJAMwIAgkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAkAzAgCCQBkAgUCQmsFAkRrBQNuaWwFA25pbAMJAAACBQ1jaGFuZ2VCYWxhbmNlBQ1jaGFuZ2VCYWxhbmNlCQDOCAIJAM4IAgUFYWNjdW0FAXQFEHN0YWtlVW5zdGFrZURhdGEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4KAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWhhbmRsZVRva2VuQ2hhbmdlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADARZoYW5kbGVQb29sVG9rZW5zUmVkZWVtAglQUmVkZWVtZWQLdXNlckFkZHJlc3MKARFoYW5kbGVUb2tlblJlZGVlbQIFYWNjdW0HdG9rZW5JZAQCQmsJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEFB3Rva2VuSWQCCF9iYWxhbmNlBAdQU3VwcGx5CQENdHJ5R2V0SW50ZWdlcgECF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50BA10b2tlbkRlY2ltYWxzCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdzdGF0aWNfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAgZfc2NhbGUEBmFtb3VudAkAoAMBCQC9AgQJALgCAgkAtgIBBQZTY2FsZTgJAL0CBAkAtgIBCQBlAgUHUFN1cHBseQUJUFJlZGVlbWVkCQC2AgEFBlNjYWxlOAkAtgIBBQdQU3VwcGx5BQdDRUlMSU5HCQC2AgEFAkJrCQC2AgEFBlNjYWxlOAUERE9XTgQQc3Rha2VVbnN0YWtlRGF0YQMJAAACCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAgVXQVZFUwkBDHN0YWtlVW5zdGFrZQMHBQZhbW91bnQCBVdBVkVTBQNuaWwJAM4IAgkAzggCBQVhY2N1bQUQc3Rha2VVbnN0YWtlRGF0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEFB3Rva2VuSWQCCF9iYWxhbmNlCQBlAgUCQmsFBmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUGYW1vdW50BQd0b2tlbklkBQNuaWwKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWhhbmRsZVRva2VuUmVkZWVtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADARJjYWxjdWxhdGVPdXRBbW91bnQFCEFtb3VudEluB2Fzc2V0SW4IYXNzZXRPdXQJQmFsYW5jZUluCkJhbGFuY2VPdXQEB0luZGV4SW4JAQV2YWx1ZQEJAM8IAgUIYXNzZXRJZHMFB2Fzc2V0SW4ECEluZGV4T3V0CQEFdmFsdWUBCQDPCAIFCGFzc2V0SWRzBQhhc3NldE91dAMJAAACBQdJbmRleEluBQhJbmRleE91dAkAAgECEXdyb25nIHRva2VucyBwYWlyCQBuBAUKQmFsYW5jZU91dAkAZQIJAGgCBQZTY2FsZTgFBlNjYWxlOAkAoAMBCQB2BgkAvQIECQC2AgEFCUJhbGFuY2VJbgkAtgIBCQBoAgUGU2NhbGU4BQZTY2FsZTgJALYCAQkAZAIFCUJhbGFuY2VJbgUIQW1vdW50SW4FBkhBTEZVUAAQCQC2AgEJAGsDCQCRAwIFDUFzc2V0c1dlaWdodHMFB0luZGV4SW4AkE4JAJEDAgUNQXNzZXRzV2VpZ2h0cwUISW5kZXhPdXQABAAQBQdDRUlMSU5HCQBoAgUGU2NhbGU4BQZTY2FsZTgFBERPV04BEWNhbGN1bGF0ZU1pblRvR2V0AwZhc3NldDEGYXNzZXQyDGFtb3VudFRvU3dhcAQJa0JhbGFuY2VBCQCsAgIJAKwCAgIHZ2xvYmFsXwUGYXNzZXQxAghfYmFsYW5jZQQPQV9hc3NldF9iYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQlrQmFsYW5jZUEECWtCYWxhbmNlQgkArAICCQCsAgICB2dsb2JhbF8FBmFzc2V0MgIIX2JhbGFuY2UED0JfYXNzZXRfYmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUJa0JhbGFuY2VCBAV0b0dldAkBEmNhbGN1bGF0ZU91dEFtb3VudAUFDGFtb3VudFRvU3dhcAkBDWdldEFzc2V0Qnl0ZXMBBQZhc3NldDEJAQ1nZXRBc3NldEJ5dGVzAQUGYXNzZXQyBQ9BX2Fzc2V0X2JhbGFuY2UFD0JfYXNzZXRfYmFsYW5jZQQJZmVlQW1vdW50CQBrAwUFdG9HZXQFA0ZlZQUIRmVlU2NhbGUDCQAAAgUJZmVlQW1vdW50BQlmZWVBbW91bnQEDmNsZWFuQW1vdW50T3V0CQBlAgUFdG9HZXQFCWZlZUFtb3VudAMJAAACBQ5jbGVhbkFtb3VudE91dAUOY2xlYW5BbW91bnRPdXQFDmNsZWFuQW1vdW50T3V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ9nZXRUb2tlbkJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBdAUHJG1hdGNoMAkA8AcCBQR0aGlzBQF0CAkA7wcBBQR0aGlzB3JlZ3VsYXIBHWNhbGN1bGF0ZUN1cnJlbnRBc3NldEludGVyZXN0BAdhc3NldElkCmFzc2V0SWRTdHIIYUJhbGFuY2UWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawQLdG90YWxTdGFrZWQJAQ10cnlHZXRJbnRlZ2VyAQISZ2xvYmFsX2luZGV4U3Rha2VkBBV0b2tlbkJhbGFuY2VMYXN0Q2hlY2sFFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sEE2N1cnJlbnRCYWxhbmNlRGVsdGEJAGUCCQEPZ2V0VG9rZW5CYWxhbmNlAQUHYXNzZXRJZAUIYUJhbGFuY2UEFGN1cnJlbnRUb2tlbkVhcm5pbmdzAwkAZgIFE2N1cnJlbnRCYWxhbmNlRGVsdGEFFXRva2VuQmFsYW5jZUxhc3RDaGVjawUTY3VycmVudEJhbGFuY2VEZWx0YQUVdG9rZW5CYWxhbmNlTGFzdENoZWNrBAtuZXdFYXJuaW5ncwkAZQIFFGN1cnJlbnRUb2tlbkVhcm5pbmdzBRV0b2tlbkJhbGFuY2VMYXN0Q2hlY2sEC25ld0ludGVyZXN0AwkAAAIFC3RvdGFsU3Rha2VkAAAAAAkAawMFC25ld0Vhcm5pbmdzBQZTY2FsZTgFC3RvdGFsU3Rha2VkBBFsYXN0Q2hlY2tJbnRlcmVzdAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIRZ2xvYmFsX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9pbnRlcmVzdAkAZAIFEWxhc3RDaGVja0ludGVyZXN0BQtuZXdJbnRlcmVzdAELY2xhaW1SZXN1bHQBB2FkZHJlc3MECmFkZHJlc3NTdHIJAKUIAQUHYWRkcmVzcwQLc2hhcmVBbW91bnQJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQKAQdoYW5kbGVyAgVhY2N1bQdhc3NldElkBAphc3NldElkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBBQdhc3NldElkBAhhQmFsYW5jZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwkBDmdldEFzc2V0U3RyaW5nAQUHYXNzZXRJZAIIX2JhbGFuY2UEFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICEWdsb2JhbF9sYXN0Q2hlY2tfBQphc3NldElkU3RyAglfZWFybmluZ3MEFGN1cnJlbnRUb2tlbkludGVyZXN0CQEdY2FsY3VsYXRlQ3VycmVudEFzc2V0SW50ZXJlc3QEBQdhc3NldElkBQphc3NldElkU3RyBQhhQmFsYW5jZQUWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawQUY3VycmVudFRva2VuRWFybmluZ3MJAJYDAQkAzAgCBRZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrCQDMCAIJAGUCCQEPZ2V0VG9rZW5CYWxhbmNlAQUHYXNzZXRJZAUIYUJhbGFuY2UFA25pbAQMcmV3YXJkQW1vdW50CQBrAwULc2hhcmVBbW91bnQJAGUCBRRjdXJyZW50VG9rZW5JbnRlcmVzdAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICBQphZGRyZXNzU3RyAgtfbGFzdENoZWNrXwUKYXNzZXRJZFN0cgIJX2ludGVyZXN0BQZTY2FsZTgECHRyYW5zZmVyAwkAAAIFDHJld2FyZEFtb3VudAAABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUHYWRkcmVzcwUMcmV3YXJkQW1vdW50BQdhc3NldElkBQNuaWwEB2NsYWltZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgUKYWRkcmVzc1N0cgILX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCF9jbGFpbWVkCQDOCAIJAM4IAgUFYWNjdW0FCHRyYW5zZmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIRZ2xvYmFsX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9lYXJuaW5ncwkAZQIFFGN1cnJlbnRUb2tlbkVhcm5pbmdzBQxyZXdhcmRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAhFnbG9iYWxfbGFzdENoZWNrXwUKYXNzZXRJZFN0cgIJX2ludGVyZXN0BRRjdXJyZW50VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUKYWRkcmVzc1N0cgILX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9pbnRlcmVzdAUUY3VycmVudFRva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFCmFkZHJlc3NTdHICC19sYXN0Q2hlY2tfBQphc3NldElkU3RyAghfY2xhaW1lZAkAZAIFB2NsYWltZWQFDHJld2FyZEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCAgVERUJVRwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBkRFQlVHXwkApAMBBRRjdXJyZW50VG9rZW5FYXJuaW5ncwIBIAkApAMBBRRjdXJyZW50VG9rZW5JbnRlcmVzdAIBIAkApAMBBQxyZXdhcmRBbW91bnQCASAFCmFzc2V0SWRTdHICASAJAKQDAQUIYUJhbGFuY2UCASAJAKQDAQUWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawUDbmlsBAVhY2N1bQoAAiRsBQxlYXJuZWRBc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2hhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjRfMgIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIFBSRhY2MwAAAAAQACAAMJAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYWRkcmVzc1N0cgIKX2xhc3RDbGFpbQgFCWxhc3RCbG9jawl0aW1lc3RhbXAFA25pbAEQaW5kZXhTdGFrZVJlc3VsdAIKYWRkcmVzc1N0cgZhbW91bnQEAmxpCQELY2xhaW1SZXN1bHQBCQERQGV4dHJOYXRpdmUoMTA2MikBBQphZGRyZXNzU3RyCQDOCAIFAmxpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFkZHJlc3NTdHICDF9pbmRleFN0YWtlZAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgISZ2xvYmFsX2luZGV4U3Rha2VkCQBkAgkBDXRyeUdldEludGVnZXIBAhJnbG9iYWxfaW5kZXhTdGFrZWQFBmFtb3VudAUDbmlsAQNzdW0CBWFjY3VtAW4JAGQCBQVhY2N1bQkBDXBhcnNlSW50VmFsdWUBBQFuARtzZXRPcmFjbGVBZGRyZXNzQW5kSW5pdGlhdGUBB2FkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgINc3RhdGljX29yYWNsZQUHYWRkcmVzcwUDbmlsAQlpc1Rlc3RFbnYABAd0ZXN0ZW52BAckbWF0Y2gwCQCbCAIFBHRoaXMCB1RFU1RFTlYDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBeAUHJG1hdGNoMAUBeAcFB3Rlc3RlbnYMAWkBDHJlYWRPbmx5RnVuYwMGYXNzZXQxBmFzc2V0MgxhbW91bnRUb1N3YXAECWFtb3VudE91dAkBEWNhbGN1bGF0ZU1pblRvR2V0AwUGYXNzZXQxBQZhc3NldDIFDGFtb3VudFRvU3dhcAkAzAgCCQEMSW50ZWdlckVudHJ5AgIFREVCVUcFCWFtb3VudE91dAUDbmlsAWkBCnRvcFVwRnVuZHMAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIYV3JvbmcgcGF5bWVudHMgYXR0YWNoZWQhBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEBWFzc2V0CAUHcGF5bWVudAdhc3NldElkAwkAAAIJAM8IAgUIYXNzZXRJZHMFBWFzc2V0BQR1bml0CQACAQIVTm90IHN1cHBvcnRlZCBhc3NldElkBAZhbW91bnQIBQdwYXltZW50BmFtb3VudAQIYUJhbGFuY2UJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEFBWFzc2V0AghfYmFsYW5jZQQDZGF5CQEXY2FsY3VsYXRlRGF5c1NpbmNlU3RhcnQABAdyZXZlbmV1CQENdHJ5R2V0SW50ZWdlcgEJARRyZXZlbmV1Rm9yRGF5QnlBc3NldAIFA2RheQkBDmdldEFzc2V0U3RyaW5nAQUFYXNzZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQVhc3NldAIIX2JhbGFuY2UJAGQCBQhhQmFsYW5jZQUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5kYXlzX3NpbmNlX2FweQUDZGF5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUcmV2ZW5ldUZvckRheUJ5QXNzZXQCBQNkYXkJAQ5nZXRBc3NldFN0cmluZwEFBWFzc2V0CQBkAgUHcmV2ZW5ldQUGYW1vdW50BQNuaWwBaQEHcHJlSW5pdAQLYXNzZXRJZHNTdHIPYXNzZXRXZWlnaHRzU3RyDmJhc2VUb2tlbklkU3RyCnBvb2xEb21haW4DCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAgphZG1pbiBvbmx5AwkAZgIJALECAQUKcG9vbERvbWFpbgANCQACAQIVdG9vIGxhcmdlIHBvb2wgZG9tYWluBA1hc3NldElkc1N0ckxpCQC1CQIFC2Fzc2V0SWRzU3RyAgEsBAphc3NldElkc0xpCgACJGwFDWFzc2V0SWRzU3RyTGkKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBE2FkZEFzc2V0Qnl0ZXNUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjRfMgIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIFBSRhY2MwAAAAAQACAAMEEWFzc2V0V2VpZ2h0c1N0ckxpCQC1CQIFD2Fzc2V0V2VpZ2h0c1N0cgIBLAQPYXNzZXRXZWlnaHRzU3VtCgACJGwFEWFzc2V0V2VpZ2h0c1N0ckxpCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGY1XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNzdW0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjVfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjVfMgIJAQUkZjVfMQIJAQUkZjVfMQIJAQUkZjVfMQIFBSRhY2MwAAAAAQACAAMKARNhZGRUb2tlbkRhdGFFbnRyaWVzAgVhY2N1bQhhc3NldE51bQMJAGcCBQhhc3NldE51bQkAkAMBBQphc3NldElkc0xpBQVhY2N1bQQNYXNzZXREZWNpbWFscwQHJG1hdGNoMAkAkQMCBQphc3NldElkc0xpBQhhc3NldE51bQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAF4BQckbWF0Y2gwCAkBBXZhbHVlAQkA7AcBCQCRAwIFCmFzc2V0SWRzTGkFCGFzc2V0TnVtCGRlY2ltYWxzAAgJAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdzdGF0aWNfCQCRAwIFDWFzc2V0SWRzU3RyTGkFCGFzc2V0TnVtAgZfc2NhbGUJAGwGAAoAAAUNYXNzZXREZWNpbWFscwAAAAAFBERPV04JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdzdGF0aWNfCQCRAwIFDWFzc2V0SWRzU3RyTGkFCGFzc2V0TnVtAglfZGVjaW1hbHMFDWFzc2V0RGVjaW1hbHMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdzdGF0aWNfCQCRAwIFDWFzc2V0SWRzU3RyTGkFCGFzc2V0TnVtAgdfd2VpZ2h0CQEFdmFsdWUBCQC2CQEJAJEDAgURYXNzZXRXZWlnaHRzU3RyTGkFCGFzc2V0TnVtBQNuaWwDCQECIT0CBQ9hc3NldFdlaWdodHNTdW0AZAkAAgECKXN1bSBvZiB0b2tlbiB3ZWlnaHRzIG11c3QgYmUgZXF1YWwgdG8gMTAwCQDOCAIKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGY2XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARNhZGRUb2tlbkRhdGFFbnRyaWVzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY2XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY2XzICCQEFJGY2XzECCQEFJGY2XzECCQEFJGY2XzECBQUkYWNjMAAAAAEAAgADCQDMCAIJAQtTdHJpbmdFbnRyeQICD3N0YXRpY190b2tlbklkcwULYXNzZXRJZHNTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgITc3RhdGljX3Rva2VuV2VpZ2h0cwUPYXNzZXRXZWlnaHRzU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhNzdGF0aWNfdG9rZW5zQW1vdW50CQCQAwEFCmFzc2V0SWRzTGkJAMwIAgkBC1N0cmluZ0VudHJ5AgIRc3RhdGljX3Bvb2xEb21haW4FCnBvb2xEb21haW4JAMwIAgkBC1N0cmluZ0VudHJ5AgISc3RhdGljX2Jhc2VUb2tlbklkBQ5iYXNlVG9rZW5JZFN0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgIKc3RhdGljX2ZlZQBkBQNuaWwBaQEEaW5pdAEGb3JhY2xlCgELcHJlcGFyZUxpc3QACgEHaGFuZGxlcgIFYWNjdW0BbgkAzggCBQVhY2N1bQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEIBQFuB2Fzc2V0SWQCCF9iYWxhbmNlCAUBbgZhbW91bnQFA25pbAoAAiRsCAUBaQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmNF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHaGFuZGxlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwoBGWNhbGN1bGF0ZVBvb2xUb2tlbnNBbW91bnQBCHBheW1lbnRzCgEHaGFuZGxlcgIFYWNjdW0DcG10BAdhc3NldElkCAUDcG10B2Fzc2V0SWQKAQhoYW5kbGVyMgIFYWNjdW0BbgMJAAACBQFuBQdhc3NldElkCQEFdmFsdWUBCQDPCAIFCGFzc2V0SWRzBQFuBQVhY2N1bQQFVG9rZW4KAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAEKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGhhbmRsZXIyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADCQBrAwUFYWNjdW0JAGwGCAUDcG10BmFtb3VudAkAkQMCBQhEZWNpbWFscwUFVG9rZW4JAJEDAgUNQXNzZXRzV2VpZ2h0cwUFVG9rZW4FFUFzc2V0c1dlaWdodHNEZWNpbWFscwAIBQVGTE9PUgUGU2NhbGU4CgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUOUG9vbFRva2VuU2NhbGUKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2hhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjRfMgIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIFBSRhY2MwAAAAAQACAAMDCQBmAgkBDXRyeUdldEludGVnZXIBAhBnbG9iYWxfd2FzSW5pdGVkAAAJAAIBAhNwb29sIGFscmVhZHkgaW5pdGVkBBFpbml0aWFsUG9vbFRva2VucwkBGWNhbGN1bGF0ZVBvb2xUb2tlbnNBbW91bnQBCAUBaQhwYXltZW50cwMJAAACBRFpbml0aWFsUG9vbFRva2VucwAACQACAQIyeW91IG5lZWQgYSBiaWdnZXIgdG9rZW5zIGFtb3VudCB0byBsYXVuY2ggdGhlIHBvb2wEDnBvb2xUb2tlbklzc3VlCQDDCAcJAKwCAgIDV0QgCQEMdHJ5R2V0U3RyaW5nAQIRc3RhdGljX3Bvb2xEb21haW4CDVdEIHBvb2wgdG9rZW4FEWluaXRpYWxQb29sVG9rZW5zBRFQb29sVG9rZW5EZWNpbWFscwYFBHVuaXQAAAQLcG9vbFRva2VuSWQJALgIAQUOcG9vbFRva2VuSXNzdWUJAM4IAgkAzggCCQELcHJlcGFyZUxpc3QACQDMCAIFDnBvb2xUb2tlbklzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAURaW5pdGlhbFBvb2xUb2tlbnMJAMwIAgkBDEludGVnZXJFbnRyeQICEGdsb2JhbF93YXNJbml0ZWQAAQkAzAgCCQELQmluYXJ5RW50cnkCAhNnbG9iYWxfcG9vbFRva2VuX2lkBQtwb29sVG9rZW5JZAkAzAgCCQELU3RyaW5nRW50cnkCAhZzdGF0aWNfcG9vbFRva2VuX2lkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBBQtwb29sVG9rZW5JZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFEWluaXRpYWxQb29sVG9rZW5zBQtwb29sVG9rZW5JZAUDbmlsCQEbc2V0T3JhY2xlQWRkcmVzc0FuZEluaXRpYXRlAQUGb3JhY2xlAWkBDXVwZGF0ZUJhbGFuY2UCB3Rva2VuSWQHYmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8FB3Rva2VuSWQCCF9iYWxhbmNlBQdiYWxhbmNlBQNuaWwBaQEVZ2VuZXJhdGVBbmRTdGFrZUluZGV4AQpuZWVkQ2hhbmdlAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwUBVAkAAgEJAKwCAgI7eW91IG5lZWQgdG8gYXR0YWNoIGFsbCBwb29sIHRva2Vucy4gYW1vdW50IG9mIHBvb2wgdG9rZW5zOiAJAKQDAQUBVAMJAQEhAQkBE2NoZWNrVG9rZW5zVmFsaWRpdHkBCAUBaQhwYXltZW50cwkAAgECFXdyb25nIGFzc2V0cyBhdHRhY2hlZAQHUElzc3VlZAkBDWdldE1pblBJc3N1ZWQBCAUBaQhwYXltZW50cwQHcmVpc3N1ZQkBB1JlaXNzdWUDCQERQGV4dHJOYXRpdmUoMTA1NykBAhNnbG9iYWxfcG9vbFRva2VuX2lkBQdQSXNzdWVkBgQGcmVzdWx0CQETaGFuZGxlUG9vbFRva2Vuc0FkZAQFB1BJc3N1ZWQIBQFpCHBheW1lbnRzCAUBaQxvcmlnaW5DYWxsZXIFCm5lZWRDaGFuZ2UJAJQKAgkAzggCCQDOCAIFBnJlc3VsdAkAzAgCBQdyZWlzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQFB1BJc3N1ZWQFA25pbAkBEGluZGV4U3Rha2VSZXN1bHQCCQClCAEIBQFpDG9yaWdpbkNhbGxlcgUHUElzc3VlZAUHUElzc3VlZAFpARFjbGFpbUluZGV4UmV3YXJkcwAJAQtjbGFpbVJlc3VsdAEIBQFpBmNhbGxlcgFpARV1bnN0YWtlQW5kUmVkZWVtSW5kZXgBC3NoYXJlQW1vdW50BAphZGRyZXNzU3RyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQOc2hhcmVBdmFpbGFibGUJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQDCQBmAgULc2hhcmVBbW91bnQFDnNoYXJlQXZhaWxhYmxlCQACAQIleW91IGRvbid0IGhhdmUgaW5kZXggdG9rZW5zIGF2YWlsYWJsZQQJUFJlZGVlbWVkBQtzaGFyZUFtb3VudAQGcmVzdWx0CQEWaGFuZGxlUG9vbFRva2Vuc1JlZGVlbQIFCVBSZWRlZW1lZAgFAWkMb3JpZ2luQ2FsbGVyCQDOCAIJAM4IAgkAzggCCQELY2xhaW1SZXN1bHQBCAUBaQxvcmlnaW5DYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYWRkcmVzc1N0cgIMX2luZGV4U3Rha2VkCQBlAgUOc2hhcmVBdmFpbGFibGUFC3NoYXJlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhJnbG9iYWxfaW5kZXhTdGFrZWQJAGUCCQENdHJ5R2V0SW50ZWdlcgECEmdsb2JhbF9pbmRleFN0YWtlZAULc2hhcmVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtzaGFyZUFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTcpAQITZ2xvYmFsX3Bvb2xUb2tlbl9pZAUDbmlsBQZyZXN1bHQJAMwIAgkBBEJ1cm4CCQEMdHJ5R2V0QmluYXJ5AQITZ2xvYmFsX3Bvb2xUb2tlbl9pZAUJUFJlZGVlbWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAkAZQIJAQ10cnlHZXRJbnRlZ2VyAQIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQFCVBSZWRlZW1lZAUDbmlsAWkBBHN3YXACCGFzc2V0T3V0B21pbmltdW0DCQEKaXNTaHV0ZG93bgAJAAIBAhpQb29sIGlzIGN1cnJlbnRseSBzaHV0ZG93bgQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECEFtb3VudEluCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQHQXNzZXRJbggFA3BtdAdhc3NldElkBAppbnZva2VTd2FwCQEKYXNJbnRUdXBsZQEJAP0HBAUEdGhpcwIMc3dhcEludGVybmFsCQDMCAIFCGFzc2V0T3V0CQDMCAIFB21pbmltdW0JAMwIAgUIQW1vdW50SW4JAMwIAgkBDmdldEFzc2V0U3RyaW5nAQUHQXNzZXRJbgkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUKaW52b2tlU3dhcAUKaW52b2tlU3dhcAQOY2xlYW5BbW91bnRPdXQIBQppbnZva2VTd2FwAl8xAwkAAAIFDmNsZWFuQW1vdW50T3V0BQ5jbGVhbkFtb3VudE91dAQJZmVlQW1vdW50CAUKaW52b2tlU3dhcAJfMgMJAAACBQlmZWVBbW91bnQFCWZlZUFtb3VudAQFdG9wVXADCQAAAgUIYXNzZXRPdXQCBVdBVkVTBAd1bnN0YWtlCQD9BwQFBHRoaXMCCGludGVybmFsCQDMCAIHCQDMCAIJAGQCBQ5jbGVhbkFtb3VudE91dAkAawMFCWZlZUFtb3VudAADAAQJAMwIAgIFV0FWRVMFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBDmdldEZlZXNBY2NvdW50AAkAawMFCWZlZUFtb3VudAACAAQJAQ1nZXRBc3NldEJ5dGVzAQUIYXNzZXRPdXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEOZ2V0RmVlc0FjY291bnQACQBrAwUJZmVlQW1vdW50AAIABAkBDWdldEFzc2V0Qnl0ZXMBBQhhc3NldE91dAUDbmlsAwkAAAIFBXRvcFVwBQV0b3BVcAkAlAoCBQV0b3BVcAUOY2xlYW5BbW91bnRPdXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIaW50ZXJuYWwDBXN0YWtlBmFtb3VudAdhc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQILTm90IGFsbG93ZWQJAQxzdGFrZVVuc3Rha2UDBQVzdGFrZQUGYW1vdW50BQdhc3NldElkAWkBCHN0YWtlQWxsAAkBDHN0YWtlVW5zdGFrZQMGCQBlAgkBDXRyeUdldEludGVnZXIBAhRnbG9iYWxfV0FWRVNfYmFsYW5jZQkBDXRyeUdldEludGVnZXIBAg5sZWFzaW5nX2Ftb3VudAIFV0FWRVMBaQEMc3dhcEludGVybmFsBQhhc3NldE91dAdtaW5pbXVtCEFtb3VudEluB0Fzc2V0SW4GY2FsbGVyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIbWW91IGNhbnQgY2FsbCB0aGlzIGRpcmVjdGx5BAhBc3NldE91dAkBDWdldEFzc2V0Qnl0ZXMBBQhhc3NldE91dAQDZGF5CQEXY2FsY3VsYXRlRGF5c1NpbmNlU3RhcnQABAdyZXZlbmV1CQENdHJ5R2V0SW50ZWdlcgEJARRyZXZlbmV1Rm9yRGF5QnlBc3NldAIFA2RheQUIYXNzZXRPdXQEDkFzc2V0SW5CYWxhbmNlCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdnbG9iYWxfBQdBc3NldEluAghfYmFsYW5jZQMJAAACBQ5Bc3NldEluQmFsYW5jZQUOQXNzZXRJbkJhbGFuY2UED0Fzc2V0T3V0QmFsYW5jZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwUIYXNzZXRPdXQCCF9iYWxhbmNlAwkAAAIFD0Fzc2V0T3V0QmFsYW5jZQUPQXNzZXRPdXRCYWxhbmNlBAlBbW91bnRPdXQJARJjYWxjdWxhdGVPdXRBbW91bnQFBQhBbW91bnRJbgkBDWdldEFzc2V0Qnl0ZXMBBQdBc3NldEluBQhBc3NldE91dAUOQXNzZXRJbkJhbGFuY2UFD0Fzc2V0T3V0QmFsYW5jZQMJAAACBQlBbW91bnRPdXQFCUFtb3VudE91dAQJZmVlQW1vdW50CQBrAwUJQW1vdW50T3V0BQNGZWUFCEZlZVNjYWxlAwkAAAIFCWZlZUFtb3VudAUJZmVlQW1vdW50BA5jbGVhbkFtb3VudE91dAkAZQIFCUFtb3VudE91dAUJZmVlQW1vdW50AwkAAAIFDmNsZWFuQW1vdW50T3V0BQ5jbGVhbkFtb3VudE91dAMJAGYCBQdtaW5pbXVtBQ5jbGVhbkFtb3VudE91dAkAAgEJAKwCAgIrYW1vdW50IHRvIHJlY2lldmUgaXMgbG93ZXIgdGhhbiBnaXZlbiBvbmU6IAkApAMBBQ5jbGVhbkFtb3VudE91dAMJAGYCAAAJAGUCBQ9Bc3NldE91dEJhbGFuY2UFCUFtb3VudE91dAkAAgECG2NvbnRyYWN0IGlzIG91dCBvZiByZXNlcnZlcwMJAAACBQhBc3NldE91dAkBDWdldEFzc2V0Qnl0ZXMBBQdBc3NldEluCQACAQIYdGhpcyBzd2FwIGlzIG5vdCBhbGxvd2VkBAxuZXdCYWxhbmNlSW4JAGQCBQ5Bc3NldEluQmFsYW5jZQUIQW1vdW50SW4DCQAAAgUMbmV3QmFsYW5jZUluBQxuZXdCYWxhbmNlSW4EBXN0YWtlCQD9BwQFBHRoaXMCCGludGVybmFsCQDMCAIGCQDMCAIFCEFtb3VudEluCQDMCAIFB0Fzc2V0SW4FA25pbAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQQNbmV3QmFsYW5jZU91dAkAZQIFD0Fzc2V0T3V0QmFsYW5jZQUJQW1vdW50T3V0AwkAAAIFDW5ld0JhbGFuY2VPdXQFDW5ld0JhbGFuY2VPdXQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8FCGFzc2V0T3V0AghfYmFsYW5jZQkAZAIFDW5ld0JhbGFuY2VPdXQJAGsDBQlmZWVBbW91bnQAAQAECQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBmNhbGxlcgUOY2xlYW5BbW91bnRPdXQFCEFzc2V0T3V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHZ2xvYmFsXwUHQXNzZXRJbgIIX2JhbGFuY2UFDG5ld0JhbGFuY2VJbgkAzAgCCQEMSW50ZWdlckVudHJ5AgIOZGF5c19zaW5jZV9hcHkFA2RheQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFHJldmVuZXVGb3JEYXlCeUFzc2V0AgUDZGF5BQhhc3NldE91dAUHcmV2ZW5ldQUDbmlsCQCUCgIFDmNsZWFuQW1vdW50T3V0BQlmZWVBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEg3tbGUeRTFtBlgOsBmioL0PeXUfocdpF+m44GQ3cXvSUECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAACl1Ou2A==", "height": 3627116, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BnMkv5Ezh2jvqxDJAnQ5KgZzYykc2vfP77hxz95aYxZ Next: dstTPE3WUNhhS7QMpRksueLtoHyC2xevQYZqCE53PNC Diff:
OldNewDifferences
337337 let stakeUnstakeData = if ((getAssetString(tokenId) == "WAVES"))
338338 then stakeUnstake(true, Dk, "WAVES")
339339 else nil
340- (((accum ++ t) ++ stakeUnstakeData) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
340+ let changeBalance = invoke(this, "updateBalance", [getAssetString(tokenId), (Bk + Dk)], nil)
341+ if ((changeBalance == changeBalance))
342+ then ((accum ++ t) ++ stakeUnstakeData)
343+ else throw("Strict value is not equal to itself.")
341344 }
342345
343346 let $l = assetIds
447450 then nil
448451 else [ScriptTransfer(address, rewardAmount, assetId)]
449452 let claimed = tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_claimed"))
450- ((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)), StringEntry("DEBUG", ((((((((((("DEBUG_" + toString(currentTokenEarnings)) + " ") + toString(currentTokenEarnings)) + " ") + toString(rewardAmount)) + " ") + assetIdStr) + " ") + toString(aBalance)) + " ") + toString(tokenEarningsLastCheck)))])
453+ ((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)), StringEntry("DEBUG", ((((((((((("DEBUG_" + toString(currentTokenEarnings)) + " ") + toString(currentTokenInterest)) + " ") + toString(rewardAmount)) + " ") + assetIdStr) + " ") + toString(aBalance)) + " ") + toString(tokenEarningsLastCheck)))])
451454 }
452455
453456 let accum = {
660663
661664
662665 @Callable(i)
663-func generateIndex (needChange) = if ((size(i.payments) != T))
664- then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
665- else if (!(checkTokensValidity(i.payments)))
666- then throw("wrong assets attached")
667- else {
668- let PIssued = getMinPIssued(i.payments)
669- let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
670- let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
671- $Tuple2((result ++ [reissue, ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]), PIssued)
672- }
673-
674-
675-
676-@Callable(i)
677-func stakeIndex () = {
678- let addressStr = toString(i.originCaller)
679- let pmt = i.payments[0]
680- if ((value(pmt.assetId) != tryGetBinary("global_poolToken_id")))
681- then throw("wrong asset attached")
682- else indexStakeResult(addressStr, pmt.amount)
683- }
666+func updateBalance (tokenId,balance) = [IntegerEntry((("global_" + tokenId) + "_balance"), balance)]
684667
685668
686669
699682
700683
701684 @Callable(i)
702-func unstakeIndex (shareAmount) = {
703- let addressStr = toString(i.originCaller)
704- let shareAvailable = tryGetInteger((addressStr + "_indexStaked"))
705- if ((shareAmount > shareAvailable))
706- then throw("you don't have index tokens available")
707- else (claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (shareAvailable - shareAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - shareAmount)), ScriptTransfer(i.caller, shareAmount, getBinaryValue("global_poolToken_id"))])
708- }
709-
710-
711-
712-@Callable(i)
713685 func claimIndexRewards () = claimResult(i.caller)
714-
715-
716-
717-@Callable(i)
718-func redeemIndex (sendToOrigin) = {
719- let pmt = i.payments[0]
720- if ((pmt.assetId != tryGetBinary("global_poolToken_id")))
721- then throw("please attach pool share token")
722- else {
723- let PRedeemed = pmt.amount
724- let result = handlePoolTokensRedeem(PRedeemed, if (sendToOrigin)
725- then i.originCaller
726- else i.caller)
727- (result ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
728- }
729- }
730686
731687
732688
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let startTsMs = 1679961601000
55
66 func calculateDaysSinceStart () = {
77 let diff = (lastBlock.timestamp - startTsMs)
88 let daysPassed = (diff / (86400 * 1000))
99 daysPassed
1010 }
1111
1212
1313 func asIntTuple (value) = match value {
1414 case int: (Int, Int) =>
1515 int
1616 case _ =>
1717 throw("Wrong type, expected: Tuple Int")
1818 }
1919
2020
2121 func getOracleAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, "static_oracle"), "oracle not found!")), "could not parse oracle")
2222
2323
2424 func getFeesAccount () = addressFromStringValue(valueOrErrorMessage(getString(getOracleAddress(), "static_feeAggregator"), "static_feeAggregator not found!"))
2525
2626
2727 func getNodeAccount () = addressFromStringValue(valueOrErrorMessage(getString(getOracleAddress(), "static_nodeAddress"), "node_address not found!"))
2828
2929
3030 func tryGetInteger (key) = match getInteger(this, key) {
3131 case b: Int =>
3232 b
3333 case _ =>
3434 0
3535 }
3636
3737
3838 func tryGetBinary (key) = match getBinary(this, key) {
3939 case b: ByteVector =>
4040 b
4141 case _ =>
4242 base58''
4343 }
4444
4545
4646 func tryGetString (key) = match getString(this, key) {
4747 case b: String =>
4848 b
4949 case _ =>
5050 ""
5151 }
5252
5353
5454 func getAssetString (assetId) = match assetId {
5555 case b: ByteVector =>
5656 toBase58String(b)
5757 case _ =>
5858 "WAVES"
5959 }
6060
6161
6262 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
6363 then unit
6464 else fromBase58String(assetIdStr)
6565
6666
6767 func addAssetBytesToList (accum,item) = (accum ++ [getAssetBytes(item)])
6868
6969
7070 func addAssetWeightToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_weight"))])
7171
7272
7373 func addAssetDecimalsToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_decimals"))])
7474
7575
7676 func addAssetScaleToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_scale"))])
7777
7878
7979 func addIntToList (accum,item) = (accum ++ [parseIntValue(item)])
8080
8181
8282 func reveneuForDayByAsset (day,assetId) = ((("reveneu_day_" + assetId) + "_") + toString(day))
8383
8484
8585 let T = tryGetInteger("static_tokensAmount")
8686
8787 let assetIds = {
8888 let $l = split(tryGetString("static_tokenIds"), ",")
8989 let $s = size($l)
9090 let $acc0 = nil
9191 func $f0_1 ($a,$i) = if (($i >= $s))
9292 then $a
9393 else addAssetBytesToList($a, $l[$i])
9494
9595 func $f0_2 ($a,$i) = if (($i >= $s))
9696 then $a
9797 else throw("List size exceeds 3")
9898
9999 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
100100 }
101101
102102 let AssetsWeights = {
103103 let $l = assetIds
104104 let $s = size($l)
105105 let $acc0 = nil
106106 func $f1_1 ($a,$i) = if (($i >= $s))
107107 then $a
108108 else addAssetWeightToList($a, $l[$i])
109109
110110 func $f1_2 ($a,$i) = if (($i >= $s))
111111 then $a
112112 else throw("List size exceeds 3")
113113
114114 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
115115 }
116116
117117 let Decimals = {
118118 let $l = assetIds
119119 let $s = size($l)
120120 let $acc0 = nil
121121 func $f2_1 ($a,$i) = if (($i >= $s))
122122 then $a
123123 else addAssetDecimalsToList($a, $l[$i])
124124
125125 func $f2_2 ($a,$i) = if (($i >= $s))
126126 then $a
127127 else throw("List size exceeds 3")
128128
129129 $f2_2($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3)
130130 }
131131
132132 let Scales = {
133133 let $l = assetIds
134134 let $s = size($l)
135135 let $acc0 = nil
136136 func $f3_1 ($a,$i) = if (($i >= $s))
137137 then $a
138138 else addAssetScaleToList($a, $l[$i])
139139
140140 func $f3_2 ($a,$i) = if (($i >= $s))
141141 then $a
142142 else throw("List size exceeds 3")
143143
144144 $f3_2($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3)
145145 }
146146
147147 let stakeId = tryGetString("last_stake_id")
148148
149149 let Fee = tryGetInteger("static_fee")
150150
151151 let AssetsWeightsDecimals = 2
152152
153153 let Scale = 10000
154154
155155 let Scale8 = 100000000
156156
157157 let FeeScale = 10000
158158
159159 let PoolTokenDecimals = 8
160160
161161 let PoolTokenScale = pow(10, 0, PoolTokenDecimals, 0, 0, HALFUP)
162162
163163 let earnedAssets = assetIds
164164
165165 func isShutdown () = {
166166 let shutdown = if ((tryGetString("static_oracle") != ""))
167167 then match getBoolean(getOracleAddress(), "amm_shutdown") {
168168 case x: Boolean =>
169169 x
170170 case _ =>
171171 false
172172 }
173173 else false
174174 let shutdown2 = match getBoolean(this, "is_shutdown") {
175175 case x: Boolean =>
176176 x
177177 case _ =>
178178 false
179179 }
180180 if (shutdown)
181181 then true
182182 else shutdown2
183183 }
184184
185185
186186 func canUpdate () = if ((tryGetString("static_oracle") != ""))
187187 then match getBoolean(getOracleAddress(), "amm_tx") {
188188 case x: Boolean =>
189189 x
190190 case _ =>
191191 true
192192 }
193193 else true
194194
195195
196196 func getCurrentTokenBalance (tokenType) = {
197197 let tokenId = getAssetString(assetIds[tokenType])
198198 tryGetInteger((("global_" + tokenId) + "_balance"))
199199 }
200200
201201
202202 func calculatePIssued (amount,tokenId) = {
203203 let Psupply = tryGetInteger("global_poolToken_amount")
204204 let Balance = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
205205 fraction(amount, Psupply, Balance, DOWN)
206206 }
207207
208208
209209 func getMinPIssued (payments) = {
210210 func handler (accum,current) = {
211211 let PIssued = calculatePIssued(current.amount, current.assetId)
212212 if ((PIssued == 0))
213213 then throw("one of the tokens amounts is too low")
214214 else if (if ((accum == 0))
215215 then true
216216 else (accum > PIssued))
217217 then PIssued
218218 else accum
219219 }
220220
221221 let minPIssed = {
222222 let $l = payments
223223 let $s = size($l)
224224 let $acc0 = 0
225225 func $f4_1 ($a,$i) = if (($i >= $s))
226226 then $a
227227 else handler($a, $l[$i])
228228
229229 func $f4_2 ($a,$i) = if (($i >= $s))
230230 then $a
231231 else throw("List size exceeds 3")
232232
233233 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
234234 }
235235 minPIssed
236236 }
237237
238238
239239 func checkTokensValidity (payments) = {
240240 func handler1 (accum,payment) = (accum ++ [payment.assetId])
241241
242242 let ids = {
243243 let $l = payments
244244 let $s = size($l)
245245 let $acc0 = nil
246246 func $f4_1 ($a,$i) = if (($i >= $s))
247247 then $a
248248 else handler1($a, $l[$i])
249249
250250 func $f4_2 ($a,$i) = if (($i >= $s))
251251 then $a
252252 else throw("List size exceeds 3")
253253
254254 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
255255 }
256256 if ((ids == ids))
257257 then {
258258 func handler2 (accum,assetId) = if ((indexOf(ids, assetId) != unit))
259259 then (accum + 1)
260260 else throw(("asset not attached: " + getAssetString(assetId)))
261261
262262 let checks = {
263263 let $l = assetIds
264264 let $s = size($l)
265265 let $acc0 = 0
266266 func $f5_1 ($a,$i) = if (($i >= $s))
267267 then $a
268268 else handler2($a, $l[$i])
269269
270270 func $f5_2 ($a,$i) = if (($i >= $s))
271271 then $a
272272 else throw("List size exceeds 3")
273273
274274 $f5_2($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3)
275275 }
276276 if ((checks == checks))
277277 then true
278278 else throw("Strict value is not equal to itself.")
279279 }
280280 else throw("Strict value is not equal to itself.")
281281 }
282282
283283
284284 func stakeUnstake (stake,amount,assetId) = if (if ((assetId == "WAVES"))
285285 then (amount > 0)
286286 else false)
287287 then {
288288 let leasingAmount = valueOrElse(getInteger(this, "leasing_amount"), 0)
289289 let newLeaseAmount = if (stake)
290290 then (leasingAmount + amount)
291291 else (leasingAmount - amount)
292292 let newLease = Lease(getNodeAccount(), newLeaseAmount)
293293 let newLeaseId = calculateLeaseId(newLease)
294294 let data = [newLease, StringEntry("last_stake_id", toBase58String(newLeaseId)), IntegerEntry("leasing_amount", newLeaseAmount)]
295295 if ((stakeId != ""))
296296 then ([LeaseCancel(fromBase58String(stakeId))] ++ data)
297297 else data
298298 }
299299 else nil
300300
301301
302302 func handlePoolTokensAdd (PIssued,payments,userAddress,needChange) = {
303303 func getTokenPaymentAmount (tokenId) = {
304304 func handler (accum,payment) = if ((payment.assetId == tokenId))
305305 then payment.amount
306306 else accum
307307
308308 let $l = payments
309309 let $s = size($l)
310310 let $acc0 = 0
311311 func $f4_1 ($a,$i) = if (($i >= $s))
312312 then $a
313313 else handler($a, $l[$i])
314314
315315 func $f4_2 ($a,$i) = if (($i >= $s))
316316 then $a
317317 else throw("List size exceeds 3")
318318
319319 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
320320 }
321321
322322 func handleTokenChange (accum,tokenId) = {
323323 let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
324324 let PSupply = tryGetInteger("global_poolToken_amount")
325325 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
326326 let DkTemp = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, CEILING) - tokenDecimals), Bk, tokenDecimals, CEILING)
327327 let paymentAmount = getTokenPaymentAmount(tokenId)
328328 let Dk = min([DkTemp, paymentAmount])
329329 let toReturn = ((if ((paymentAmount != 0))
330330 then paymentAmount
331331 else 0) - Dk)
332332 let t = if (if (needChange)
333333 then (toReturn > 0)
334334 else false)
335335 then [ScriptTransfer(userAddress, toReturn, tokenId)]
336336 else nil
337337 let stakeUnstakeData = if ((getAssetString(tokenId) == "WAVES"))
338338 then stakeUnstake(true, Dk, "WAVES")
339339 else nil
340- (((accum ++ t) ++ stakeUnstakeData) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
340+ let changeBalance = invoke(this, "updateBalance", [getAssetString(tokenId), (Bk + Dk)], nil)
341+ if ((changeBalance == changeBalance))
342+ then ((accum ++ t) ++ stakeUnstakeData)
343+ else throw("Strict value is not equal to itself.")
341344 }
342345
343346 let $l = assetIds
344347 let $s = size($l)
345348 let $acc0 = nil
346349 func $f4_1 ($a,$i) = if (($i >= $s))
347350 then $a
348351 else handleTokenChange($a, $l[$i])
349352
350353 func $f4_2 ($a,$i) = if (($i >= $s))
351354 then $a
352355 else throw("List size exceeds 3")
353356
354357 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
355358 }
356359
357360
358361 func handlePoolTokensRedeem (PRedeemed,userAddress) = {
359362 func handleTokenRedeem (accum,tokenId) = {
360363 let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
361364 let PSupply = tryGetInteger("global_poolToken_amount")
362365 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
363366 let amount = toInt(fraction((toBigInt(Scale8) - fraction(toBigInt((PSupply - PRedeemed)), toBigInt(Scale8), toBigInt(PSupply), CEILING)), toBigInt(Bk), toBigInt(Scale8), DOWN))
364367 let stakeUnstakeData = if ((getAssetString(tokenId) == "WAVES"))
365368 then stakeUnstake(false, amount, "WAVES")
366369 else nil
367370 ((accum ++ stakeUnstakeData) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk - amount)), ScriptTransfer(userAddress, amount, tokenId)])
368371 }
369372
370373 let $l = assetIds
371374 let $s = size($l)
372375 let $acc0 = nil
373376 func $f4_1 ($a,$i) = if (($i >= $s))
374377 then $a
375378 else handleTokenRedeem($a, $l[$i])
376379
377380 func $f4_2 ($a,$i) = if (($i >= $s))
378381 then $a
379382 else throw("List size exceeds 3")
380383
381384 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
382385 }
383386
384387
385388 func calculateOutAmount (AmountIn,assetIn,assetOut,BalanceIn,BalanceOut) = {
386389 let IndexIn = value(indexOf(assetIds, assetIn))
387390 let IndexOut = value(indexOf(assetIds, assetOut))
388391 if ((IndexIn == IndexOut))
389392 then throw("wrong tokens pair")
390393 else fraction(BalanceOut, ((Scale8 * Scale8) - toInt(pow(fraction(toBigInt(BalanceIn), toBigInt((Scale8 * Scale8)), toBigInt((BalanceIn + AmountIn)), HALFUP), 16, toBigInt(fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut])), 4, 16, CEILING))), (Scale8 * Scale8), DOWN)
391394 }
392395
393396
394397 func calculateMinToGet (asset1,asset2,amountToSwap) = {
395398 let kBalanceA = (("global_" + asset1) + "_balance")
396399 let A_asset_balance = getIntegerValue(this, kBalanceA)
397400 let kBalanceB = (("global_" + asset2) + "_balance")
398401 let B_asset_balance = getIntegerValue(this, kBalanceB)
399402 let toGet = calculateOutAmount(amountToSwap, getAssetBytes(asset1), getAssetBytes(asset2), A_asset_balance, B_asset_balance)
400403 let feeAmount = fraction(toGet, Fee, FeeScale)
401404 if ((feeAmount == feeAmount))
402405 then {
403406 let cleanAmountOut = (toGet - feeAmount)
404407 if ((cleanAmountOut == cleanAmountOut))
405408 then cleanAmountOut
406409 else throw("Strict value is not equal to itself.")
407410 }
408411 else throw("Strict value is not equal to itself.")
409412 }
410413
411414
412415 func getTokenBalance (assetId) = match assetId {
413416 case t: ByteVector =>
414417 assetBalance(this, t)
415418 case _ =>
416419 wavesBalance(this).regular
417420 }
418421
419422
420423 func calculateCurrentAssetInterest (assetId,assetIdStr,aBalance,tokenEarningsLastCheck) = {
421424 let totalStaked = tryGetInteger("global_indexStaked")
422425 let tokenBalanceLastCheck = tokenEarningsLastCheck
423426 let currentBalanceDelta = (getTokenBalance(assetId) - aBalance)
424427 let currentTokenEarnings = if ((currentBalanceDelta > tokenBalanceLastCheck))
425428 then currentBalanceDelta
426429 else tokenBalanceLastCheck
427430 let newEarnings = (currentTokenEarnings - tokenBalanceLastCheck)
428431 let newInterest = if ((totalStaked == 0))
429432 then 0
430433 else fraction(newEarnings, Scale8, totalStaked)
431434 let lastCheckInterest = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_interest"))
432435 (lastCheckInterest + newInterest)
433436 }
434437
435438
436439 func claimResult (address) = {
437440 let addressStr = toString(address)
438441 let shareAmount = tryGetInteger((addressStr + "_indexStaked"))
439442 func handler (accum,assetId) = {
440443 let assetIdStr = getAssetString(assetId)
441444 let aBalance = tryGetInteger((("global_" + getAssetString(assetId)) + "_balance"))
442445 let tokenEarningsLastCheck = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_earnings"))
443446 let currentTokenInterest = calculateCurrentAssetInterest(assetId, assetIdStr, aBalance, tokenEarningsLastCheck)
444447 let currentTokenEarnings = max([tokenEarningsLastCheck, (getTokenBalance(assetId) - aBalance)])
445448 let rewardAmount = fraction(shareAmount, (currentTokenInterest - tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"))), Scale8)
446449 let transfer = if ((rewardAmount == 0))
447450 then nil
448451 else [ScriptTransfer(address, rewardAmount, assetId)]
449452 let claimed = tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_claimed"))
450- ((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)), StringEntry("DEBUG", ((((((((((("DEBUG_" + toString(currentTokenEarnings)) + " ") + toString(currentTokenEarnings)) + " ") + toString(rewardAmount)) + " ") + assetIdStr) + " ") + toString(aBalance)) + " ") + toString(tokenEarningsLastCheck)))])
453+ ((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)), StringEntry("DEBUG", ((((((((((("DEBUG_" + toString(currentTokenEarnings)) + " ") + toString(currentTokenInterest)) + " ") + toString(rewardAmount)) + " ") + assetIdStr) + " ") + toString(aBalance)) + " ") + toString(tokenEarningsLastCheck)))])
451454 }
452455
453456 let accum = {
454457 let $l = earnedAssets
455458 let $s = size($l)
456459 let $acc0 = nil
457460 func $f4_1 ($a,$i) = if (($i >= $s))
458461 then $a
459462 else handler($a, $l[$i])
460463
461464 func $f4_2 ($a,$i) = if (($i >= $s))
462465 then $a
463466 else throw("List size exceeds 3")
464467
465468 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
466469 }
467470 (accum ++ [IntegerEntry((addressStr + "_lastClaim"), lastBlock.timestamp)])
468471 }
469472
470473
471474 func indexStakeResult (addressStr,amount) = {
472475 let li = claimResult(addressFromStringValue(addressStr))
473476 (li ++ [IntegerEntry((addressStr + "_indexStaked"), (tryGetInteger((addressStr + "_indexStaked")) + amount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") + amount))])
474477 }
475478
476479
477480 func sum (accum,n) = (accum + parseIntValue(n))
478481
479482
480483 func setOracleAddressAndInitiate (address) = [StringEntry("static_oracle", address)]
481484
482485
483486 func isTestEnv () = {
484487 let testenv = match getBoolean(this, "TESTENV") {
485488 case x: Boolean =>
486489 x
487490 case _ =>
488491 false
489492 }
490493 testenv
491494 }
492495
493496
494497 @Callable(i)
495498 func readOnlyFunc (asset1,asset2,amountToSwap) = {
496499 let amountOut = calculateMinToGet(asset1, asset2, amountToSwap)
497500 [IntegerEntry("DEBUG", amountOut)]
498501 }
499502
500503
501504
502505 @Callable(i)
503506 func topUpFunds () = if ((size(i.payments) != 1))
504507 then throw("Wrong payments attached!")
505508 else {
506509 let payment = i.payments[0]
507510 let asset = payment.assetId
508511 if ((indexOf(assetIds, asset) == unit))
509512 then throw("Not supported assetId")
510513 else {
511514 let amount = payment.amount
512515 let aBalance = tryGetInteger((("global_" + getAssetString(asset)) + "_balance"))
513516 let day = calculateDaysSinceStart()
514517 let reveneu = tryGetInteger(reveneuForDayByAsset(day, getAssetString(asset)))
515518 [IntegerEntry((("global_" + getAssetString(asset)) + "_balance"), (aBalance + amount)), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAsset(day, getAssetString(asset)), (reveneu + amount))]
516519 }
517520 }
518521
519522
520523
521524 @Callable(i)
522525 func preInit (assetIdsStr,assetWeightsStr,baseTokenIdStr,poolDomain) = if ((this != i.caller))
523526 then throw("admin only")
524527 else if ((size(poolDomain) > 13))
525528 then throw("too large pool domain")
526529 else {
527530 let assetIdsStrLi = split(assetIdsStr, ",")
528531 let assetIdsLi = {
529532 let $l = assetIdsStrLi
530533 let $s = size($l)
531534 let $acc0 = nil
532535 func $f4_1 ($a,$i) = if (($i >= $s))
533536 then $a
534537 else addAssetBytesToList($a, $l[$i])
535538
536539 func $f4_2 ($a,$i) = if (($i >= $s))
537540 then $a
538541 else throw("List size exceeds 3")
539542
540543 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
541544 }
542545 let assetWeightsStrLi = split(assetWeightsStr, ",")
543546 let assetWeightsSum = {
544547 let $l = assetWeightsStrLi
545548 let $s = size($l)
546549 let $acc0 = 0
547550 func $f5_1 ($a,$i) = if (($i >= $s))
548551 then $a
549552 else sum($a, $l[$i])
550553
551554 func $f5_2 ($a,$i) = if (($i >= $s))
552555 then $a
553556 else throw("List size exceeds 3")
554557
555558 $f5_2($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3)
556559 }
557560 func addTokenDataEntries (accum,assetNum) = if ((assetNum >= size(assetIdsLi)))
558561 then accum
559562 else {
560563 let assetDecimals = match assetIdsLi[assetNum] {
561564 case x: ByteVector =>
562565 value(assetInfo(assetIdsLi[assetNum])).decimals
563566 case _ =>
564567 8
565568 }
566569 (accum ++ [IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_scale"), pow(10, 0, assetDecimals, 0, 0, DOWN)), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_decimals"), assetDecimals), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_weight"), value(parseInt(assetWeightsStrLi[assetNum])))])
567570 }
568571
569572 if ((assetWeightsSum != 100))
570573 then throw("sum of token weights must be equal to 100")
571574 else ({
572575 let $l = [0, 1, 2]
573576 let $s = size($l)
574577 let $acc0 = nil
575578 func $f6_1 ($a,$i) = if (($i >= $s))
576579 then $a
577580 else addTokenDataEntries($a, $l[$i])
578581
579582 func $f6_2 ($a,$i) = if (($i >= $s))
580583 then $a
581584 else throw("List size exceeds 3")
582585
583586 $f6_2($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3)
584587 } ++ [StringEntry("static_tokenIds", assetIdsStr), StringEntry("static_tokenWeights", assetWeightsStr), IntegerEntry("static_tokensAmount", size(assetIdsLi)), StringEntry("static_poolDomain", poolDomain), StringEntry("static_baseTokenId", baseTokenIdStr), IntegerEntry("static_fee", 100)])
585588 }
586589
587590
588591
589592 @Callable(i)
590593 func init (oracle) = {
591594 func prepareList () = {
592595 func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + getAssetString(n.assetId)) + "_balance"), n.amount)])
593596
594597 let $l = i.payments
595598 let $s = size($l)
596599 let $acc0 = nil
597600 func $f4_1 ($a,$i) = if (($i >= $s))
598601 then $a
599602 else handler($a, $l[$i])
600603
601604 func $f4_2 ($a,$i) = if (($i >= $s))
602605 then $a
603606 else throw("List size exceeds 3")
604607
605608 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
606609 }
607610
608611 func calculatePoolTokensAmount (payments) = {
609612 func handler (accum,pmt) = {
610613 let assetId = pmt.assetId
611614 func handler2 (accum,n) = if ((n == assetId))
612615 then value(indexOf(assetIds, n))
613616 else accum
614617
615618 let Token = {
616619 let $l = assetIds
617620 let $s = size($l)
618621 let $acc0 = 1
619622 func $f4_1 ($a,$i) = if (($i >= $s))
620623 then $a
621624 else handler2($a, $l[$i])
622625
623626 func $f4_2 ($a,$i) = if (($i >= $s))
624627 then $a
625628 else throw("List size exceeds 3")
626629
627630 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
628631 }
629632 fraction(accum, pow(pmt.amount, Decimals[Token], AssetsWeights[Token], AssetsWeightsDecimals, 8, FLOOR), Scale8)
630633 }
631634
632635 let $l = payments
633636 let $s = size($l)
634637 let $acc0 = PoolTokenScale
635638 func $f4_1 ($a,$i) = if (($i >= $s))
636639 then $a
637640 else handler($a, $l[$i])
638641
639642 func $f4_2 ($a,$i) = if (($i >= $s))
640643 then $a
641644 else throw("List size exceeds 3")
642645
643646 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
644647 }
645648
646649 if ((tryGetInteger("global_wasInited") > 0))
647650 then throw("pool already inited")
648651 else {
649652 let initialPoolTokens = calculatePoolTokensAmount(i.payments)
650653 if ((initialPoolTokens == 0))
651654 then throw("you need a bigger tokens amount to launch the pool")
652655 else {
653656 let poolTokenIssue = Issue(("WD " + tryGetString("static_poolDomain")), "WD pool token", initialPoolTokens, PoolTokenDecimals, true, unit, 0)
654657 let poolTokenId = calculateAssetId(poolTokenIssue)
655658 ((prepareList() ++ [poolTokenIssue, IntegerEntry("global_poolToken_amount", initialPoolTokens), IntegerEntry("global_wasInited", 1), BinaryEntry("global_poolToken_id", poolTokenId), StringEntry("static_poolToken_idStr", getAssetString(poolTokenId)), ScriptTransfer(i.caller, initialPoolTokens, poolTokenId)]) ++ setOracleAddressAndInitiate(oracle))
656659 }
657660 }
658661 }
659662
660663
661664
662665 @Callable(i)
663-func generateIndex (needChange) = if ((size(i.payments) != T))
664- then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
665- else if (!(checkTokensValidity(i.payments)))
666- then throw("wrong assets attached")
667- else {
668- let PIssued = getMinPIssued(i.payments)
669- let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
670- let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
671- $Tuple2((result ++ [reissue, ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]), PIssued)
672- }
673-
674-
675-
676-@Callable(i)
677-func stakeIndex () = {
678- let addressStr = toString(i.originCaller)
679- let pmt = i.payments[0]
680- if ((value(pmt.assetId) != tryGetBinary("global_poolToken_id")))
681- then throw("wrong asset attached")
682- else indexStakeResult(addressStr, pmt.amount)
683- }
666+func updateBalance (tokenId,balance) = [IntegerEntry((("global_" + tokenId) + "_balance"), balance)]
684667
685668
686669
687670 @Callable(i)
688671 func generateAndStakeIndex (needChange) = if ((size(i.payments) != T))
689672 then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
690673 else if (!(checkTokensValidity(i.payments)))
691674 then throw("wrong assets attached")
692675 else {
693676 let PIssued = getMinPIssued(i.payments)
694677 let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
695678 let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
696679 $Tuple2(((result ++ [reissue, IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]) ++ indexStakeResult(toString(i.originCaller), PIssued)), PIssued)
697680 }
698681
699682
700683
701684 @Callable(i)
702-func unstakeIndex (shareAmount) = {
703- let addressStr = toString(i.originCaller)
704- let shareAvailable = tryGetInteger((addressStr + "_indexStaked"))
705- if ((shareAmount > shareAvailable))
706- then throw("you don't have index tokens available")
707- else (claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (shareAvailable - shareAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - shareAmount)), ScriptTransfer(i.caller, shareAmount, getBinaryValue("global_poolToken_id"))])
708- }
709-
710-
711-
712-@Callable(i)
713685 func claimIndexRewards () = claimResult(i.caller)
714-
715-
716-
717-@Callable(i)
718-func redeemIndex (sendToOrigin) = {
719- let pmt = i.payments[0]
720- if ((pmt.assetId != tryGetBinary("global_poolToken_id")))
721- then throw("please attach pool share token")
722- else {
723- let PRedeemed = pmt.amount
724- let result = handlePoolTokensRedeem(PRedeemed, if (sendToOrigin)
725- then i.originCaller
726- else i.caller)
727- (result ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
728- }
729- }
730686
731687
732688
733689 @Callable(i)
734690 func unstakeAndRedeemIndex (shareAmount) = {
735691 let addressStr = toString(i.originCaller)
736692 let shareAvailable = tryGetInteger((addressStr + "_indexStaked"))
737693 if ((shareAmount > shareAvailable))
738694 then throw("you don't have index tokens available")
739695 else {
740696 let PRedeemed = shareAmount
741697 let result = handlePoolTokensRedeem(PRedeemed, i.originCaller)
742698 (((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))])
743699 }
744700 }
745701
746702
747703
748704 @Callable(i)
749705 func swap (assetOut,minimum) = if (isShutdown())
750706 then throw("Pool is currently shutdown")
751707 else {
752708 let pmt = value(i.payments[0])
753709 let AmountIn = value(i.payments[0].amount)
754710 let AssetIn = pmt.assetId
755711 let invokeSwap = asIntTuple(reentrantInvoke(this, "swapInternal", [assetOut, minimum, AmountIn, getAssetString(AssetIn), toString(i.caller)], nil))
756712 if ((invokeSwap == invokeSwap))
757713 then {
758714 let cleanAmountOut = invokeSwap._1
759715 if ((cleanAmountOut == cleanAmountOut))
760716 then {
761717 let feeAmount = invokeSwap._2
762718 if ((feeAmount == feeAmount))
763719 then {
764720 let topUp = if ((assetOut == "WAVES"))
765721 then {
766722 let unstake = reentrantInvoke(this, "internal", [false, (cleanAmountOut + fraction(feeAmount, 3, 4)), "WAVES"], nil)
767723 if ((unstake == unstake))
768724 then [ScriptTransfer(getFeesAccount(), fraction(feeAmount, 2, 4), getAssetBytes(assetOut))]
769725 else throw("Strict value is not equal to itself.")
770726 }
771727 else [ScriptTransfer(getFeesAccount(), fraction(feeAmount, 2, 4), getAssetBytes(assetOut))]
772728 if ((topUp == topUp))
773729 then $Tuple2(topUp, cleanAmountOut)
774730 else throw("Strict value is not equal to itself.")
775731 }
776732 else throw("Strict value is not equal to itself.")
777733 }
778734 else throw("Strict value is not equal to itself.")
779735 }
780736 else throw("Strict value is not equal to itself.")
781737 }
782738
783739
784740
785741 @Callable(i)
786742 func internal (stake,amount,assetId) = if ((i.caller != this))
787743 then throw("Not allowed")
788744 else stakeUnstake(stake, amount, assetId)
789745
790746
791747
792748 @Callable(i)
793749 func stakeAll () = stakeUnstake(true, (tryGetInteger("global_WAVES_balance") - tryGetInteger("leasing_amount")), "WAVES")
794750
795751
796752
797753 @Callable(i)
798754 func swapInternal (assetOut,minimum,AmountIn,AssetIn,caller) = if ((i.caller != this))
799755 then throw("You cant call this directly")
800756 else {
801757 let AssetOut = getAssetBytes(assetOut)
802758 let day = calculateDaysSinceStart()
803759 let reveneu = tryGetInteger(reveneuForDayByAsset(day, assetOut))
804760 let AssetInBalance = tryGetInteger((("global_" + AssetIn) + "_balance"))
805761 if ((AssetInBalance == AssetInBalance))
806762 then {
807763 let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
808764 if ((AssetOutBalance == AssetOutBalance))
809765 then {
810766 let AmountOut = calculateOutAmount(AmountIn, getAssetBytes(AssetIn), AssetOut, AssetInBalance, AssetOutBalance)
811767 if ((AmountOut == AmountOut))
812768 then {
813769 let feeAmount = fraction(AmountOut, Fee, FeeScale)
814770 if ((feeAmount == feeAmount))
815771 then {
816772 let cleanAmountOut = (AmountOut - feeAmount)
817773 if ((cleanAmountOut == cleanAmountOut))
818774 then if ((minimum > cleanAmountOut))
819775 then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
820776 else if ((0 > (AssetOutBalance - AmountOut)))
821777 then throw("contract is out of reserves")
822778 else if ((AssetOut == getAssetBytes(AssetIn)))
823779 then throw("this swap is not allowed")
824780 else {
825781 let newBalanceIn = (AssetInBalance + AmountIn)
826782 if ((newBalanceIn == newBalanceIn))
827783 then {
828784 let stake = reentrantInvoke(this, "internal", [true, AmountIn, AssetIn], nil)
829785 if ((stake == stake))
830786 then {
831787 let newBalanceOut = (AssetOutBalance - AmountOut)
832788 if ((newBalanceOut == newBalanceOut))
833789 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))
834790 else throw("Strict value is not equal to itself.")
835791 }
836792 else throw("Strict value is not equal to itself.")
837793 }
838794 else throw("Strict value is not equal to itself.")
839795 }
840796 else throw("Strict value is not equal to itself.")
841797 }
842798 else throw("Strict value is not equal to itself.")
843799 }
844800 else throw("Strict value is not equal to itself.")
845801 }
846802 else throw("Strict value is not equal to itself.")
847803 }
848804 else throw("Strict value is not equal to itself.")
849805 }
850806
851807
852808 @Verifier(tx)
853809 func verify () = if (isTestEnv())
854810 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
855811 else {
856812 let firstUser = base58'FzsTVRXqD46KW5yj6qGNVrsouvWjpCQvD1446A96iGt4'
857813 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
858814 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
859815 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
860816 then 1
861817 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
862818 then 1
863819 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
864820 then 1
865821 else 0
866822 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
867823 then 1
868824 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
869825 then 1
870826 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
871827 then 1
872828 else 0
873829 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
874830 then 1
875831 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
876832 then 1
877833 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
878834 then 1
879835 else 0
880836 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
881837 match tx {
882838 case _ =>
883839 (signaturesCount >= 2)
884840 }
885841 }
886842

github/deemru/w8io/786bc32 
204.06 ms