tx · 3ApXhpEpzLnhPGWfd1jugwrzbuBTBak5LamfMd5T58g3

3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy:  -0.04000000 Waves

2022.08.09 19:47 [2177184] smart account 3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy > SELF 0.00000000 Waves

{ "type": 13, "id": "3ApXhpEpzLnhPGWfd1jugwrzbuBTBak5LamfMd5T58g3", "fee": 4000000, "feeAssetId": null, "timestamp": 1660063677878, "version": 1, "sender": "3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy", "senderPublicKey": "FK9j3YFWVChXKESTn33fMZz1JseCNMMqHhfB7smxJo4e", "proofs": [ "m9Z2CiWcrXN8aWLQ6U4faC9bZAXFwnD4i6JCxPuqW8Hp3vfP44pZKz8UM2HEMxp9iNshtvHkud8JLMsnP1ad84v" ], "script": "base64:BgIqCAISBQoDAQgIEgASABIDCgEBEgASABIAEgMKAQgSBAoCCAESAwoBARIAUAAJc2VwYXJhdG9yAgJfXwADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAZNVUxUWDYJALYCAQUFTVVMVDYABk1VTFRYOAkAtgIBBQVNVUxUOAAHTVVMVFgxOAkAtgIBAICAkLu61q3wDQAKV0FWRVNJRFNUUgIFV0FWRVMAB1dBVkVTSUQJANkEAQUKV0FWRVNJRFNUUgAZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAABABhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAAgAUSWR4Q29udHJvbENmZ1JwZERhcHAAAwAVSWR4Q29udHJvbENmZ01hdGhEYXBwAAQAHElkeENvbnRyb2xDZmdMaXF1aWRhdGlvbkRhcHAABQAVSWR4Q29udHJvbENmZ1Jlc3REYXBwAAYAHUlkeENvbnRyb2xDZmdOb2RlUmVnaXN0cnlEYXBwAAcAHElkeENvbnRyb2xDZmdOc2J0U3Rha2luZ0RhcHAACAAZSWR4Q29udHJvbENmZ01lZGlhdG9yRGFwcAAJABxJZHhDb250cm9sQ2ZnU3VyZlN0YWtpbmdEYXBwAAoAIElkeENvbnRyb2xDZmdHbnNidENvbnRyb2xsZXJEYXBwAAsBD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJAKwCAgkArAICCQCsAgIJAKwCAgIKbWFuZGF0b3J5IAkApQgBBQdhZGRyZXNzAgEuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAERa2V5Q29udHJvbEFkZHJlc3MAAhwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQ1rZXlDb250cm9sQ2ZnAAIRJXNfX2NvbnRyb2xDb25maWcBFWtleUduc2J0RnJvbVN1cmZDb2VmZgACHSVzJXNfX2NmZ19fZ25zYnRGcm9tU3VyZkNvZWZmARRyZWFkQ29udHJvbENmZ09yRmFpbAEHY29udHJvbAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUHY29udHJvbAkBDWtleUNvbnRyb2xDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIKY29udHJvbENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCmNvbnRyb2xDZmcFA2lkeAkArAICAi1Db250cm9sIGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AA9jb250cm9sQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBEWtleUNvbnRyb2xBZGRyZXNzAAIjM040TlM3ZDRKbzlhNkYxNExpRlVLS1lWZFVra2YyZVA0WngACmNvbnRyb2xDZmcJARRyZWFkQ29udHJvbENmZ09yRmFpbAEFD2NvbnRyb2xDb250cmFjdAAMbWF0aENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUVSWR4Q29udHJvbENmZ01hdGhEYXBwABBuZXV0cmlub0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAPYXVjdGlvbkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwABJnbnNidEZyb21TdXJmQ29lZmYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFWtleUduc2J0RnJvbVN1cmZDb2VmZgAArAIBDGtleUJvbmRBc3NldAACDWJvbmRfYXNzZXRfaWQBGWtleUF1Y3Rpb25Db250cmFjdEFkZHJlc3MAAhBhdWN0aW9uX2NvbnRyYWN0ARBrZXlNaW5Mb2NrQW1vdW50AAIRJXNfX21pbkxvY2tBbW91bnQBEGtleVN0YWtlZEFzc2V0SWQAAhElc19fc3Rha2VkQXNzZXRJZAEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgILcGFyYW1CeVVzZXIJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCAgZhbW91bnQFA25pbAUJc2VwYXJhdG9yARZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAICBXN0YXJ0BQNuaWwFCXNlcGFyYXRvcgEma2V5TG9ja1BhcmFtVm90aW5nUG93ZXJFZmZlY3RpdmVIZWlnaHQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICC3BhcmFtQnlVc2VyCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgIRdnBFZmZlY3RpdmVIZWlnaHQFA25pbAUJc2VwYXJhdG9yARBrZXlIaXN0b3J5UmVjb3JkAwR0eXBlC3VzZXJBZGRyZXNzBHR4SWQJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIFBHR5cGUJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUJc2VwYXJhdG9yARdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICEWFjdGl2ZVRvdGFsTG9ja2VkBQNuaWwFCXNlcGFyYXRvcgESa2V5U3RhdHNMb2Nrc0NvdW50AAkAuQkCCQDMCAICBCVzJXMJAMwIAgIFc3RhdHMJAMwIAgIKbG9ja3NDb3VudAUDbmlsBQlzZXBhcmF0b3IBEmtleVN0YXRzVXNlcnNDb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICEGFjdGl2ZVVzZXJzQ291bnQFA25pbAUJc2VwYXJhdG9yAQ1rZXlOZXh0UGVyaW9kAAIOJXNfX25leHRQZXJpb2QBGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwACFXN1cHBvcnRlZFJld2FyZEFzc2V0cwERa2V5RGVwb3NpdE51bUxhc3QACQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICA2RlcAkAzAgCAgdsYXN0TnVtBQNuaWwFCXNlcGFyYXRvcgEba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhF1c2VyUndkRnJvbURlcE51bQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBFWtleVJld2FyZFBlck5zYnRTdW1BdAIKZGVwb3NpdE51bQN0a24JALkJAgkAzAgCAgQlcyVkCQDMCAICFXJ3ZFBlck5zYnRTdW1CeURlcE51bQkAzAgCCQCkAwEFCmRlcG9zaXROdW0JAMwIAgUDdGtuBQNuaWwFCXNlcGFyYXRvcgEJa2V5UmV3YXJkAgt1c2VyQWRkcmVzcwN0a24JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIDcndkCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBCmtleUNsYWltZWQCC3VzZXJBZGRyZXNzA3RrbgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgNjbG0JAMwIAgULdXNlckFkZHJlc3MJAMwIAgUDdGtuBQNuaWwFCXNlcGFyYXRvcgEXa2V5Tm90RGlzdHJpYnV0ZWRSZXdhcmQBA3RrbgkAuQkCCQDMCAICBCVzJXMJAMwIAgIObm90RGlzdHJpYnV0ZWQJAMwIAgUDdGtuBQNuaWwFCXNlcGFyYXRvcgEFdG9YMTgCB29yaWdWYWwIb3JpZ011bHQJALwCAwkAtgIBBQdvcmlnVmFsBQdNVUxUWDE4BQhvcmlnTXVsdAEMZ2V0SW50T3JaZXJvAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABDGdldEludE9yRWxzZQIDa2V5CmRlZmF1bHRWYWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5BQpkZWZhdWx0VmFsAQxnZXRJbnRPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFA2tleQkArAICCQCsAgICD01hbmRhdG9yeSB0aGlzLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBDGdldFN0ck9yRWxzZQIDa2V5CmRlZmF1bHRWYWwJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5BQpkZWZhdWx0VmFsAQ90b0FkZHJlc3NPckZhaWwBCmFkZHJlc3NTdHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQphZGRyZXNzU3RyCQCsAgICIWNvdWxkbid0IHBhcnNlIHBhc3NlZCBhZGRyZXNzU3RyPQUKYWRkcmVzc1N0cgELdG9Bc3NldFZlY3QBCGFzc2V0U3RyAwkAAAIFCGFzc2V0U3RyBQpXQVZFU0lEU1RSBQR1bml0CQDZBAEFCGFzc2V0U3RyAQVhc0ludAEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIDSW50BAZ2YWxJbnQFByRtYXRjaDAFBnZhbEludAkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAESYXNTd2FwUGFyYW1zU1RSVUNUAQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACGShJbnQsIEludCwgSW50LCBJbnQsIEludCkEBnN0cnVjdAUHJG1hdGNoMAUGc3RydWN0CQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50ARNmb3JtYXRIaXN0b3J5UmVjb3JkBAlvbGRBbW91bnQIb2xkU3RhcnQJbmV3QW1vdW50CG5ld1N0YXJ0CQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFCW9sZEFtb3VudAkAzAgCCQCkAwEFCG9sZFN0YXJ0CQDMCAIJAKQDAQUJbmV3QW1vdW50CQDMCAIJAKQDAQUIbmV3U3RhcnQFA25pbAUJc2VwYXJhdG9yARhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQCBHVzZXIOY2xhaW1lZFJld2FyZHMJALkJAgkAzAgCAgglcyVkJWQlcwkAzAgCBQR1c2VyCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCBQ5jbGFpbWVkUmV3YXJkcwUDbmlsBQlzZXBhcmF0b3IBEkhpc3RvcnlSZWNvcmRFbnRyeQcEdHlwZQt1c2VyQWRkcmVzcwR0eElkCW9sZEFtb3VudAhvbGRTdGFydAluZXdBbW91bnQIbmV3U3RhcnQJAQtTdHJpbmdFbnRyeQIJARBrZXlIaXN0b3J5UmVjb3JkAwUEdHlwZQULdXNlckFkZHJlc3MFBHR4SWQJARNmb3JtYXRIaXN0b3J5UmVjb3JkBAUJb2xkQW1vdW50BQhvbGRTdGFydAUJbmV3QW1vdW50BQhuZXdTdGFydAERQ2xhaW1IaXN0b3J5RW50cnkDC3VzZXJBZGRyZXNzBHR4SWQOY2xhaW1lZFJld2FyZHMJAQtTdHJpbmdFbnRyeQIJARBrZXlIaXN0b3J5UmVjb3JkAwIFY2xhaW0FC3VzZXJBZGRyZXNzBQR0eElkCQEYZm9ybWF0Q2xhaW1IaXN0b3J5UmVjb3JkAgkApQgBBQt1c2VyQWRkcmVzcwUOY2xhaW1lZFJld2FyZHMBC1N0YXRzUmVzdWx0Aw50b3RhbExvY2tlZEluYwxsb2NrQ291bnRJbmMNdXNlcnNDb3VudEluYwQKbG9ja3NDb3VudAkBDGdldEludE9yWmVybwEJARJrZXlTdGF0c0xvY2tzQ291bnQABAp1c2Vyc0NvdW50CQEMZ2V0SW50T3JaZXJvAQkBEmtleVN0YXRzVXNlcnNDb3VudAAEC3RvdGFsQW1vdW50CQEMZ2V0SW50T3JaZXJvAQkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAQOdG90YWxBbW91bnROZXcJAGQCBQt0b3RhbEFtb3VudAUOdG90YWxMb2NrZWRJbmMJAJUKAwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVN0YXRzTG9ja3NDb3VudAAJAGQCBQpsb2Nrc0NvdW50BQxsb2NrQ291bnRJbmMJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlTdGF0c1VzZXJzQ291bnQACQBkAgUKdXNlcnNDb3VudAUNdXNlcnNDb3VudEluYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAUOdG90YWxBbW91bnROZXcFA25pbAULdG90YWxBbW91bnQFDnRvdGFsQW1vdW50TmV3AQ9Mb2NrUGFyYW1zRW50cnkDC3VzZXJBZGRyZXNzBmFtb3VudBp2b3RpbmdQb3dlckVmZmVjdGl2ZUhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleUxvY2tQYXJhbVVzZXJBbW91bnQBBQt1c2VyQWRkcmVzcwUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBRp2b3RpbmdQb3dlckVmZmVjdGl2ZUhlaWdodAUDbmlsAQ9nZXRQYXJhbXNPckZhaWwACQCUCgIJANkEAQkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJARBrZXlTdGFrZWRBc3NldElkAAkBDGdldEludE9yRmFpbAEJARBrZXlNaW5Mb2NrQW1vdW50AAEMaXNBY3RpdmVVc2VyAQt1c2VyQWRkcmVzcwkAZgIJAQxnZXRJbnRPckVsc2UCCQEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAEFC3VzZXJBZGRyZXNzAAAAAAETZ2V0VXNlclBhcmFtc09yVW5pdAELdXNlckFkZHJlc3MDCQEMaXNBY3RpdmVVc2VyAQULdXNlckFkZHJlc3MJAJUKAwcJAQxnZXRJbnRPckZhaWwBCQEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAEFC3VzZXJBZGRyZXNzCQEMZ2V0SW50T3JGYWlsAQkBFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sBBQt1c2VyQWRkcmVzcwUEdW5pdAETZ2V0VXNlclBhcmFtc09yRmFpbAELdXNlckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkArAICCQCsAgICBVVzZXIgCQClCAEFC3VzZXJBZGRyZXNzAg8gaXMgbm90IGRlZmluZWQAEnN1cHBvcnRlZEFzc2V0c1N0cgkBDGdldFN0ck9yRWxzZQIJARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAgAAE3N1cHBvcnRlZEFzc2V0c0xpc3QJALUJAgUSc3VwcG9ydGVkQXNzZXRzU3RyAgFfAQpjYWxjUmV3YXJkBQt1c2VyQWRkcmVzcwdhc3NldElkDXN0YWtlZEFtb3VudFgOZGVwb3NpdE51bVVzZXIOZGVwb3NpdE51bUxhc3QEF3Jld2FyZFBlck5zYnRTdW1MYXN0S0VZCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bUxhc3QFB2Fzc2V0SWQECnN1bUxhc3RYMTgJAKcDAQkBDGdldFN0ck9yRWxzZQIJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUHYXNzZXRJZAIBMAQKc3VtVXNlclgxOAkApwMBCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1Vc2VyBQdhc3NldElkAgEwBBFyZXdhcmREeW5hbWljUGFydAkAoAMBCQC8AgMJALgCAgUKc3VtTGFzdFgxOAUKc3VtVXNlclgxOAUNc3Rha2VkQW1vdW50WAUHTVVMVFgxOAQTcmV3YXJkQ2FjaGVkUGFydEtFWQkBCWtleVJld2FyZAIFC3VzZXJBZGRyZXNzBQdhc3NldElkBBByZXdhcmRDYWNoZWRQYXJ0CQEMZ2V0SW50T3JFbHNlAgUTcmV3YXJkQ2FjaGVkUGFydEtFWQAACQCWCgQJAGQCBRByZXdhcmRDYWNoZWRQYXJ0BRFyZXdhcmREeW5hbWljUGFydAUQcmV3YXJkQ2FjaGVkUGFydAURcmV3YXJkRHluYW1pY1BhcnQFE3Jld2FyZENhY2hlZFBhcnRLRVkBDVJld2FyZEVudHJpZXMDCWlzTmV3VXNlcgt1c2VyQWRkcmVzcwxzdGFrZWRBbW91bnQEDXN0YWtlZEFtb3VudFgJALYCAQUMc3Rha2VkQW1vdW50BBt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkJARtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0BBQt1c2VyQWRkcmVzcwQOZGVwb3NpdE51bVVzZXIJAQxnZXRJbnRPckVsc2UCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkA////////////AQQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCCQERa2V5RGVwb3NpdE51bUxhc3QAAP///////////wEKARtmb3JFYWNoQXNzZXRDYWNoZVVzZXJSZXdhcmQCBWFjY3VtBWFzc2V0BAskdDA4OTQyOTA3NwkBCmNhbGNSZXdhcmQFBQt1c2VyQWRkcmVzcwUFYXNzZXQFDXN0YWtlZEFtb3VudFgFDmRlcG9zaXROdW1Vc2VyBQ5kZXBvc2l0TnVtTGFzdAQLcmV3YXJkVG90YWwIBQskdDA4OTQyOTA3NwJfMQQGY2FjaGVkCAULJHQwODk0MjkwNzcCXzIEB2R5bmFtaWMIBQskdDA4OTQyOTA3NwJfMwQTcmV3YXJkQ2FjaGVkUGFydEtFWQgFCyR0MDg5NDI5MDc3Al80CQDNCAIFBWFjY3VtCQEMSW50ZWdlckVudHJ5AgUTcmV3YXJkQ2FjaGVkUGFydEtFWQULcmV3YXJkVG90YWwDAwkAAAIFDmRlcG9zaXROdW1MYXN0AP///////////wEJAAACBQ5kZXBvc2l0TnVtVXNlcgD///////////8BBwUDbmlsAwMJAAACBQ5kZXBvc2l0TnVtTGFzdAD///////////8BCQBmAgUOZGVwb3NpdE51bVVzZXIA////////////AQcJAAIBAi9pbnZhbGlkIGRlcG9zaXROdW1MYXN0IGFuZCBkZXBvc2l0TnVtVXNlciBzdGF0ZQMDCQBmAgUOZGVwb3NpdE51bUxhc3QA////////////AQkAZwIFDmRlcG9zaXROdW1Vc2VyAP///////////wEHAwUJaXNOZXdVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkFDmRlcG9zaXROdW1MYXN0BQNuaWwJAM0IAgoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARtmb3JFYWNoQXNzZXRDYWNoZVVzZXJSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAQxJbnRlZ2VyRW50cnkCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkFDmRlcG9zaXROdW1MYXN0CQACAQkArAICCQCsAgIJAKwCAgIkdW5jb3ZlcmVkIGNvbmRpdGlvbjogZGVwb3NpdE51bUxhc3Q9CQCkAwEFDmRlcG9zaXROdW1MYXN0AhAgZGVwb3NpdE51bVVzZXI9CQCkAwEFDmRlcG9zaXROdW1Vc2VyASJJbmNyZW1lbnROb3REaXN0cmlidXRlZFJld2FyZEVudHJ5AgN0a24JYW1vdW50SW5jBBdub3REaXN0cmlidXRlZFJld2FyZEtFWQkBF2tleU5vdERpc3RyaWJ1dGVkUmV3YXJkAQUDdGtuBBRub3REaXN0cmlidXRlZFJld2FyZAkBDGdldEludE9yRWxzZQIFF25vdERpc3RyaWJ1dGVkUmV3YXJkS0VZAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFF25vdERpc3RyaWJ1dGVkUmV3YXJkS0VZCQBkAgUUbm90RGlzdHJpYnV0ZWRSZXdhcmQFCWFtb3VudEluYwUDbmlsAQtzdXJmVG9HbnNidAEHc3VyZkFtdAkAaQIFB3N1cmZBbXQFEmduc2J0RnJvbVN1cmZDb2VmZgEfbWVyZ2VWb3RpbmdQb3dlckVmZmVjdGl2ZUhlaWdodAQQcXVhcmFudGluZVBlcmlvZBF2cEVmZmVjdGl2ZUhlaWdodAlzdGFrZWRBbXQMc3Rha2VkQW10TkVXBA9yZW1haW5pbmdUb1dhaXQJAGUCBRF2cEVmZmVjdGl2ZUhlaWdodAUGaGVpZ2h0AwkAZwIAAAUPcmVtYWluaW5nVG9XYWl0CQBkAgUGaGVpZ2h0BRBxdWFyYW50aW5lUGVyaW9kBA1hbHJlYWR5V2FpdGVkCQBlAgUQcXVhcmFudGluZVBlcmlvZAUPcmVtYWluaW5nVG9XYWl0BANrWDgDCQECIT0CBQxzdGFrZWRBbXRORVcAAAkAawMFCXN0YWtlZEFtdAUFTVVMVDgFDHN0YWtlZEFtdE5FVwURdnBFZmZlY3RpdmVIZWlnaHQJAGUCCQBkAgUQcXVhcmFudGluZVBlcmlvZAUGaGVpZ2h0CQBrAwUNYWxyZWFkeVdhaXRlZAUDa1g4BQVNVUxUOAEKbWVyZ2VTdGFrZQILdXNlckFkZHJlc3MLYW1vdW50VG9BZGQEDSR0MDEyNzMwMTI4NDAJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAAABAlpc05ld1VzZXIIBQ0kdDAxMjczMDEyODQwAl8xBAxzdGFrZWRBbW91bnQIBQ0kdDAxMjczMDEyODQwAl8yBBF2cEVmZmVjdGl2ZUhlaWdodAgFDSR0MDEyNzMwMTI4NDACXzMED3N0YWtlZEFtb3VudE5FVwMFCWlzTmV3VXNlcgULYW1vdW50VG9BZGQJAGQCBQthbW91bnRUb0FkZAUMc3Rha2VkQW1vdW50BBBxdWFyYW50aW5lUGVyaW9kCQBoAgCgCwAOBBR2cEVmZmVjdGl2ZUhlaWdodE5FVwMFCWlzTmV3VXNlcgkAZAIFEHF1YXJhbnRpbmVQZXJpb2QFBmhlaWdodAkBH21lcmdlVm90aW5nUG93ZXJFZmZlY3RpdmVIZWlnaHQEBRBxdWFyYW50aW5lUGVyaW9kBRF2cEVmZmVjdGl2ZUhlaWdodAUMc3Rha2VkQW1vdW50BQ9zdGFrZWRBbW91bnRORVcJAJcKBQUJaXNOZXdVc2VyBQxzdGFrZWRBbW91bnQFEXZwRWZmZWN0aXZlSGVpZ2h0BQ9zdGFrZWRBbW91bnRORVcFFHZwRWZmZWN0aXZlSGVpZ2h0TkVXAQtjb21tb25TdGFrZQILdXNlckFkZHJlc3MBaQQNJHQwMTMzMjYxMzM4MAkBD2dldFBhcmFtc09yRmFpbAAEDXN0YWtlZEFzc2V0SWQIBQ0kdDAxMzMyNjEzMzgwAl8xBA1taW5Mb2NrQW1vdW50CAUNJHQwMTMzMjYxMzM4MAJfMgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECFUludmFsaWQgcGF5bWVudHMgc2l6ZQQHcGF5bWVudAkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQIBQdwYXltZW50BmFtb3VudAQTaW52YWxpZEFzc2V0TWVzc2FnZQkArAICCQCsAgICD0ludmFsaWQgYXNzZXQuIAkA2AQBBQ1zdGFrZWRBc3NldElkAgwgaXMgZXhwZWN0ZWQEB2Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFB3BheW1lbnQHYXNzZXRJZAUTaW52YWxpZEFzc2V0TWVzc2FnZQMJAQIhPQIFB2Fzc2V0SWQFDXN0YWtlZEFzc2V0SWQJAAIBBRNpbnZhbGlkQXNzZXRNZXNzYWdlBA51c2VyQWRkcmVzc1N0cgkApQgBBQt1c2VyQWRkcmVzcwQKbWVyZ2VkRGF0YQkBCm1lcmdlU3Rha2UCBQt1c2VyQWRkcmVzcwUGYW1vdW50BAlpc05ld1VzZXIIBQptZXJnZWREYXRhAl8xBAxzdGFrZWRBbW91bnQIBQptZXJnZWREYXRhAl8yBBF2cEVmZmVjdGl2ZUhlaWdodAgFCm1lcmdlZERhdGECXzMED3N0YWtlZEFtb3VudE5FVwgFCm1lcmdlZERhdGECXzQEFHZwRWZmZWN0aXZlSGVpZ2h0TkVXCAUKbWVyZ2VkRGF0YQJfNQMJAGYCBQ1taW5Mb2NrQW1vdW50BQ9zdGFrZWRBbW91bnRORVcJAAIBCQCsAgICE01pbiBsb2NrIGFtb3VudCBpcyAJAKQDAQUNbWluTG9ja0Ftb3VudAQNJHQwMTQxNzkxNDI4MQkBC1N0YXRzUmVzdWx0AwUGYW1vdW50AAEDBQlpc05ld1VzZXIAAQAABAxzdGF0c0VudHJpZXMIBQ0kdDAxNDE3OTE0MjgxAl8xBAt0b3RhbFN0YWtlZAgFDSR0MDE0MTc5MTQyODECXzIEDnRvdGFsU3Rha2VkTmV3CAUNJHQwMTQxNzkxNDI4MQJfMwkAzggCCQDOCAIJAM4IAgkAzAgCCQESSGlzdG9yeVJlY29yZEVudHJ5BwIFc3Rha2UFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkBQxzdGFrZWRBbW91bnQFEXZwRWZmZWN0aXZlSGVpZ2h0BQ9zdGFrZWRBbW91bnRORVcFFHZwRWZmZWN0aXZlSGVpZ2h0TkVXBQNuaWwJAQ1SZXdhcmRFbnRyaWVzAwUJaXNOZXdVc2VyBQ51c2VyQWRkcmVzc1N0cgUMc3Rha2VkQW1vdW50CQEPTG9ja1BhcmFtc0VudHJ5AwULdXNlckFkZHJlc3MFD3N0YWtlZEFtb3VudE5FVwUUdnBFZmZlY3RpdmVIZWlnaHRORVcFDHN0YXRzRW50cmllcwELY29tbW9uQ2xhaW0CC3VzZXJBZGRyZXNzAWkEDnVzZXJBZGRyZXNzU3RyCQClCAEFC3VzZXJBZGRyZXNzAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECGXBheW1lbnRzIGFyZSBub3QgYWNjZXB0ZWQEDSR0MDE0NzYwMTQ4NjUJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAAABAlpc05ld1VzZXIIBQ0kdDAxNDc2MDE0ODY1Al8xBAxzdGFrZWRBbW91bnQIBQ0kdDAxNDc2MDE0ODY1Al8yBAxzdGFraW5nU3RhcnQIBQ0kdDAxNDc2MDE0ODY1Al8zBA1zdGFrZWRBbW91bnRYCQC2AgEFDHN0YWtlZEFtb3VudAQbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAQUOdXNlckFkZHJlc3NTdHIEDmRlcG9zaXROdW1Vc2VyCQEMZ2V0SW50T3JFbHNlAgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP///////////wEEDmRlcG9zaXROdW1MYXN0CQEMZ2V0SW50T3JFbHNlAgkBEWtleURlcG9zaXROdW1MYXN0AAD///////////8BCgEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFYWNjdW0FYXNzZXQEDSR0MDE1MjM2MTUzNzQJAQpjYWxjUmV3YXJkBQUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BQ1zdGFrZWRBbW91bnRYBQ5kZXBvc2l0TnVtVXNlcgUOZGVwb3NpdE51bUxhc3QEC3Jld2FyZFRvdGFsCAUNJHQwMTUyMzYxNTM3NAJfMQQGY2FjaGVkCAUNJHQwMTUyMzYxNTM3NAJfMgQHZHluYW1pYwgFDSR0MDE1MjM2MTUzNzQCXzMEE3Jld2FyZENhY2hlZFBhcnRLRVkIBQ0kdDAxNTIzNjE1Mzc0Al80BApjbGFpbWVkS0VZCQEKa2V5Q2xhaW1lZAIFDnVzZXJBZGRyZXNzU3RyBQVhc3NldAQNJHQwMTU0MzQxNTQ3MQUFYWNjdW0EBGRhdGEIBQ0kdDAxNTQzNDE1NDcxAl8xBBFjbGFpbWVkQW10QnlBc3NldAgFDSR0MDE1NDM0MTU0NzECXzIEB25ld1BhcnQJALkJAgkAzAgCBQVhc3NldAkAzAgCCQCkAwEFC3Jld2FyZFRvdGFsBQNuaWwCAToEFGNsYWltZWRBbXRCeUFzc2V0TmV3CQC5CQIJAMwIAgURY2xhaW1lZEFtdEJ5QXNzZXQJAMwIAgUHbmV3UGFydAUDbmlsAgFfAwkAZwIAAAULcmV3YXJkVG90YWwJAJQKAgUEZGF0YQUUY2xhaW1lZEFtdEJ5QXNzZXROZXcJAJQKAgkAzQgCCQDNCAIJAM0IAgUEZGF0YQkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFC3Jld2FyZFRvdGFsCQELdG9Bc3NldFZlY3QBBQVhc3NldAkBDEludGVnZXJFbnRyeQIFCmNsYWltZWRLRVkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCmNsYWltZWRLRVkAAAULcmV3YXJkVG90YWwJAQxJbnRlZ2VyRW50cnkCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAFFGNsYWltZWRBbXRCeUFzc2V0TmV3BA0kdDAxNTkzMTE2MDQ1CgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAl0cmFuc2ZlcnMIBQ0kdDAxNTkzMTE2MDQ1Al8xBBdjbGFpbWVkQW10QnlBc3NldFJlc3VsdAgFDSR0MDE1OTMxMTYwNDUCXzIDCQBnAgAACQCQAwEFCXRyYW5zZmVycwUDbmlsCQDNCAIJAM0IAgUJdHJhbnNmZXJzCQEMSW50ZWdlckVudHJ5AgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZBQ5kZXBvc2l0TnVtTGFzdAkBEUNsYWltSGlzdG9yeUVudHJ5AwULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJALACAgUXY2xhaW1lZEFtdEJ5QXNzZXRSZXN1bHQAAQsBaQELY29uc3RydWN0b3IDDW1pbkxvY2tBbW91bnQVc3VwcG9ydGVkUmV3YXJkQXNzZXRzDXN0YWtlZEFzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleU1pbkxvY2tBbW91bnQABQ1taW5Mb2NrQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMABRVzdXBwb3J0ZWRSZXdhcmRBc3NldHMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleVN0YWtlZEFzc2V0SWQABQ1zdGFrZWRBc3NldElkBQNuaWwBaQEFc3Rha2UACQELY29tbW9uU3Rha2UCCAUBaQZjYWxsZXIFAWkBaQETc3Rha2VCeU9yaWdpbkNhbGxlcgAJAQtjb21tb25TdGFrZQIIBQFpDG9yaWdpbkNhbGxlcgUBaQFpAQd1bnN0YWtlAQZhbW91bnQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiN1bnN0YWtlIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudAQLdXNlckFkZHJlc3MIBQFpBmNhbGxlcgQOdXNlckFkZHJlc3NTdHIJAKUIAQULdXNlckFkZHJlc3MEDSR0MDE2OTU0MTcwMDgJAQ9nZXRQYXJhbXNPckZhaWwABA1zdGFrZWRBc3NldElkCAUNJHQwMTY5NTQxNzAwOAJfMQQNbWluTG9ja0Ftb3VudAgFDSR0MDE2OTU0MTcwMDgCXzIEDSR0MDE3MDExMTcwOTUJARNnZXRVc2VyUGFyYW1zT3JGYWlsAQULdXNlckFkZHJlc3MECWlzTmV3VXNlcggFDSR0MDE3MDExMTcwOTUCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDE3MDExMTcwOTUCXzIEEXZwRWZmZWN0aXZlSGVpZ2h0CAUNJHQwMTcwMTExNzA5NQJfMwQQc3dhcFBhcmFtc1NUUlVDVAkBEmFzU3dhcFBhcmFtc1NUUlVDVAEJAPwHBAUQbmV1dHJpbm9Db250cmFjdAIbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIAAAUDbmlsBQNuaWwEDHN3YXBMaW1pdE1heAgFEHN3YXBQYXJhbXNTVFJVQ1QCXzEEDnN3YXBMaW1pdFNwZW50CAUQc3dhcFBhcmFtc1NUUlVDVAJfMgQOYmxja3MyTG10UmVzZXQIBRBzd2FwUGFyYW1zU1RSVUNUAl8zAwkAZgIFDnN3YXBMaW1pdFNwZW50AAAJAAIBCQCsAgIJAKwCAgItWW91IGhhdmUgYWxyZWFkeSBtYWRlIGEgc3dhcCBvcGVyYXRpb24uIFdhaXQgCQCkAwEJAGQCBQZoZWlnaHQFDmJsY2tzMkxtdFJlc2V0AhIgaGVpZ2h0IHRvIHVuc3Rha2UDCQBnAgAABQxzdGFrZWRBbW91bnQJAAIBAhJOb3RoaW5nIHRvIHVuc3Rha2UDCQBmAgUGYW1vdW50BQxzdGFrZWRBbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAgpSZXF1ZXN0ZWQgCQCkAwEFBmFtb3VudAISLCBidXQgc3Rha2VkIG9ubHkgCQCkAwEFDHN0YWtlZEFtb3VudAQPc3Rha2VkQW1vdW50TkVXCQBlAgUMc3Rha2VkQW1vdW50BQZhbW91bnQEDSR0MDE3NzUzMTc5MTEJAQtTdGF0c1Jlc3VsdAMJAQEtAQUGYW1vdW50AwkAAAIFBmFtb3VudAUMc3Rha2VkQW1vdW50AP///////////wEAAAMJAAACBQZhbW91bnQFDHN0YWtlZEFtb3VudAD///////////8BAAAEDHN0YXRzRW50cmllcwgFDSR0MDE3NzUzMTc5MTECXzEEC3RvdGFsU3Rha2VkCAUNJHQwMTc3NTMxNzkxMQJfMgQOdG90YWxTdGFrZWROZXcIBQ0kdDAxNzc1MzE3OTExAl8zCQDOCAIJAM4IAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQZhbW91bnQFDXN0YWtlZEFzc2V0SWQJAMwIAgkBEkhpc3RvcnlSZWNvcmRFbnRyeQcCB3Vuc3Rha2UFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkBQxzdGFrZWRBbW91bnQFEXZwRWZmZWN0aXZlSGVpZ2h0BQ9zdGFrZWRBbW91bnRORVcFEXZwRWZmZWN0aXZlSGVpZ2h0BQNuaWwJAQ1SZXdhcmRFbnRyaWVzAwcFDnVzZXJBZGRyZXNzU3RyBQxzdGFrZWRBbW91bnQJAQ9Mb2NrUGFyYW1zRW50cnkDBQt1c2VyQWRkcmVzcwUPc3Rha2VkQW1vdW50TkVXBRF2cEVmZmVjdGl2ZUhlaWdodAUMc3RhdHNFbnRyaWVzAWkBB2RlcG9zaXQAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIfZXhhY3QgMSBwYXltZW50IGlzIGFsbG93ZWQgb25seQQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIIBQNwbXQHYXNzZXRJZAUHV0FWRVNJRAQNcG10QXNzZXRJZFN0cgkA2AQBBQpwbXRBc3NldElkBAhwbXRNdWx0WAMJAAACBQpwbXRBc3NldElkBQdXQVZFU0lEBQZNVUxUWDgFBk1VTFRYNgQHYW1vdW50WAkAtgIBBQZhbW91bnQEC3RvdGFsU3Rha2VkCQEMZ2V0SW50T3JFbHNlAgkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAABAx0b3RhbFN0YWtlZFgJALYCAQULdG90YWxTdGFrZWQDCQBmAgAABQt0b3RhbFN0YWtlZAkAAgECG1RPRE86IGNhc2UgaXMgbm90IHN1cHBvcnRlZAMJAAACBQt0b3RhbFN0YWtlZAAACQEiSW5jcmVtZW50Tm90RGlzdHJpYnV0ZWRSZXdhcmRFbnRyeQIFDXBtdEFzc2V0SWRTdHIFBmFtb3VudAQQcmV3YXJkUGVyTnNidFgxOAkAvAIDBQdhbW91bnRYBQdNVUxUWDE4BQx0b3RhbFN0YWtlZFgEEWRlcG9zaXROdW1MYXN0S0VZCQERa2V5RGVwb3NpdE51bUxhc3QABA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIFEWRlcG9zaXROdW1MYXN0S0VZAP///////////wEEDWRlcG9zaXROdW1OZXcJAGQCBQ5kZXBvc2l0TnVtTGFzdAABAwkBASEBCQEIY29udGFpbnMCBRJzdXBwb3J0ZWRBc3NldHNTdHIFDXBtdEFzc2V0SWRTdHIJAAIBCQCsAgIJAKwCAgUSc3VwcG9ydGVkQXNzZXRzU3RyAhEgZG9lc24ndCBjb250YWluIAUNcG10QXNzZXRJZFN0cgoBF3JlZnJlc2hSZXdhcmRQZXJOc2J0U1VNAgVhY2N1bQluZXh0QXNzZXQEFnJld2FyZFBlck5zYnRTdW1OZXdLRVkJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ1kZXBvc2l0TnVtTmV3BQluZXh0QXNzZXQECnN1bUxhc3RTdHIJAQxnZXRTdHJPckVsc2UCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bUxhc3QFCW5leHRBc3NldAIBMAkAzQgCBQVhY2N1bQMJAAACBQluZXh0QXNzZXQFDXBtdEFzc2V0SWRTdHIJAQtTdHJpbmdFbnRyeQIFFnJld2FyZFBlck5zYnRTdW1OZXdLRVkJAKYDAQkAtwICCQCnAwEFCnN1bUxhc3RTdHIFEHJld2FyZFBlck5zYnRYMTgJAQtTdHJpbmdFbnRyeQIFFnJld2FyZFBlck5zYnRTdW1OZXdLRVkFCnN1bUxhc3RTdHIJAM0IAgoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARdyZWZyZXNoUmV3YXJkUGVyTnNidFNVTQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkBDEludGVnZXJFbnRyeQIFEWRlcG9zaXROdW1MYXN0S0VZBQ1kZXBvc2l0TnVtTmV3AWkBDGNsYWltUmV3YXJkcwAJAQtjb21tb25DbGFpbQIIBQFpBmNhbGxlcgUBaQFpARpjbGFpbVJld2FyZHNCeU9yaWdpbkNhbGxlcgAJAQtjb21tb25DbGFpbQIIBQFpDG9yaWdpbkNhbGxlcgUBaQFpARh1bmNsYWltZWRSZXdhcmRzUkVBRE9OTFkBDnVzZXJBZGRyZXNzU3RyCgEWZm9yRWFjaEFzc2V0WmVyb1Jld2FyZAIFYWNjdW0FYXNzZXQJAKwCAgkArAICBQVhY2N1bQkAuQkCCQDMCAIFBWFzc2V0CQDMCAICATAJAMwIAgIBMAUDbmlsAgE6AgFfBBJ1bmNsYWltZWRSZXdhcmRTdHIDCQAAAgUOdXNlckFkZHJlc3NTdHICAAoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARZmb3JFYWNoQXNzZXRaZXJvUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAt1c2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUOdXNlckFkZHJlc3NTdHIEDSR0MDIwNDg1MjA1OTAJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAAABAlpc05ld1VzZXIIBQ0kdDAyMDQ4NTIwNTkwAl8xBAxzdGFrZWRBbW91bnQIBQ0kdDAyMDQ4NTIwNTkwAl8yBAxzdGFraW5nU3RhcnQIBQ0kdDAyMDQ4NTIwNTkwAl8zBA1zdGFrZWRBbW91bnRYCQC2AgEFDHN0YWtlZEFtb3VudAQbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAQUOdXNlckFkZHJlc3NTdHIEDmRlcG9zaXROdW1Vc2VyCQEMZ2V0SW50T3JFbHNlAgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP///////////wEEDmRlcG9zaXROdW1MYXN0CQEMZ2V0SW50T3JFbHNlAgkBEWtleURlcG9zaXROdW1MYXN0AAD///////////8BCgEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFYWNjdW0FYXNzZXQEDSR0MDIwOTM2MjEwNzQJAQpjYWxjUmV3YXJkBQUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BQ1zdGFrZWRBbW91bnRYBQ5kZXBvc2l0TnVtVXNlcgUOZGVwb3NpdE51bUxhc3QEC3Jld2FyZFRvdGFsCAUNJHQwMjA5MzYyMTA3NAJfMQQGY2FjaGVkCAUNJHQwMjA5MzYyMTA3NAJfMgQHZHluYW1pYwgFDSR0MDIwOTM2MjEwNzQCXzMEE3Jld2FyZENhY2hlZFBhcnRLRVkIBQ0kdDAyMDkzNjIxMDc0Al80BAdjbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJAQprZXlDbGFpbWVkAgUOdXNlckFkZHJlc3NTdHIFBWFzc2V0AAAJAKwCAgkArAICBQVhY2N1bQkAuQkCCQDMCAIFBWFzc2V0CQDMCAIJAKQDAQULcmV3YXJkVG90YWwJAMwIAgkApAMBBQdjbGFpbWVkBQNuaWwCAToCAV8KAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCBQNuaWwJALMCAgUSdW5jbGFpbWVkUmV3YXJkU3RyAAEBaQEWc3VyZlN0YWtpbmdTWVNSRUFET05MWQIVdXNlckFkZHJlc3NTdHJPckVtcHR5CHN1cmZEaWZmBAlzdXJmVG90YWwJAQxnZXRJbnRPckVsc2UCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAAEEmduc2J0RnJvbVN1cmZUb3RhbAkBC3N1cmZUb0duc2J0AQUJc3VyZlRvdGFsAwkAAAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQIACQCUCgIFA25pbAkAzAgCAAAJAMwIAgUJc3VyZlRvdGFsCQDMCAIAAAkAzAgCBRJnbnNidEZyb21TdXJmVG90YWwJAMwIAgAACQDMCAIFBmhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAQLdXNlckFkZHJlc3MJAQ90b0FkZHJlc3NPckZhaWwBBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkECm1lcmdlZERhdGEJAQptZXJnZVN0YWtlAgULdXNlckFkZHJlc3MFCHN1cmZEaWZmBAlpc05ld1VzZXIIBQptZXJnZWREYXRhAl8xBAxzdGFrZWRBbW91bnQIBQptZXJnZWREYXRhAl8yBBF2cEVmZmVjdGl2ZUhlaWdodAgFCm1lcmdlZERhdGECXzMED3N0YWtlZEFtb3VudE5FVwgFCm1lcmdlZERhdGECXzQEFHZwRWZmZWN0aXZlSGVpZ2h0TkVXCAUKbWVyZ2VkRGF0YQJfNQQIc3VyZlVzZXIFDHN0YWtlZEFtb3VudAQRZ25zYnRGcm9tU3VyZlVzZXIJAQtzdXJmVG9HbnNidAEFCHN1cmZVc2VyCQCUCgIFA25pbAkAzAgCBQhzdXJmVXNlcgkAzAgCBQlzdXJmVG90YWwJAMwIAgURZ25zYnRGcm9tU3VyZlVzZXIJAMwIAgUSZ25zYnRGcm9tU3VyZlRvdGFsCQDMCAIFEXZwRWZmZWN0aXZlSGVpZ2h0CQDMCAIFFHZwRWZmZWN0aXZlSGVpZ2h0TkVXBQNuaWwBaQEYZ25zYnRGcm9tU3VyZlNZU1JFQURPTkxZAQdzdXJmQW10CQCUCgIFA25pbAkBC3N1cmZUb0duc2J0AQUHc3VyZkFtdAFpARFjb25maWdTWVNSRUFET05MWQAECm1pbkxvY2tBbXQJARFAZXh0ck5hdGl2ZSgxMDU1KQEJARBrZXlNaW5Mb2NrQW1vdW50AAQgc3VyZlZvdGluZ1Bvd2VyUmVzdHJpY3RpdmVQZXJpb2QJAGgCAKALAA4EG2JyVG9TdGFydFN1cmZUcmFuc2Zvcm1hdGlvbgCwmEYJAJQKAgUDbmlsCQDMCAIFCm1pbkxvY2tBbXQJAMwIAgkAaAIFEmduc2J0RnJvbVN1cmZDb2VmZgUFTVVMVDYJAMwIAgUgc3VyZlZvdGluZ1Bvd2VyUmVzdHJpY3RpdmVQZXJpb2QJAMwIAgUbYnJUb1N0YXJ0U3VyZlRyYW5zZm9ybWF0aW9uBQNuaWwAZRiZyQ==", "chainId": 84, "height": 2177184, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GFD3midDb5GQmYzmU1e1UhA3DVBCZJiHoRYw2dZaGe6b Next: 2UYAH4ZPNW5g4fQtxyKBtSWvgRJwXpEbWG1k3BUafkJA Diff:
OldNewDifferences
5050 func keyControlCfg () = "%s__controlConfig"
5151
5252
53+func keyGnsbtFromSurfCoeff () = "%s%s__cfg__gnsbtFromSurfCoeff"
54+
55+
5356 func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
5457
5558
6568 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
6669
6770 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
71+
72+let gnsbtFromSurfCoeff = valueOrElse(getInteger(this, keyGnsbtFromSurfCoeff()), 300)
6873
6974 func keyBondAsset () = "bond_asset_id"
7075
154159 }
155160
156161
162+func asSwapParamsSTRUCT (v) = match v {
163+ case struct: (Int, Int, Int, Int, Int) =>
164+ struct
165+ case _ =>
166+ throw("fail to cast into Int")
167+}
168+
169+
157170 func formatHistoryRecord (oldAmount,oldStart,newAmount,newStart) = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(oldAmount), toString(oldStart), toString(newAmount), toString(newStart)], separator)
158171
159172
213226 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
214227 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
215228 func forEachAssetCacheUserReward (accum,asset) = {
216- let $t086398774 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
217- let rewardTotal = $t086398774._1
218- let cached = $t086398774._2
219- let dynamic = $t086398774._3
220- let rewardCachedPartKEY = $t086398774._4
229+ let $t089429077 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
230+ let rewardTotal = $t089429077._1
231+ let cached = $t089429077._2
232+ let dynamic = $t089429077._3
233+ let rewardCachedPartKEY = $t089429077._4
221234 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
222235 }
223236
259272 }
260273
261274
262-func surfToGnsbt (surfAmt) = (surfAmt / 300)
275+func surfToGnsbt (surfAmt) = (surfAmt / gnsbtFromSurfCoeff)
263276
264277
265278 func mergeVotingPowerEffectiveHeight (quarantinePeriod,vpEffectiveHeight,stakedAmt,stakedAmtNEW) = {
277290
278291
279292 func mergeStake (userAddress,amountToAdd) = {
280- let $t01241912529 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
281- let isNewUser = $t01241912529._1
282- let stakedAmount = $t01241912529._2
283- let vpEffectiveHeight = $t01241912529._3
293+ let $t01273012840 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
294+ let isNewUser = $t01273012840._1
295+ let stakedAmount = $t01273012840._2
296+ let vpEffectiveHeight = $t01273012840._3
284297 let stakedAmountNEW = if (isNewUser)
285298 then amountToAdd
286299 else (amountToAdd + stakedAmount)
293306
294307
295308 func commonStake (userAddress,i) = {
296- let $t01301513069 = getParamsOrFail()
297- let stakedAssetId = $t01301513069._1
298- let minLockAmount = $t01301513069._2
309+ let $t01332613380 = getParamsOrFail()
310+ let stakedAssetId = $t01332613380._1
311+ let minLockAmount = $t01332613380._2
299312 if ((size(i.payments) != 1))
300313 then throw("Invalid payments size")
301314 else {
316329 if ((minLockAmount > stakedAmountNEW))
317330 then throw(("Min lock amount is " + toString(minLockAmount)))
318331 else {
319- let $t01386813970 = StatsResult(amount, 1, if (isNewUser)
332+ let $t01417914281 = StatsResult(amount, 1, if (isNewUser)
320333 then 1
321334 else 0)
322- let statsEntries = $t01386813970._1
323- let totalStaked = $t01386813970._2
324- let totalStakedNew = $t01386813970._3
335+ let statsEntries = $t01417914281._1
336+ let totalStaked = $t01417914281._2
337+ let totalStakedNew = $t01417914281._3
325338 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeightNEW)) ++ statsEntries)
326339 }
327340 }
334347 if ((size(i.payments) > 0))
335348 then throw("payments are not accepted")
336349 else {
337- let $t01444914554 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
338- let isNewUser = $t01444914554._1
339- let stakedAmount = $t01444914554._2
340- let stakingStart = $t01444914554._3
350+ let $t01476014865 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
351+ let isNewUser = $t01476014865._1
352+ let stakedAmount = $t01476014865._2
353+ let stakingStart = $t01476014865._3
341354 let stakedAmountX = toBigInt(stakedAmount)
342355 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
343356 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
344357 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
345358 func forEachAssetCalcUnclaimedReward (accum,asset) = {
346- let $t01492515063 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
347- let rewardTotal = $t01492515063._1
348- let cached = $t01492515063._2
349- let dynamic = $t01492515063._3
350- let rewardCachedPartKEY = $t01492515063._4
359+ let $t01523615374 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
360+ let rewardTotal = $t01523615374._1
361+ let cached = $t01523615374._2
362+ let dynamic = $t01523615374._3
363+ let rewardCachedPartKEY = $t01523615374._4
351364 let claimedKEY = keyClaimed(userAddressStr, asset)
352- let $t01512315160 = accum
353- let data = $t01512315160._1
354- let claimedAmtByAsset = $t01512315160._2
365+ let $t01543415471 = accum
366+ let data = $t01543415471._1
367+ let claimedAmtByAsset = $t01543415471._2
355368 let newPart = makeString([asset, toString(rewardTotal)], ":")
356369 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
357370 if ((0 >= rewardTotal))
359372 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
360373 }
361374
362- let $t01562015734 = {
375+ let $t01593116045 = {
363376 let $l = supportedAssetsList
364377 let $s = size($l)
365378 let $acc0 = $Tuple2(nil, "")
373386
374387 $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)
375388 }
376- let transfers = $t01562015734._1
377- let claimedAmtByAssetResult = $t01562015734._2
389+ let transfers = $t01593116045._1
390+ let claimedAmtByAssetResult = $t01593116045._2
378391 if ((0 >= size(transfers)))
379392 then nil
380393 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
405418 else {
406419 let userAddress = i.caller
407420 let userAddressStr = toString(userAddress)
408- let $t01664316697 = getParamsOrFail()
409- let stakedAssetId = $t01664316697._1
410- let minLockAmount = $t01664316697._2
411- let $t01670016784 = getUserParamsOrFail(userAddress)
412- let isNewUser = $t01670016784._1
413- let stakedAmount = $t01670016784._2
414- let vpEffectiveHeight = $t01670016784._3
415- if ((0 >= stakedAmount))
416- then throw("Nothing to unstake")
417- else if ((amount > stakedAmount))
418- then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
419- else {
420- let stakedAmountNEW = (stakedAmount - amount)
421- let $t01702617184 = StatsResult(-(amount), if ((amount == stakedAmount))
422- then -1
423- else 0, if ((amount == stakedAmount))
424- then -1
425- else 0)
426- let statsEntries = $t01702617184._1
427- let totalStaked = $t01702617184._2
428- let totalStakedNew = $t01702617184._3
429- ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
430- }
421+ let $t01695417008 = getParamsOrFail()
422+ let stakedAssetId = $t01695417008._1
423+ let minLockAmount = $t01695417008._2
424+ let $t01701117095 = getUserParamsOrFail(userAddress)
425+ let isNewUser = $t01701117095._1
426+ let stakedAmount = $t01701117095._2
427+ let vpEffectiveHeight = $t01701117095._3
428+ let swapParamsSTRUCT = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddress, 0], nil))
429+ let swapLimitMax = swapParamsSTRUCT._1
430+ let swapLimitSpent = swapParamsSTRUCT._2
431+ let blcks2LmtReset = swapParamsSTRUCT._3
432+ if ((swapLimitSpent > 0))
433+ then throw((("You have already made a swap operation. Wait " + toString((height + blcks2LmtReset))) + " height to unstake"))
434+ else if ((0 >= stakedAmount))
435+ then throw("Nothing to unstake")
436+ else if ((amount > stakedAmount))
437+ then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
438+ else {
439+ let stakedAmountNEW = (stakedAmount - amount)
440+ let $t01775317911 = StatsResult(-(amount), if ((amount == stakedAmount))
441+ then -1
442+ else 0, if ((amount == stakedAmount))
443+ then -1
444+ else 0)
445+ let statsEntries = $t01775317911._1
446+ let totalStaked = $t01775317911._2
447+ let totalStakedNew = $t01775317911._3
448+ ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
449+ }
431450 }
432451
433452
517536 }
518537 else {
519538 let userAddress = addressFromStringValue(userAddressStr)
520- let $t01975819863 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
521- let isNewUser = $t01975819863._1
522- let stakedAmount = $t01975819863._2
523- let stakingStart = $t01975819863._3
539+ let $t02048520590 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
540+ let isNewUser = $t02048520590._1
541+ let stakedAmount = $t02048520590._2
542+ let stakingStart = $t02048520590._3
524543 let stakedAmountX = toBigInt(stakedAmount)
525544 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
526545 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
527546 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
528547 func forEachAssetCalcUnclaimedReward (accum,asset) = {
529- let $t02020920347 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
530- let rewardTotal = $t02020920347._1
531- let cached = $t02020920347._2
532- let dynamic = $t02020920347._3
533- let rewardCachedPartKEY = $t02020920347._4
548+ let $t02093621074 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
549+ let rewardTotal = $t02093621074._1
550+ let cached = $t02093621074._2
551+ let dynamic = $t02093621074._3
552+ let rewardCachedPartKEY = $t02093621074._4
534553 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
535554 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
536555 }
576595
577596
578597 @Callable(i)
598+func gnsbtFromSurfSYSREADONLY (surfAmt) = $Tuple2(nil, surfToGnsbt(surfAmt))
599+
600+
601+
602+@Callable(i)
579603 func configSYSREADONLY () = {
580604 let minLockAmt = getIntegerValue(keyMinLockAmount())
581- let gnsbtFromSurfCoeff = (300 * MULT6)
582605 let surfVotingPowerRestrictivePeriod = (1440 * 14)
583606 let brToStartSurfTransformation = 1150000
584- $Tuple2(nil, [minLockAmt, gnsbtFromSurfCoeff, surfVotingPowerRestrictivePeriod, brToStartSurfTransformation])
607+ $Tuple2(nil, [minLockAmt, (gnsbtFromSurfCoeff * MULT6), surfVotingPowerRestrictivePeriod, brToStartSurfTransformation])
585608 }
586609
587610
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let SEP = "__"
77
88 let MULT6 = 1000000
99
1010 let MULT8 = 100000000
1111
1212 let MULTX6 = toBigInt(MULT6)
1313
1414 let MULTX8 = toBigInt(MULT8)
1515
1616 let MULTX18 = toBigInt(1000000000000000000)
1717
1818 let WAVESIDSTR = "WAVES"
1919
2020 let WAVESID = fromBase58String(WAVESIDSTR)
2121
2222 let IdxControlCfgNeutrinoDapp = 1
2323
2424 let IdxControlCfgAuctionDapp = 2
2525
2626 let IdxControlCfgRpdDapp = 3
2727
2828 let IdxControlCfgMathDapp = 4
2929
3030 let IdxControlCfgLiquidationDapp = 5
3131
3232 let IdxControlCfgRestDapp = 6
3333
3434 let IdxControlCfgNodeRegistryDapp = 7
3535
3636 let IdxControlCfgNsbtStakingDapp = 8
3737
3838 let IdxControlCfgMediatorDapp = 9
3939
4040 let IdxControlCfgSurfStakingDapp = 10
4141
4242 let IdxControlCfgGnsbtControllerDapp = 11
4343
4444 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4545
4646
4747 func keyControlAddress () = "%s%s__config__controlAddress"
4848
4949
5050 func keyControlCfg () = "%s__controlConfig"
5151
5252
53+func keyGnsbtFromSurfCoeff () = "%s%s__cfg__gnsbtFromSurfCoeff"
54+
55+
5356 func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
5457
5558
5659 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
5760
5861
5962 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
6063
6164 let controlCfg = readControlCfgOrFail(controlContract)
6265
6366 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
6467
6568 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
6669
6770 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
71+
72+let gnsbtFromSurfCoeff = valueOrElse(getInteger(this, keyGnsbtFromSurfCoeff()), 300)
6873
6974 func keyBondAsset () = "bond_asset_id"
7075
7176
7277 func keyAuctionContractAddress () = "auction_contract"
7378
7479
7580 func keyMinLockAmount () = "%s__minLockAmount"
7681
7782
7883 func keyStakedAssetId () = "%s__stakedAssetId"
7984
8085
8186 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "amount"], separator)
8287
8388
8489 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "start"], separator)
8590
8691
8792 func keyLockParamVotingPowerEffectiveHeight (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "vpEffectiveHeight"], separator)
8893
8994
9095 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
9196
9297
9398 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
9499
95100
96101 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
97102
98103
99104 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
100105
101106
102107 func keyNextPeriod () = "%s__nextPeriod"
103108
104109
105110 func keySupportedRewardAssets () = "supportedRewardAssets"
106111
107112
108113 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
109114
110115
111116 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
112117
113118
114119 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
115120
116121
117122 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
118123
119124
120125 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
121126
122127
123128 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
124129
125130
126131 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
127132
128133
129134 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
130135
131136
132137 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
133138
134139
135140 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
136141
137142
138143 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
139144
140145
141146 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
142147
143148
144149 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
145150 then unit
146151 else fromBase58String(assetStr)
147152
148153
149154 func asInt (val) = match val {
150155 case valInt: Int =>
151156 valInt
152157 case _ =>
153158 throw("fail to cast into Int")
154159 }
155160
156161
162+func asSwapParamsSTRUCT (v) = match v {
163+ case struct: (Int, Int, Int, Int, Int) =>
164+ struct
165+ case _ =>
166+ throw("fail to cast into Int")
167+}
168+
169+
157170 func formatHistoryRecord (oldAmount,oldStart,newAmount,newStart) = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(oldAmount), toString(oldStart), toString(newAmount), toString(newStart)], separator)
158171
159172
160173 func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
161174
162175
163176 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
164177
165178
166179 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
167180
168181
169182 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
170183 let locksCount = getIntOrZero(keyStatsLocksCount())
171184 let usersCount = getIntOrZero(keyStatsUsersCount())
172185 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
173186 let totalAmountNew = (totalAmount + totalLockedInc)
174187 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
175188 }
176189
177190
178191 func LockParamsEntry (userAddress,amount,votingPowerEffectiveHeight) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), votingPowerEffectiveHeight)]
179192
180193
181194 func getParamsOrFail () = $Tuple2(fromBase58String(getStringOrFail(this, keyStakedAssetId())), getIntOrFail(keyMinLockAmount()))
182195
183196
184197 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
185198
186199
187200 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
188201 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
189202 else unit
190203
191204
192205 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
193206
194207
195208 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
196209
197210 let supportedAssetsList = split(supportedAssetsStr, "_")
198211
199212 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
200213 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
201214 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
202215 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
203216 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
204217 let rewardCachedPartKEY = keyReward(userAddress, assetId)
205218 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
206219 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
207220 }
208221
209222
210223 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
211224 let stakedAmountX = toBigInt(stakedAmount)
212225 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
213226 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
214227 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
215228 func forEachAssetCacheUserReward (accum,asset) = {
216- let $t086398774 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
217- let rewardTotal = $t086398774._1
218- let cached = $t086398774._2
219- let dynamic = $t086398774._3
220- let rewardCachedPartKEY = $t086398774._4
229+ let $t089429077 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
230+ let rewardTotal = $t089429077._1
231+ let cached = $t089429077._2
232+ let dynamic = $t089429077._3
233+ let rewardCachedPartKEY = $t089429077._4
221234 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
222235 }
223236
224237 if (if ((depositNumLast == -1))
225238 then (depositNumUser == -1)
226239 else false)
227240 then nil
228241 else if (if ((depositNumLast == -1))
229242 then (depositNumUser > -1)
230243 else false)
231244 then throw("invalid depositNumLast and depositNumUser state")
232245 else if (if ((depositNumLast > -1))
233246 then (depositNumUser >= -1)
234247 else false)
235248 then if (isNewUser)
236249 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
237250 else ({
238251 let $l = supportedAssetsList
239252 let $s = size($l)
240253 let $acc0 = nil
241254 func $f0_1 ($a,$i) = if (($i >= $s))
242255 then $a
243256 else forEachAssetCacheUserReward($a, $l[$i])
244257
245258 func $f0_2 ($a,$i) = if (($i >= $s))
246259 then $a
247260 else throw("List size exceeds 10")
248261
249262 $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)
250263 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
251264 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
252265 }
253266
254267
255268 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
256269 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
257270 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
258271 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
259272 }
260273
261274
262-func surfToGnsbt (surfAmt) = (surfAmt / 300)
275+func surfToGnsbt (surfAmt) = (surfAmt / gnsbtFromSurfCoeff)
263276
264277
265278 func mergeVotingPowerEffectiveHeight (quarantinePeriod,vpEffectiveHeight,stakedAmt,stakedAmtNEW) = {
266279 let remainingToWait = (vpEffectiveHeight - height)
267280 if ((0 >= remainingToWait))
268281 then (height + quarantinePeriod)
269282 else {
270283 let alreadyWaited = (quarantinePeriod - remainingToWait)
271284 let kX8 = if ((stakedAmtNEW != 0))
272285 then fraction(stakedAmt, MULT8, stakedAmtNEW)
273286 else vpEffectiveHeight
274287 ((quarantinePeriod + height) - fraction(alreadyWaited, kX8, MULT8))
275288 }
276289 }
277290
278291
279292 func mergeStake (userAddress,amountToAdd) = {
280- let $t01241912529 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
281- let isNewUser = $t01241912529._1
282- let stakedAmount = $t01241912529._2
283- let vpEffectiveHeight = $t01241912529._3
293+ let $t01273012840 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
294+ let isNewUser = $t01273012840._1
295+ let stakedAmount = $t01273012840._2
296+ let vpEffectiveHeight = $t01273012840._3
284297 let stakedAmountNEW = if (isNewUser)
285298 then amountToAdd
286299 else (amountToAdd + stakedAmount)
287300 let quarantinePeriod = (1440 * 14)
288301 let vpEffectiveHeightNEW = if (isNewUser)
289302 then (quarantinePeriod + height)
290303 else mergeVotingPowerEffectiveHeight(quarantinePeriod, vpEffectiveHeight, stakedAmount, stakedAmountNEW)
291304 $Tuple5(isNewUser, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)
292305 }
293306
294307
295308 func commonStake (userAddress,i) = {
296- let $t01301513069 = getParamsOrFail()
297- let stakedAssetId = $t01301513069._1
298- let minLockAmount = $t01301513069._2
309+ let $t01332613380 = getParamsOrFail()
310+ let stakedAssetId = $t01332613380._1
311+ let minLockAmount = $t01332613380._2
299312 if ((size(i.payments) != 1))
300313 then throw("Invalid payments size")
301314 else {
302315 let payment = i.payments[0]
303316 let amount = payment.amount
304317 let invalidAssetMessage = (("Invalid asset. " + toBase58String(stakedAssetId)) + " is expected")
305318 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
306319 if ((assetId != stakedAssetId))
307320 then throw(invalidAssetMessage)
308321 else {
309322 let userAddressStr = toString(userAddress)
310323 let mergedData = mergeStake(userAddress, amount)
311324 let isNewUser = mergedData._1
312325 let stakedAmount = mergedData._2
313326 let vpEffectiveHeight = mergedData._3
314327 let stakedAmountNEW = mergedData._4
315328 let vpEffectiveHeightNEW = mergedData._5
316329 if ((minLockAmount > stakedAmountNEW))
317330 then throw(("Min lock amount is " + toString(minLockAmount)))
318331 else {
319- let $t01386813970 = StatsResult(amount, 1, if (isNewUser)
332+ let $t01417914281 = StatsResult(amount, 1, if (isNewUser)
320333 then 1
321334 else 0)
322- let statsEntries = $t01386813970._1
323- let totalStaked = $t01386813970._2
324- let totalStakedNew = $t01386813970._3
335+ let statsEntries = $t01417914281._1
336+ let totalStaked = $t01417914281._2
337+ let totalStakedNew = $t01417914281._3
325338 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeightNEW)) ++ statsEntries)
326339 }
327340 }
328341 }
329342 }
330343
331344
332345 func commonClaim (userAddress,i) = {
333346 let userAddressStr = toString(userAddress)
334347 if ((size(i.payments) > 0))
335348 then throw("payments are not accepted")
336349 else {
337- let $t01444914554 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
338- let isNewUser = $t01444914554._1
339- let stakedAmount = $t01444914554._2
340- let stakingStart = $t01444914554._3
350+ let $t01476014865 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
351+ let isNewUser = $t01476014865._1
352+ let stakedAmount = $t01476014865._2
353+ let stakingStart = $t01476014865._3
341354 let stakedAmountX = toBigInt(stakedAmount)
342355 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
343356 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
344357 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
345358 func forEachAssetCalcUnclaimedReward (accum,asset) = {
346- let $t01492515063 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
347- let rewardTotal = $t01492515063._1
348- let cached = $t01492515063._2
349- let dynamic = $t01492515063._3
350- let rewardCachedPartKEY = $t01492515063._4
359+ let $t01523615374 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
360+ let rewardTotal = $t01523615374._1
361+ let cached = $t01523615374._2
362+ let dynamic = $t01523615374._3
363+ let rewardCachedPartKEY = $t01523615374._4
351364 let claimedKEY = keyClaimed(userAddressStr, asset)
352- let $t01512315160 = accum
353- let data = $t01512315160._1
354- let claimedAmtByAsset = $t01512315160._2
365+ let $t01543415471 = accum
366+ let data = $t01543415471._1
367+ let claimedAmtByAsset = $t01543415471._2
355368 let newPart = makeString([asset, toString(rewardTotal)], ":")
356369 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
357370 if ((0 >= rewardTotal))
358371 then $Tuple2(data, claimedAmtByAssetNew)
359372 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
360373 }
361374
362- let $t01562015734 = {
375+ let $t01593116045 = {
363376 let $l = supportedAssetsList
364377 let $s = size($l)
365378 let $acc0 = $Tuple2(nil, "")
366379 func $f0_1 ($a,$i) = if (($i >= $s))
367380 then $a
368381 else forEachAssetCalcUnclaimedReward($a, $l[$i])
369382
370383 func $f0_2 ($a,$i) = if (($i >= $s))
371384 then $a
372385 else throw("List size exceeds 10")
373386
374387 $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)
375388 }
376- let transfers = $t01562015734._1
377- let claimedAmtByAssetResult = $t01562015734._2
389+ let transfers = $t01593116045._1
390+ let claimedAmtByAssetResult = $t01593116045._2
378391 if ((0 >= size(transfers)))
379392 then nil
380393 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
381394 }
382395 }
383396
384397
385398 @Callable(i)
386399 func constructor (minLockAmount,supportedRewardAssets,stakedAssetId) = if ((i.caller != this))
387400 then throw("Permission denied")
388401 else [IntegerEntry(keyMinLockAmount(), minLockAmount), StringEntry(keySupportedRewardAssets(), supportedRewardAssets), StringEntry(keyStakedAssetId(), stakedAssetId)]
389402
390403
391404
392405 @Callable(i)
393406 func stake () = commonStake(i.caller, i)
394407
395408
396409
397410 @Callable(i)
398411 func stakeByOriginCaller () = commonStake(i.originCaller, i)
399412
400413
401414
402415 @Callable(i)
403416 func unstake (amount) = if ((size(i.payments) != 0))
404417 then throw("unstake doesn't require any payment")
405418 else {
406419 let userAddress = i.caller
407420 let userAddressStr = toString(userAddress)
408- let $t01664316697 = getParamsOrFail()
409- let stakedAssetId = $t01664316697._1
410- let minLockAmount = $t01664316697._2
411- let $t01670016784 = getUserParamsOrFail(userAddress)
412- let isNewUser = $t01670016784._1
413- let stakedAmount = $t01670016784._2
414- let vpEffectiveHeight = $t01670016784._3
415- if ((0 >= stakedAmount))
416- then throw("Nothing to unstake")
417- else if ((amount > stakedAmount))
418- then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
419- else {
420- let stakedAmountNEW = (stakedAmount - amount)
421- let $t01702617184 = StatsResult(-(amount), if ((amount == stakedAmount))
422- then -1
423- else 0, if ((amount == stakedAmount))
424- then -1
425- else 0)
426- let statsEntries = $t01702617184._1
427- let totalStaked = $t01702617184._2
428- let totalStakedNew = $t01702617184._3
429- ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
430- }
421+ let $t01695417008 = getParamsOrFail()
422+ let stakedAssetId = $t01695417008._1
423+ let minLockAmount = $t01695417008._2
424+ let $t01701117095 = getUserParamsOrFail(userAddress)
425+ let isNewUser = $t01701117095._1
426+ let stakedAmount = $t01701117095._2
427+ let vpEffectiveHeight = $t01701117095._3
428+ let swapParamsSTRUCT = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddress, 0], nil))
429+ let swapLimitMax = swapParamsSTRUCT._1
430+ let swapLimitSpent = swapParamsSTRUCT._2
431+ let blcks2LmtReset = swapParamsSTRUCT._3
432+ if ((swapLimitSpent > 0))
433+ then throw((("You have already made a swap operation. Wait " + toString((height + blcks2LmtReset))) + " height to unstake"))
434+ else if ((0 >= stakedAmount))
435+ then throw("Nothing to unstake")
436+ else if ((amount > stakedAmount))
437+ then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
438+ else {
439+ let stakedAmountNEW = (stakedAmount - amount)
440+ let $t01775317911 = StatsResult(-(amount), if ((amount == stakedAmount))
441+ then -1
442+ else 0, if ((amount == stakedAmount))
443+ then -1
444+ else 0)
445+ let statsEntries = $t01775317911._1
446+ let totalStaked = $t01775317911._2
447+ let totalStakedNew = $t01775317911._3
448+ ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
449+ }
431450 }
432451
433452
434453
435454 @Callable(i)
436455 func deposit () = if ((size(i.payments) != 1))
437456 then throw("exact 1 payment is allowed only")
438457 else {
439458 let pmt = i.payments[0]
440459 let amount = pmt.amount
441460 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
442461 let pmtAssetIdStr = toBase58String(pmtAssetId)
443462 let pmtMultX = if ((pmtAssetId == WAVESID))
444463 then MULTX8
445464 else MULTX6
446465 let amountX = toBigInt(amount)
447466 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
448467 let totalStakedX = toBigInt(totalStaked)
449468 if ((0 > totalStaked))
450469 then throw("TODO: case is not supported")
451470 else if ((totalStaked == 0))
452471 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
453472 else {
454473 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
455474 let depositNumLastKEY = keyDepositNumLast()
456475 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
457476 let depositNumNew = (depositNumLast + 1)
458477 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
459478 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
460479 else {
461480 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
462481 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
463482 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
464483 (accum :+ (if ((nextAsset == pmtAssetIdStr))
465484 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
466485 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
467486 }
468487
469488 ({
470489 let $l = supportedAssetsList
471490 let $s = size($l)
472491 let $acc0 = nil
473492 func $f0_1 ($a,$i) = if (($i >= $s))
474493 then $a
475494 else refreshRewardPerNsbtSUM($a, $l[$i])
476495
477496 func $f0_2 ($a,$i) = if (($i >= $s))
478497 then $a
479498 else throw("List size exceeds 10")
480499
481500 $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)
482501 } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
483502 }
484503 }
485504 }
486505
487506
488507
489508 @Callable(i)
490509 func claimRewards () = commonClaim(i.caller, i)
491510
492511
493512
494513 @Callable(i)
495514 func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
496515
497516
498517
499518 @Callable(i)
500519 func unclaimedRewardsREADONLY (userAddressStr) = {
501520 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
502521
503522 let unclaimedRewardStr = if ((userAddressStr == ""))
504523 then {
505524 let $l = supportedAssetsList
506525 let $s = size($l)
507526 let $acc0 = ""
508527 func $f0_1 ($a,$i) = if (($i >= $s))
509528 then $a
510529 else forEachAssetZeroReward($a, $l[$i])
511530
512531 func $f0_2 ($a,$i) = if (($i >= $s))
513532 then $a
514533 else throw("List size exceeds 10")
515534
516535 $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)
517536 }
518537 else {
519538 let userAddress = addressFromStringValue(userAddressStr)
520- let $t01975819863 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
521- let isNewUser = $t01975819863._1
522- let stakedAmount = $t01975819863._2
523- let stakingStart = $t01975819863._3
539+ let $t02048520590 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
540+ let isNewUser = $t02048520590._1
541+ let stakedAmount = $t02048520590._2
542+ let stakingStart = $t02048520590._3
524543 let stakedAmountX = toBigInt(stakedAmount)
525544 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
526545 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
527546 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
528547 func forEachAssetCalcUnclaimedReward (accum,asset) = {
529- let $t02020920347 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
530- let rewardTotal = $t02020920347._1
531- let cached = $t02020920347._2
532- let dynamic = $t02020920347._3
533- let rewardCachedPartKEY = $t02020920347._4
548+ let $t02093621074 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
549+ let rewardTotal = $t02093621074._1
550+ let cached = $t02093621074._2
551+ let dynamic = $t02093621074._3
552+ let rewardCachedPartKEY = $t02093621074._4
534553 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
535554 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
536555 }
537556
538557 let $l = supportedAssetsList
539558 let $s = size($l)
540559 let $acc0 = ""
541560 func $f0_1 ($a,$i) = if (($i >= $s))
542561 then $a
543562 else forEachAssetCalcUnclaimedReward($a, $l[$i])
544563
545564 func $f0_2 ($a,$i) = if (($i >= $s))
546565 then $a
547566 else throw("List size exceeds 10")
548567
549568 $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)
550569 }
551570 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
552571 }
553572
554573
555574
556575 @Callable(i)
557576 func surfStakingSYSREADONLY (userAddressStrOrEmpty,surfDiff) = {
558577 let surfTotal = getIntOrElse(keyLockParamTotalAmount(), 0)
559578 let gnsbtFromSurfTotal = surfToGnsbt(surfTotal)
560579 if ((userAddressStrOrEmpty == ""))
561580 then $Tuple2(nil, [0, surfTotal, 0, gnsbtFromSurfTotal, 0, height, height])
562581 else {
563582 let userAddress = toAddressOrFail(userAddressStrOrEmpty)
564583 let mergedData = mergeStake(userAddress, surfDiff)
565584 let isNewUser = mergedData._1
566585 let stakedAmount = mergedData._2
567586 let vpEffectiveHeight = mergedData._3
568587 let stakedAmountNEW = mergedData._4
569588 let vpEffectiveHeightNEW = mergedData._5
570589 let surfUser = stakedAmount
571590 let gnsbtFromSurfUser = surfToGnsbt(surfUser)
572591 $Tuple2(nil, [surfUser, surfTotal, gnsbtFromSurfUser, gnsbtFromSurfTotal, vpEffectiveHeight, vpEffectiveHeightNEW])
573592 }
574593 }
575594
576595
577596
578597 @Callable(i)
598+func gnsbtFromSurfSYSREADONLY (surfAmt) = $Tuple2(nil, surfToGnsbt(surfAmt))
599+
600+
601+
602+@Callable(i)
579603 func configSYSREADONLY () = {
580604 let minLockAmt = getIntegerValue(keyMinLockAmount())
581- let gnsbtFromSurfCoeff = (300 * MULT6)
582605 let surfVotingPowerRestrictivePeriod = (1440 * 14)
583606 let brToStartSurfTransformation = 1150000
584- $Tuple2(nil, [minLockAmt, gnsbtFromSurfCoeff, surfVotingPowerRestrictivePeriod, brToStartSurfTransformation])
607+ $Tuple2(nil, [minLockAmt, (gnsbtFromSurfCoeff * MULT6), surfVotingPowerRestrictivePeriod, brToStartSurfTransformation])
585608 }
586609
587610

github/deemru/w8io/c3f4982 
82.61 ms