2023.11.30 10:46 [3931713] smart account 3PHgHf5C4WvHJucSHrjoVnMFsP1EhWffVLt > SELF 0.00000000 Waves

{ "type": 13, "id": "HVZQGUwS1WNSkt8FyKei15KXRuYihPH62jdZnQQXAvst", "fee": 1500000, "feeAssetId": null, "timestamp": 1701330374144, "version": 2, "chainId": 87, "sender": "3PHgHf5C4WvHJucSHrjoVnMFsP1EhWffVLt", "senderPublicKey": "2aeoYULNN3obHbu7ndmV1D4h6A19c9JUaMcqhrT8BLuG", "proofs": [ "48kpeQYZ8ASn1LKKqTyVv6aaQmjHPsteByk3hFMiwE6Xrs9mJjsmSPTjAfqRJfGnRSkiyZ8MFpHd8RPt5EkgPgt2", "", "4zgKcKntejsd9GNNB4n6xLHHbhr1hxif5e8eXKTwiYUbwiQh5MmiJzkhGxmNHQetckMnqJupYz6WSbikj3u6UPe3" ], "script": "base64:BgIbCAISABIECgIICBIFCgMBBAESBAoCAQgSABIAPwAGT1JBQ0xFCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgZvcmFjbGUAB3ZlcnNpb24CBTEuMC4wAAhrVmVyc2lvbgIHdmVyc2lvbgAHa0FjdGl2ZQIGYWN0aXZlAAtrQWN0aXZlR2xvYgIUYWN0aXZlX2FsbF9jb250cmFjdHMAD2tOdW1iZXJPZlZvdGluZwIUdm90aW5nX2FjdGl2ZV9udW1iZXIADWtIZWlnaHRPZlBvb2wCDl9maW5pc2hfaGVpZ2h0AANrTm8CD190b3RhbF92b3Rlc19ubwAEa1llcwIQX3RvdGFsX3ZvdGVzX3llcwAHa05vVXNlcgIIX3ZvdGVfbm8ACGtZZXNVc2VyAglfdm90ZV95ZXMAD2tTdGF0dXNPZlZvdGluZwIHX3N0YXR1cwAPa0Ftb3VudE9mVm90aW5nAg52b3RpbmdfaWRfbGFzdAASa01heEFtb3VudE9mVm90aW5nAhFtYXhfYW1vdW50X3ZvdGluZwAPa01heERheU9mVm90aW5nAg5tYXhfZGF5X3ZvdGluZwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQAMa0NhbmNlbENhdXNlAg1fY2FuY2VsX2NhdXNlAA9rVXNlclRvdGFsR1NXT1ACDV9HU3dvcF9hbW91bnQABWtOYW1lAgtfYXNzZXRfbmFtZQAIdm90aW5nSWQCB192b3RpbmcAD2FjdGl2ZVZvdGVGaXJzdAIUdm90aW5nX2FjdGl2ZV9jZWxsXzEAEGFjdGl2ZVZvdGVTZWNvbmQCFHZvdGluZ19hY3RpdmVfY2VsbF8yAA9hY3RpdmVWb3RlVGhpcmQCFHZvdGluZ19hY3RpdmVfY2VsbF8zAA1rQWRtaW5QdWJLZXkxAgthZG1pbl9wdWJfMQANa0FkbWluUHViS2V5MgILYWRtaW5fcHViXzIADWtBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zAA9rVGVhbUJveEFkZHJlc3MCEHRlYW1fYm94X2FkZHJlc3MAC2tHb3ZBZGRyZXNzAhJnb3Zlcm5hbmNlX2FkZHJlc3MADGtGYXJtaW5nQWRkcgIPZmFybWluZ19hZGRyZXNzAAxrVVNETkFzc2V0SWQCDXVzZG5fYXNzZXRfaWQAB2tTV09QaWQCB1NXT1BfaWQADm51bWJlck9mVm90aW5nCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ9rTnVtYmVyT2ZWb3RpbmcADmFtb3VudE9mVm90aW5nCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ9rQW1vdW50T2ZWb3RpbmcAD2ZpcnN0QWN0aXZlVm90ZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ9hY3RpdmVWb3RlRmlyc3QCAAAQc2Vjb25kQWN0aXZlVm90ZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRBhY3RpdmVWb3RlU2Vjb25kAgAAD3RoaXJkQWN0aXZlVm90ZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ9hY3RpdmVWb3RlVGhpcmQCAAAGYWN0aXZlCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzBQdrQWN0aXZlAAphY3RpdmVHbG9iCQELdmFsdWVPckVsc2UCCQCbCAIFBk9SQUNMRQULa0FjdGl2ZUdsb2IGACFjb21pc3Npb25Gb3JJbml0YWxpemF0aW9uT2ZWb3RpbmcAgOjtoboBABFtYXhBbW91bnRPZlZvdGluZwADAA5tYXhEYXlPZlZvdGluZwAHABJ2b3RpbmdQZXJpb2RMZW5ndGgJAGgCAKMLBQ5tYXhEYXlPZlZvdGluZwETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBk9SQUNMRQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwAKZ292QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFC2tHb3ZBZGRyZXNzAAtmYXJtaW5nQWRkcgkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtGYXJtaW5nQWRkcgAOdGVhbUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ9rVGVhbUJveEFkZHJlc3MABFVTRE4JARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa1VTRE5Bc3NldElkAARTV09QCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFC2Zhcm1pbmdBZGRyBQdrU1dPUGlkAQhpc0FjdGl2ZQADAwUGYWN0aXZlBQphY3RpdmVHbG9iBwUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBC2lzQWRtaW5DYWxsAQFpAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5BQR1bml0CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQxnZXRBc3NldEluZm8BB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDADCQEJaXNEZWZpbmVkAQkA7AcBBQJpZAQIc3RyaW5nSWQJANgEAQUCaWQEBGluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJpZAkArAICCQCsAgICBkFzc2V0IAUIc3RyaW5nSWQCDiBkb2Vzbid0IGV4aXN0CQCVCgMFCHN0cmluZ0lkCAUEaW5mbwRuYW1lCAUEaW5mbwhkZWNpbWFscwkAAgECFEFzc2V0IGlzIG5vdCBkZWZpbmVkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCQCVCgMCBVdBVkVTAgVXQVZFUwAICQACAQILTWF0Y2ggZXJyb3IBEmlzQWN0aXZlUG9vbEV4aXN0cwMFcG9vbHMGYXNzZXRBBmFzc2V0QgQJcG9vbHNEYXRhCQC1CQIFBXBvb2xzAgFfBAxpc1Bvb2xEZWZpbmUJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMFBXBvb2xzAwMFDGlzUG9vbERlZmluZQkBAiE9AgUFcG9vbHMCAAcEBnZvdGluZwkAkQMCBQlwb29sc0RhdGEAAgQIbmV3UG9vbHMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZhc3NldEECAV8FBmFzc2V0QgIBXwUGdm90aW5nBQh2b3RpbmdJZAQPaXNOZXdQb29sRGVmaW5lCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzBQhuZXdQb29scwQOaGVpZ2h0T2ZWb3RpbmcJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQZ2b3RpbmcFDWtIZWlnaHRPZlBvb2wAAAQOc3RhdHVzT2ZWb3RpbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQZ2b3RpbmcFD2tTdGF0dXNPZlZvdGluZwYDBQ9pc05ld1Bvb2xEZWZpbmUDCQBmAgUOaGVpZ2h0T2ZWb3RpbmcFBmhlaWdodAMFDnN0YXR1c09mVm90aW5nBgcHBwcBFGlzVW5hY3RpdmVQb29sRXhpc3RzAQpwb29sc1N0YXRlBAVwb29scwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQpwb29sc1N0YXRlAgAECXBvb2xzRGF0YQkAtQkCBQVwb29scwIBXwQMaXNQb29sRGVmaW5lCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzBQVwb29scwMDBQxpc1Bvb2xEZWZpbmUJAQIhPQIFBXBvb2xzAgAHBAZ2b3RpbmcJAJEDAgUJcG9vbHNEYXRhAAIEDmhlaWdodE9mVm90aW5nCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUGdm90aW5nBQ1rSGVpZ2h0T2ZQb29sAAAEDnN0YXR1c09mVm90aW5nCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUGdm90aW5nBQ9rU3RhdHVzT2ZWb3RpbmcGAwkAZgIFDmhlaWdodE9mVm90aW5nBQZoZWlnaHQDBQ5zdGF0dXNPZlZvdGluZwIABQpwb29sc1N0YXRlBQpwb29sc1N0YXRlBQpwb29sc1N0YXRlARZpc0xhc3RBY3RpdmVQb29sRXhpc3RzAgZhc3NldEEGYXNzZXRCAwMJARJpc0FjdGl2ZVBvb2xFeGlzdHMDBQ9maXJzdEFjdGl2ZVZvdGUFBmFzc2V0QQUGYXNzZXRCBgkBEmlzQWN0aXZlUG9vbEV4aXN0cwMFEHNlY29uZEFjdGl2ZVZvdGUFBmFzc2V0QQUGYXNzZXRCBgkBEmlzQWN0aXZlUG9vbEV4aXN0cwMFD3RoaXJkQWN0aXZlVm90ZQUGYXNzZXRBBQZhc3NldEIBDWdldEFjdGl2ZVBvb2wBBnZvdGluZwQOaGVpZ2h0T2ZWb3RpbmcJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFBnZvdGluZwUNa0hlaWdodE9mUG9vbAAABA5zdGF0dXNPZlZvdGluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQUGdm90aW5nBQ9rU3RhdHVzT2ZWb3RpbmcGBA1jdXJyZW50SGVpZ2h0BQZoZWlnaHQDCQBmAgAABQZ2b3RpbmcAAAMJAQEhAQUOc3RhdHVzT2ZWb3RpbmcAAAMJAGYCBQ5oZWlnaHRPZlZvdGluZwUNY3VycmVudEhlaWdodAABAAABGWdldEFjdGl2ZVZvdGluZ1Bvb2xBbW91bnQACQBkAgkAZAIJAQ1nZXRBY3RpdmVQb29sAQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9maXJzdEFjdGl2ZVZvdGUA////////////AQkBDWdldEFjdGl2ZVBvb2wBCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEHNlY29uZEFjdGl2ZVZvdGUA////////////AQkBDWdldEFjdGl2ZVBvb2wBCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD3RoaXJkQWN0aXZlVm90ZQD///////////8BARVnZXRVbmFjdGl2ZVZvdGluZ1Bvb2wAAwkBAiE9AgkBFGlzVW5hY3RpdmVQb29sRXhpc3RzAQUPYWN0aXZlVm90ZUZpcnN0AgAFD2FjdGl2ZVZvdGVGaXJzdAMJAQIhPQIJARRpc1VuYWN0aXZlUG9vbEV4aXN0cwEFEGFjdGl2ZVZvdGVTZWNvbmQCAAUQYWN0aXZlVm90ZVNlY29uZAMJAQIhPQIJARRpc1VuYWN0aXZlUG9vbEV4aXN0cwEFD2FjdGl2ZVZvdGVUaGlyZAIABQ9hY3RpdmVWb3RlVGhpcmQCAAEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHICBVdBVkVTBQR1bml0CQDZBAEFCGFzc2V0U3RyARRpc0NhbGxlckluR292ZXJuYW5jZQEEdXNlcgMJAGYCCQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgkApQgBBQR1c2VyBQ9rVXNlclRvdGFsR1NXT1AAAAAABgcBB3N1c3BlbmQBBWNhdXNlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwkAzAgCCQELU3RyaW5nRW50cnkCBQZrQ2F1c2UFBWNhdXNlBQNuaWwGAWkBBGluaXQAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIrT25seSB0aGUgREFwcCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAQlpc0RlZmluZWQBCQCbCAIFBHRoaXMFB2tBY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlBBJpbml0TnVtYmVyT2ZWb3RpbmcAAAQSaW5pdEFtb3VudE9mVm90aW5nAAAEDWluaXRLZXlBY3RpdmUGBAphY3RpdmVJbml0AgAJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa1ZlcnNpb24FB3ZlcnNpb24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUFDWluaXRLZXlBY3RpdmUJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tOdW1iZXJPZlZvdGluZwUSaW5pdE51bWJlck9mVm90aW5nCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rQW1vdW50T2ZWb3RpbmcFEmluaXRBbW91bnRPZlZvdGluZwkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa01heEFtb3VudE9mVm90aW5nBRFtYXhBbW91bnRPZlZvdGluZwkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa01heERheU9mVm90aW5nBQ5tYXhEYXlPZlZvdGluZwkAzAgCCQELU3RyaW5nRW50cnkCBQ9hY3RpdmVWb3RlRmlyc3QFCmFjdGl2ZUluaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgUQYWN0aXZlVm90ZVNlY29uZAUKYWN0aXZlSW5pdAkAzAgCCQELU3RyaW5nRW50cnkCBQ9hY3RpdmVWb3RlVGhpcmQFCmFjdGl2ZUluaXQFA25pbAFpARRpbml0Vm90aW5nRm9yTmV3UG9vbAIGYXNzZXRBBmFzc2V0QgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQLJHQwNzA2MzcxNjIJAJQKAgkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBBQZhc3NldEEJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQUGYXNzZXRCBAxwb29sQXNzZXRJZEEIBQskdDA3MDYzNzE2MgJfMQQMcG9vbEFzc2V0SWRCCAULJHQwNzA2MzcxNjICXzIEDHVuYWN0aXZlVm90ZQkBFWdldFVuYWN0aXZlVm90aW5nUG9vbAAEEW5ld051bWJlck9mVm90aW5nCQEZZ2V0QWN0aXZlVm90aW5nUG9vbEFtb3VudAAEDGlzUG9vbEV4aXN0cwkBFmlzTGFzdEFjdGl2ZVBvb2xFeGlzdHMCBQZhc3NldEEFBmFzc2V0QgQLJHQwNzMzMjc0MTAJAQxnZXRBc3NldEluZm8BBQxwb29sQXNzZXRJZEEEDnBtdFN0ckFzc2V0SWRBCAULJHQwNzMzMjc0MTACXzEEDXBtdEFzc2V0TmFtZUEIBQskdDA3MzMyNzQxMAJfMgQMcG10RGVjaW1hbHNBCAULJHQwNzMzMjc0MTACXzMECyR0MDc0MTU3NDkzCQEMZ2V0QXNzZXRJbmZvAQUMcG9vbEFzc2V0SWRCBA5wbXRTdHJBc3NldElkQggFCyR0MDc0MTU3NDkzAl8xBA1wbXRBc3NldE5hbWVCCAULJHQwNzQxNTc0OTMCXzIEDHBtdERlY2ltYWxzQggFCyR0MDc0MTU3NDkzAl8zAwkAAAIFDHBvb2xBc3NldElkQQUMcG9vbEFzc2V0SWRCCQACAQIYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50AwUMaXNQb29sRXhpc3RzCQACAQIYVGhpcyBwb29sIGFscmVhZHkgZXhpc3RzAwMJAAACBQZhc3NldEECAAYJAAACBQZhc3NldEICAAkAAgECFUFzc2V0cyBjYW4ndCBiZSBlbXB0eQQIcG10RW50cnkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFA25pbAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECG09uZSBhdHRhY2hlZCBhc3NldCBleHBlY3RlZAQLJHQwNzk1OTgwMzQJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAULJHQwNzk1OTgwMzQCXzEECnBtdEFzc2V0SWQIBQskdDA3OTU5ODAzNAJfMgMJAQIhPQIFCnBtdEFzc2V0SWQFBFNXT1AJAAIBAhlZb3UgbXVzdCB1c2UgYSBTV09QIHRva2VuAwkBAiE9AgUJcG10QW1vdW50BSFjb21pc3Npb25Gb3JJbml0YWxpemF0aW9uT2ZWb3RpbmcJAAIBAiJZb3UgbmVlZCB0byBhdHRhY2ggNTAwIFNXT1AgdG9rZW5zCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDnRlYW1Cb3hBZGRyZXNzBQlwbXRBbW91bnQFCnBtdEFzc2V0SWQFA25pbAMDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQkBASEBAwMJAAACBQxwb29sQXNzZXRJZEIFBFVTRE4GCQAAAgUMcG9vbEFzc2V0SWRCBQR1bml0BgkAAAIFDHBvb2xBc3NldElkQgUEU1dPUAcJAAIBAiJhc3NldEIgbXVzdCBiZSBVU0ROLCBXQVZFUyBvciBTV09QAwMJAGYCCQBkAgURbmV3TnVtYmVyT2ZWb3RpbmcAAQURbWF4QW1vdW50T2ZWb3RpbmcGCQAAAgUMdW5hY3RpdmVWb3RlAgAJAAIBCQCsAgICJFRvbyBtYW55IHZvdGluZ3MuIE1heGltdW0gcXVhbnRpdHk6IAkApAMBBRFtYXhBbW91bnRPZlZvdGluZwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmFzc2V0QQIBXwUGYXNzZXRCAgFfCQCkAwEFDmFtb3VudE9mVm90aW5nBQh2b3RpbmdJZAUOYW1vdW50T2ZWb3RpbmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQ5hbW91bnRPZlZvdGluZwUNa0hlaWdodE9mUG9vbAkAZAIFBmhlaWdodAUSdm90aW5nUGVyaW9kTGVuZ3RoCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKQDAQUOYW1vdW50T2ZWb3RpbmcFD2tTdGF0dXNPZlZvdGluZwYJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tBbW91bnRPZlZvdGluZwkAZAIFDmFtb3VudE9mVm90aW5nAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tOdW1iZXJPZlZvdGluZwkAZAIFEW5ld051bWJlck9mVm90aW5nAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZhc3NldEEFBWtOYW1lBQ1wbXRBc3NldE5hbWVBCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGYXNzZXRCBQVrTmFtZQUNcG10QXNzZXROYW1lQgkAzAgCCQELU3RyaW5nRW50cnkCBQx1bmFjdGl2ZVZvdGUJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZhc3NldEECAV8FBmFzc2V0QgIBXwkApAMBBQ5hbW91bnRPZlZvdGluZwUIdm90aW5nSWQFA25pbAFpAQt2b3RlRm9yUG9vbAMGdm90aW5nB3llc09yTm8Hdm90ZUFtdAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQNY3VycmVudEhlaWdodAUGaGVpZ2h0BA5wb29sSW5pdEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQUGdm90aW5nBQ1rSGVpZ2h0T2ZQb29sAhFFbXB0eSBwb29sIGhlaWdodAQOc3RhdHVzT2ZWb3RpbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCkAwEFBnZvdGluZwUPa1N0YXR1c09mVm90aW5nBgQUdXNlclNXT1BpbkdvdmVybmFuY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICCQClCAEIBQFpBmNhbGxlcgUPa1VzZXJUb3RhbEdTV09QAAAEDXRvdGFsVm90ZVVzZXIDBQd5ZXNPck5vCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQZ2b3RpbmcFB2tOb1VzZXIAAAUHdm90ZUFtdAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUGdm90aW5nBQhrWWVzVXNlcgAABQd2b3RlQW10AwkBASEBCQEUaXNDYWxsZXJJbkdvdmVybmFuY2UBCAUBaQZjYWxsZXIJAAIBAipUaGlzIGFkZHJlc3MgaGFzIDAgU1dPUCBpbiBHb3Zlcm5hbmNlIGRBcHADCQEBIQEFDnN0YXR1c09mVm90aW5nCQACAQIYVGhpcyB2b3Rpbmcgd2FzIGNhbmNlbGVkAwkAZgIFDWN1cnJlbnRIZWlnaHQFDnBvb2xJbml0SGVpZ2h0CQACAQIXVGhpcyB2b3Rpbmcgd2FzIGV4cGlyZWQDCQBmAgAABQd2b3RlQW10CQACAQIkVGhlIG51bWJlciBvZiB2b3RlcyBtdXN0IGJlIHBvc2l0aXZlAwkAZgIFDXRvdGFsVm90ZVVzZXIFFHVzZXJTV09QaW5Hb3Zlcm5hbmNlCQACAQkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICBSBoYXMgCQCkAwEFFHVzZXJTV09QaW5Hb3Zlcm5hbmNlAhUgR1NXT1AgaW4gZ292ZXJuYW5jZS4DBQd5ZXNPck5vBAtvbGRWb3RlVXNlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQZ2b3RpbmcFCGtZZXNVc2VyAAAEB25ld1ZvdGUJAGQCCQBlAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQUGdm90aW5nBQRrWWVzAAAFC29sZFZvdGVVc2VyBQd2b3RlQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQUGdm90aW5nBQRrWWVzBQduZXdWb3RlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQZ2b3RpbmcFCGtZZXNVc2VyBQd2b3RlQW10BQNuaWwEC29sZFZvdGVVc2VyCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBnZvdGluZwUHa05vVXNlcgAABAduZXdWb3RlCQBkAgkAZQIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFBnZvdGluZwUDa05vAAAFC29sZFZvdGVVc2VyBQd2b3RlQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQUGdm90aW5nBQNrTm8FB25ld1ZvdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBnZvdGluZwUHa05vVXNlcgUHdm90ZUFtdAUDbmlsAWkBDGNhbmNlbFZvdGluZwIGdm90aW5nBWNhdXNlCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpBA5zdGF0dXNPZlZvdGluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQUGdm90aW5nBQ9rU3RhdHVzT2ZWb3RpbmcGAwkBASEBBQ5zdGF0dXNPZlZvdGluZwkAAgEJAKwCAgkArAICAgdWb3RpbmcgCQCkAwEFBnZvdGluZwIZIGhhcyBhbHJlYWR5IGJlZW4gc3RvcHBlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa051bWJlck9mVm90aW5nCQBlAgUObnVtYmVyT2ZWb3RpbmcAAQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCkAwEFBnZvdGluZwUPa1N0YXR1c09mVm90aW5nBwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQUGdm90aW5nBQxrQ2FuY2VsQ2F1c2UFBWNhdXNlBQNuaWwBaQEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBBQZhY3RpdmUJAAIBCQCsAgICIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa0NhdXNlAhp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAkBB3N1c3BlbmQBAg9QYXVzZWQgYnkgYWRtaW4BaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwUGYWN0aXZlCQACAQIWREFwcCBpcyBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwBAnR4AQZ2ZXJpZnkABBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAJg2Xlu", "height": 3931713, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CmKM2THRf77A495ghYJxAaViZmjueNN4JggP8hpXgEP8 Next: none Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
4+let ORACLE = addressFromStringValue(getStringValue(this, "oracle"))
55
66 let version = "1.0.0"
77
5353
5454 let kAdminPubKey3 = "admin_pub_3"
5555
56-let kMoneyBoxAddress = "money_box_address"
56+let kTeamBoxAddress = "team_box_address"
5757
5858 let kGovAddress = "governance_address"
5959
7575
7676 let active = getBooleanValue(this, kActive)
7777
78-let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
78+let activeGlob = valueOrElse(getBoolean(ORACLE, kActiveGlob), true)
7979
80-let comissionForInitalizationOfVoting = 1000000000
80+let comissionForInitalizationOfVoting = 50000000000
8181
8282 let maxAmountOfVoting = 3
8383
8585
8686 let votingPeriodLength = (1443 * maxDayOfVoting)
8787
88-func getBase58FromOracle (key) = match getString(oracle, key) {
88+func getBase58FromOracle (key) = match getString(ORACLE, key) {
8989 case string: String =>
9090 fromBase58String(string)
9191 case nothing =>
103103
104104 let farmingAddr = Address(getBase58FromOracle(kFarmingAddr))
105105
106-let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
106+let teamBoxAddress = Address(getBase58FromOracle(kTeamBoxAddress))
107107
108108 let USDN = getBase58FromOracle(kUSDNAssetId)
109109
110110 let SWOP = fromBase58String(getStringValue(farmingAddr, kSWOPid))
111-
112-let ROME = base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
113111
114112 func isActive () = if (if (active)
115113 then activeGlob
247245
248246 @Callable(i)
249247 func initVotingForNewPool (assetA,assetB) = valueOrElse(isActive(), {
250- let $t071287203 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
251- let pmtAmount = $t071287203._1
252- let pmtAssetId = $t071287203._2
253- let $t072087307 = $Tuple2(getAssetInfoFromString(assetA), getAssetInfoFromString(assetB))
254- let poolAssetIdA = $t072087307._1
255- let poolAssetIdB = $t072087307._2
248+ let $t070637162 = $Tuple2(getAssetInfoFromString(assetA), getAssetInfoFromString(assetB))
249+ let poolAssetIdA = $t070637162._1
250+ let poolAssetIdB = $t070637162._2
256251 let unactiveVote = getUnactiveVotingPool()
257252 let newNumberOfVoting = getActiveVotingPoolAmount()
258253 let isPoolExists = isLastActivePoolExists(assetA, assetB)
259- let $t074777555 = getAssetInfo(poolAssetIdA)
260- let pmtStrAssetIdA = $t074777555._1
261- let pmtAssetNameA = $t074777555._2
262- let pmtDecimalsA = $t074777555._3
263- let $t075607638 = getAssetInfo(poolAssetIdB)
264- let pmtStrAssetIdB = $t075607638._1
265- let pmtAssetNameB = $t075607638._2
266- let pmtDecimalsB = $t075607638._3
254+ let $t073327410 = getAssetInfo(poolAssetIdA)
255+ let pmtStrAssetIdA = $t073327410._1
256+ let pmtAssetNameA = $t073327410._2
257+ let pmtDecimalsA = $t073327410._3
258+ let $t074157493 = getAssetInfo(poolAssetIdB)
259+ let pmtStrAssetIdB = $t074157493._1
260+ let pmtAssetNameB = $t074157493._2
261+ let pmtDecimalsB = $t074157493._3
267262 if ((poolAssetIdA == poolAssetIdB))
268263 then throw("Assets must be different")
269264 else if (isPoolExists)
270265 then throw("This pool already exists")
271- else if ((size(i.payments) != 1))
272- then throw("One attached asset expected")
273- else if ((pmtAssetId != SWOP))
274- then throw("You must use a SWOP token")
275- else if (if ((assetA == ""))
276- then true
277- else (assetB == ""))
278- then throw("Assets can't be empty")
279- else if ((pmtAmount != comissionForInitalizationOfVoting))
280- then throw("You need to attach 10 SWOP tokens")
281- else if (!(if (if ((poolAssetIdB == USDN))
282- then true
283- else (poolAssetIdB == unit))
284- then true
285- else if ((poolAssetIdB == SWOP))
286- then true
287- else (poolAssetIdB == ROME)))
288- then throw("assetB must be USDN, WAVES or SWOP ROME")
289- else if (if (((newNumberOfVoting + 1) > maxAmountOfVoting))
290- then true
291- else (unactiveVote == ""))
292- then throw(("Too many votings. Maximum quantity: " + toString(maxAmountOfVoting)))
293- else [IntegerEntry((((((assetA + "_") + assetB) + "_") + toString(amountOfVoting)) + votingId), amountOfVoting), IntegerEntry((toString(amountOfVoting) + kHeightOfPool), (height + votingPeriodLength)), BooleanEntry((toString(amountOfVoting) + kStatusOfVoting), true), IntegerEntry(kAmountOfVoting, (amountOfVoting + 1)), IntegerEntry(kNumberOfVoting, (newNumberOfVoting + 1)), StringEntry((assetA + kName), pmtAssetNameA), StringEntry((assetB + kName), pmtAssetNameB), StringEntry(unactiveVote, (((((assetA + "_") + assetB) + "_") + toString(amountOfVoting)) + votingId)), ScriptTransfer(moneyBoxAddress, pmtAmount, pmtAssetId)]
266+ else if (if ((assetA == ""))
267+ then true
268+ else (assetB == ""))
269+ then throw("Assets can't be empty")
270+ else {
271+ let pmtEntry = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
272+ then nil
273+ else if ((size(i.payments) != 1))
274+ then throw("One attached asset expected")
275+ else {
276+ let $t079598034 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
277+ let pmtAmount = $t079598034._1
278+ let pmtAssetId = $t079598034._2
279+ if ((pmtAssetId != SWOP))
280+ then throw("You must use a SWOP token")
281+ else if ((pmtAmount != comissionForInitalizationOfVoting))
282+ then throw("You need to attach 500 SWOP tokens")
283+ else [ScriptTransfer(teamBoxAddress, pmtAmount, pmtAssetId)]
284+ }
285+ if (if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
286+ then !(if (if ((poolAssetIdB == USDN))
287+ then true
288+ else (poolAssetIdB == unit))
289+ then true
290+ else (poolAssetIdB == SWOP))
291+ else false)
292+ then throw("assetB must be USDN, WAVES or SWOP")
293+ else if (if (((newNumberOfVoting + 1) > maxAmountOfVoting))
294+ then true
295+ else (unactiveVote == ""))
296+ then throw(("Too many votings. Maximum quantity: " + toString(maxAmountOfVoting)))
297+ else [IntegerEntry((((((assetA + "_") + assetB) + "_") + toString(amountOfVoting)) + votingId), amountOfVoting), IntegerEntry((toString(amountOfVoting) + kHeightOfPool), (height + votingPeriodLength)), BooleanEntry((toString(amountOfVoting) + kStatusOfVoting), true), IntegerEntry(kAmountOfVoting, (amountOfVoting + 1)), IntegerEntry(kNumberOfVoting, (newNumberOfVoting + 1)), StringEntry((assetA + kName), pmtAssetNameA), StringEntry((assetB + kName), pmtAssetNameB), StringEntry(unactiveVote, (((((assetA + "_") + assetB) + "_") + toString(amountOfVoting)) + votingId))]
298+ }
294299 })
295300
296301
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
4+let ORACLE = addressFromStringValue(getStringValue(this, "oracle"))
55
66 let version = "1.0.0"
77
88 let kVersion = "version"
99
1010 let kActive = "active"
1111
1212 let kActiveGlob = "active_all_contracts"
1313
1414 let kNumberOfVoting = "voting_active_number"
1515
1616 let kHeightOfPool = "_finish_height"
1717
1818 let kNo = "_total_votes_no"
1919
2020 let kYes = "_total_votes_yes"
2121
2222 let kNoUser = "_vote_no"
2323
2424 let kYesUser = "_vote_yes"
2525
2626 let kStatusOfVoting = "_status"
2727
2828 let kAmountOfVoting = "voting_id_last"
2929
3030 let kMaxAmountOfVoting = "max_amount_voting"
3131
3232 let kMaxDayOfVoting = "max_day_voting"
3333
3434 let kCause = "shutdown_cause"
3535
3636 let kCancelCause = "_cancel_cause"
3737
3838 let kUserTotalGSWOP = "_GSwop_amount"
3939
4040 let kName = "_asset_name"
4141
4242 let votingId = "_voting"
4343
4444 let activeVoteFirst = "voting_active_cell_1"
4545
4646 let activeVoteSecond = "voting_active_cell_2"
4747
4848 let activeVoteThird = "voting_active_cell_3"
4949
5050 let kAdminPubKey1 = "admin_pub_1"
5151
5252 let kAdminPubKey2 = "admin_pub_2"
5353
5454 let kAdminPubKey3 = "admin_pub_3"
5555
56-let kMoneyBoxAddress = "money_box_address"
56+let kTeamBoxAddress = "team_box_address"
5757
5858 let kGovAddress = "governance_address"
5959
6060 let kFarmingAddr = "farming_address"
6161
6262 let kUSDNAssetId = "usdn_asset_id"
6363
6464 let kSWOPid = "SWOP_id"
6565
6666 let numberOfVoting = getIntegerValue(this, kNumberOfVoting)
6767
6868 let amountOfVoting = getIntegerValue(this, kAmountOfVoting)
6969
7070 let firstActiveVote = valueOrElse(getString(this, activeVoteFirst), "")
7171
7272 let secondActiveVote = valueOrElse(getString(this, activeVoteSecond), "")
7373
7474 let thirdActiveVote = valueOrElse(getString(this, activeVoteThird), "")
7575
7676 let active = getBooleanValue(this, kActive)
7777
78-let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
78+let activeGlob = valueOrElse(getBoolean(ORACLE, kActiveGlob), true)
7979
80-let comissionForInitalizationOfVoting = 1000000000
80+let comissionForInitalizationOfVoting = 50000000000
8181
8282 let maxAmountOfVoting = 3
8383
8484 let maxDayOfVoting = 7
8585
8686 let votingPeriodLength = (1443 * maxDayOfVoting)
8787
88-func getBase58FromOracle (key) = match getString(oracle, key) {
88+func getBase58FromOracle (key) = match getString(ORACLE, key) {
8989 case string: String =>
9090 fromBase58String(string)
9191 case nothing =>
9292 throw((key + "is empty"))
9393 }
9494
9595
9696 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
9797
9898 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
9999
100100 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
101101
102102 let govAddress = Address(getBase58FromOracle(kGovAddress))
103103
104104 let farmingAddr = Address(getBase58FromOracle(kFarmingAddr))
105105
106-let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
106+let teamBoxAddress = Address(getBase58FromOracle(kTeamBoxAddress))
107107
108108 let USDN = getBase58FromOracle(kUSDNAssetId)
109109
110110 let SWOP = fromBase58String(getStringValue(farmingAddr, kSWOPid))
111-
112-let ROME = base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
113111
114112 func isActive () = if (if (active)
115113 then activeGlob
116114 else false)
117115 then unit
118116 else throw("DApp is inactive at this moment")
119117
120118
121119 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
122120 then unit
123121 else throw("Only admin can call this function")
124122
125123
126124 func getAssetInfo (assetId) = match assetId {
127125 case id: ByteVector =>
128126 if (isDefined(assetInfo(id)))
129127 then {
130128 let stringId = toBase58String(id)
131129 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
132130 $Tuple3(stringId, info.name, info.decimals)
133131 }
134132 else throw("Asset is not defined")
135133 case waves: Unit =>
136134 $Tuple3("WAVES", "WAVES", 8)
137135 case _ =>
138136 throw("Match error")
139137 }
140138
141139
142140 func isActivePoolExists (pools,assetA,assetB) = {
143141 let poolsData = split(pools, "_")
144142 let isPoolDefine = isDefined(getInteger(this, pools))
145143 if (if (isPoolDefine)
146144 then (pools != "")
147145 else false)
148146 then {
149147 let voting = poolsData[2]
150148 let newPools = (((((assetA + "_") + assetB) + "_") + voting) + votingId)
151149 let isNewPoolDefine = isDefined(getInteger(this, newPools))
152150 let heightOfVoting = valueOrElse(getInteger(this, (voting + kHeightOfPool)), 0)
153151 let statusOfVoting = valueOrElse(getBoolean(this, (voting + kStatusOfVoting)), true)
154152 if (isNewPoolDefine)
155153 then if ((heightOfVoting > height))
156154 then if (statusOfVoting)
157155 then true
158156 else false
159157 else false
160158 else false
161159 }
162160 else false
163161 }
164162
165163
166164 func isUnactivePoolExists (poolsState) = {
167165 let pools = valueOrElse(getString(this, poolsState), "")
168166 let poolsData = split(pools, "_")
169167 let isPoolDefine = isDefined(getInteger(this, pools))
170168 if (if (isPoolDefine)
171169 then (pools != "")
172170 else false)
173171 then {
174172 let voting = poolsData[2]
175173 let heightOfVoting = valueOrElse(getInteger(this, (voting + kHeightOfPool)), 0)
176174 let statusOfVoting = valueOrElse(getBoolean(this, (voting + kStatusOfVoting)), true)
177175 if ((heightOfVoting > height))
178176 then if (statusOfVoting)
179177 then ""
180178 else poolsState
181179 else poolsState
182180 }
183181 else poolsState
184182 }
185183
186184
187185 func isLastActivePoolExists (assetA,assetB) = if (if (isActivePoolExists(firstActiveVote, assetA, assetB))
188186 then true
189187 else isActivePoolExists(secondActiveVote, assetA, assetB))
190188 then true
191189 else isActivePoolExists(thirdActiveVote, assetA, assetB)
192190
193191
194192 func getActivePool (voting) = {
195193 let heightOfVoting = valueOrElse(getInteger(this, (toString(voting) + kHeightOfPool)), 0)
196194 let statusOfVoting = valueOrElse(getBoolean(this, (toString(voting) + kStatusOfVoting)), true)
197195 let currentHeight = height
198196 if ((0 > voting))
199197 then 0
200198 else if (!(statusOfVoting))
201199 then 0
202200 else if ((heightOfVoting > currentHeight))
203201 then 1
204202 else 0
205203 }
206204
207205
208206 func getActiveVotingPoolAmount () = ((getActivePool(valueOrElse(getInteger(this, firstActiveVote), -1)) + getActivePool(valueOrElse(getInteger(this, secondActiveVote), -1))) + getActivePool(valueOrElse(getInteger(this, thirdActiveVote), -1)))
209207
210208
211209 func getUnactiveVotingPool () = if ((isUnactivePoolExists(activeVoteFirst) != ""))
212210 then activeVoteFirst
213211 else if ((isUnactivePoolExists(activeVoteSecond) != ""))
214212 then activeVoteSecond
215213 else if ((isUnactivePoolExists(activeVoteThird) != ""))
216214 then activeVoteThird
217215 else ""
218216
219217
220218 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
221219 then unit
222220 else fromBase58String(assetStr)
223221
224222
225223 func isCallerInGovernance (user) = if ((valueOrElse(getInteger(govAddress, (toString(user) + kUserTotalGSWOP)), 0) > 0))
226224 then true
227225 else false
228226
229227
230228 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
231229
232230
233231 @Callable(i)
234232 func init () = if ((i.caller != this))
235233 then throw("Only the DApp itself can call this function")
236234 else if (isDefined(getBoolean(this, kActive)))
237235 then throw("DApp is already active")
238236 else {
239237 let initNumberOfVoting = 0
240238 let initAmountOfVoting = 0
241239 let initKeyActive = true
242240 let activeInit = ""
243241 [StringEntry(kVersion, version), BooleanEntry(kActive, initKeyActive), IntegerEntry(kNumberOfVoting, initNumberOfVoting), IntegerEntry(kAmountOfVoting, initAmountOfVoting), IntegerEntry(kMaxAmountOfVoting, maxAmountOfVoting), IntegerEntry(kMaxDayOfVoting, maxDayOfVoting), StringEntry(activeVoteFirst, activeInit), StringEntry(activeVoteSecond, activeInit), StringEntry(activeVoteThird, activeInit)]
244242 }
245243
246244
247245
248246 @Callable(i)
249247 func initVotingForNewPool (assetA,assetB) = valueOrElse(isActive(), {
250- let $t071287203 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
251- let pmtAmount = $t071287203._1
252- let pmtAssetId = $t071287203._2
253- let $t072087307 = $Tuple2(getAssetInfoFromString(assetA), getAssetInfoFromString(assetB))
254- let poolAssetIdA = $t072087307._1
255- let poolAssetIdB = $t072087307._2
248+ let $t070637162 = $Tuple2(getAssetInfoFromString(assetA), getAssetInfoFromString(assetB))
249+ let poolAssetIdA = $t070637162._1
250+ let poolAssetIdB = $t070637162._2
256251 let unactiveVote = getUnactiveVotingPool()
257252 let newNumberOfVoting = getActiveVotingPoolAmount()
258253 let isPoolExists = isLastActivePoolExists(assetA, assetB)
259- let $t074777555 = getAssetInfo(poolAssetIdA)
260- let pmtStrAssetIdA = $t074777555._1
261- let pmtAssetNameA = $t074777555._2
262- let pmtDecimalsA = $t074777555._3
263- let $t075607638 = getAssetInfo(poolAssetIdB)
264- let pmtStrAssetIdB = $t075607638._1
265- let pmtAssetNameB = $t075607638._2
266- let pmtDecimalsB = $t075607638._3
254+ let $t073327410 = getAssetInfo(poolAssetIdA)
255+ let pmtStrAssetIdA = $t073327410._1
256+ let pmtAssetNameA = $t073327410._2
257+ let pmtDecimalsA = $t073327410._3
258+ let $t074157493 = getAssetInfo(poolAssetIdB)
259+ let pmtStrAssetIdB = $t074157493._1
260+ let pmtAssetNameB = $t074157493._2
261+ let pmtDecimalsB = $t074157493._3
267262 if ((poolAssetIdA == poolAssetIdB))
268263 then throw("Assets must be different")
269264 else if (isPoolExists)
270265 then throw("This pool already exists")
271- else if ((size(i.payments) != 1))
272- then throw("One attached asset expected")
273- else if ((pmtAssetId != SWOP))
274- then throw("You must use a SWOP token")
275- else if (if ((assetA == ""))
276- then true
277- else (assetB == ""))
278- then throw("Assets can't be empty")
279- else if ((pmtAmount != comissionForInitalizationOfVoting))
280- then throw("You need to attach 10 SWOP tokens")
281- else if (!(if (if ((poolAssetIdB == USDN))
282- then true
283- else (poolAssetIdB == unit))
284- then true
285- else if ((poolAssetIdB == SWOP))
286- then true
287- else (poolAssetIdB == ROME)))
288- then throw("assetB must be USDN, WAVES or SWOP ROME")
289- else if (if (((newNumberOfVoting + 1) > maxAmountOfVoting))
290- then true
291- else (unactiveVote == ""))
292- then throw(("Too many votings. Maximum quantity: " + toString(maxAmountOfVoting)))
293- else [IntegerEntry((((((assetA + "_") + assetB) + "_") + toString(amountOfVoting)) + votingId), amountOfVoting), IntegerEntry((toString(amountOfVoting) + kHeightOfPool), (height + votingPeriodLength)), BooleanEntry((toString(amountOfVoting) + kStatusOfVoting), true), IntegerEntry(kAmountOfVoting, (amountOfVoting + 1)), IntegerEntry(kNumberOfVoting, (newNumberOfVoting + 1)), StringEntry((assetA + kName), pmtAssetNameA), StringEntry((assetB + kName), pmtAssetNameB), StringEntry(unactiveVote, (((((assetA + "_") + assetB) + "_") + toString(amountOfVoting)) + votingId)), ScriptTransfer(moneyBoxAddress, pmtAmount, pmtAssetId)]
266+ else if (if ((assetA == ""))
267+ then true
268+ else (assetB == ""))
269+ then throw("Assets can't be empty")
270+ else {
271+ let pmtEntry = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
272+ then nil
273+ else if ((size(i.payments) != 1))
274+ then throw("One attached asset expected")
275+ else {
276+ let $t079598034 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
277+ let pmtAmount = $t079598034._1
278+ let pmtAssetId = $t079598034._2
279+ if ((pmtAssetId != SWOP))
280+ then throw("You must use a SWOP token")
281+ else if ((pmtAmount != comissionForInitalizationOfVoting))
282+ then throw("You need to attach 500 SWOP tokens")
283+ else [ScriptTransfer(teamBoxAddress, pmtAmount, pmtAssetId)]
284+ }
285+ if (if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
286+ then !(if (if ((poolAssetIdB == USDN))
287+ then true
288+ else (poolAssetIdB == unit))
289+ then true
290+ else (poolAssetIdB == SWOP))
291+ else false)
292+ then throw("assetB must be USDN, WAVES or SWOP")
293+ else if (if (((newNumberOfVoting + 1) > maxAmountOfVoting))
294+ then true
295+ else (unactiveVote == ""))
296+ then throw(("Too many votings. Maximum quantity: " + toString(maxAmountOfVoting)))
297+ else [IntegerEntry((((((assetA + "_") + assetB) + "_") + toString(amountOfVoting)) + votingId), amountOfVoting), IntegerEntry((toString(amountOfVoting) + kHeightOfPool), (height + votingPeriodLength)), BooleanEntry((toString(amountOfVoting) + kStatusOfVoting), true), IntegerEntry(kAmountOfVoting, (amountOfVoting + 1)), IntegerEntry(kNumberOfVoting, (newNumberOfVoting + 1)), StringEntry((assetA + kName), pmtAssetNameA), StringEntry((assetB + kName), pmtAssetNameB), StringEntry(unactiveVote, (((((assetA + "_") + assetB) + "_") + toString(amountOfVoting)) + votingId))]
298+ }
294299 })
295300
296301
297302
298303 @Callable(i)
299304 func voteForPool (voting,yesOrNo,voteAmt) = valueOrElse(isActive(), {
300305 let currentHeight = height
301306 let poolInitHeight = valueOrErrorMessage(getIntegerValue(this, (toString(voting) + kHeightOfPool)), "Empty pool height")
302307 let statusOfVoting = valueOrElse(getBoolean(this, (toString(voting) + kStatusOfVoting)), true)
303308 let userSWOPinGovernance = valueOrElse(getInteger(govAddress, (toString(i.caller) + kUserTotalGSWOP)), 0)
304309 let totalVoteUser = if (yesOrNo)
305310 then (valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(voting)) + kNoUser)), 0) + voteAmt)
306311 else (valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(voting)) + kYesUser)), 0) + voteAmt)
307312 if (!(isCallerInGovernance(i.caller)))
308313 then throw("This address has 0 SWOP in Governance dApp")
309314 else if (!(statusOfVoting))
310315 then throw("This voting was canceled")
311316 else if ((currentHeight > poolInitHeight))
312317 then throw("This voting was expired")
313318 else if ((0 > voteAmt))
314319 then throw("The number of votes must be positive")
315320 else if ((totalVoteUser > userSWOPinGovernance))
316321 then throw((((toString(i.caller) + " has ") + toString(userSWOPinGovernance)) + " GSWOP in governance."))
317322 else if (yesOrNo)
318323 then {
319324 let oldVoteUser = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(voting)) + kYesUser)), 0)
320325 let newVote = ((valueOrElse(getInteger(this, (toString(voting) + kYes)), 0) - oldVoteUser) + voteAmt)
321326 [IntegerEntry((toString(voting) + kYes), newVote), IntegerEntry((((toString(i.caller) + "_") + toString(voting)) + kYesUser), voteAmt)]
322327 }
323328 else {
324329 let oldVoteUser = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(voting)) + kNoUser)), 0)
325330 let newVote = ((valueOrElse(getInteger(this, (toString(voting) + kNo)), 0) - oldVoteUser) + voteAmt)
326331 [IntegerEntry((toString(voting) + kNo), newVote), IntegerEntry((((toString(i.caller) + "_") + toString(voting)) + kNoUser), voteAmt)]
327332 }
328333 })
329334
330335
331336
332337 @Callable(i)
333338 func cancelVoting (voting,cause) = valueOrElse(isAdminCall(i), {
334339 let statusOfVoting = valueOrElse(getBoolean(this, (toString(voting) + kStatusOfVoting)), true)
335340 if (!(statusOfVoting))
336341 then throw((("Voting " + toString(voting)) + " has already been stopped"))
337342 else [IntegerEntry(kNumberOfVoting, (numberOfVoting - 1)), BooleanEntry((toString(voting) + kStatusOfVoting), false), StringEntry((toString(voting) + kCancelCause), cause)]
338343 })
339344
340345
341346
342347 @Callable(i)
343348 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
344349 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
345350 else suspend("Paused by admin"))
346351
347352
348353
349354 @Callable(i)
350355 func activate () = valueOrElse(isAdminCall(i), if (active)
351356 then throw("DApp is already active")
352357 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
353358
354359
355360 @Verifier(tx)
356361 func verify () = {
357362 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
358363 then 1
359364 else 0
360365 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
361366 then 1
362367 else 0
363368 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
364369 then 1
365370 else 0
366371 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
367372 }
368373

github/deemru/w8io/786bc32 
51.26 ms