tx · 7WX9pdKUXDWPiMJvFbr4qxUh9SvGttSJChaPYZTG9oJR

3PKpNjGyCZuq29dUPX28a4yBWEybKKJ5TNg:  -0.01000000 Waves

2022.11.12 05:06 [3378698] smart account 3PKpNjGyCZuq29dUPX28a4yBWEybKKJ5TNg > SELF 0.00000000 Waves

{ "type": 13, "id": "7WX9pdKUXDWPiMJvFbr4qxUh9SvGttSJChaPYZTG9oJR", "fee": 1000000, "feeAssetId": null, "timestamp": 1668218775154, "version": 2, "chainId": 87, "sender": "3PKpNjGyCZuq29dUPX28a4yBWEybKKJ5TNg", "senderPublicKey": "H8X1iz7BJZCnVq2eHQnQK1nmZbGzQKxyX1ZcfMz9qKT4", "proofs": [ "3uHwzeEa6BkDHcVvASZHnFL3Nzp2duJRYbwkVMrgPGkAA7ykDxDTx7nbhnQoYzbhqYcSf7mE565QcgQa6YxdKJT9" ], "script": "base64:BgIZCAISAwoBCBIDCgEIEgYKBAgIAQESAwoBCEEAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAKV0FWRVNJRFNUUgIFV0FWRVMAB1dBVkVTSUQJANkEAQUKV0FWRVNJRFNUUgEMZ2V0SW50T3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9NYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQxnZXRTdHJPckVsc2UDB2FkZHJlc3MDa2V5CmRlZmF1bHRWYWwJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUHYWRkcmVzcwUDa2V5BQpkZWZhdWx0VmFsAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQCsAgIJAKwCAgIPTWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEQZ2V0QWRkcmVzc09yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMFA2tleQkArAICCQCsAgICFUZhaWwgdG8gY29udmVydCB0aGlzLgUDa2V5AhMgdmFsdWUgaW50byBBZGRyZXNzARRhc1N3b3BmaVJlc3VsdFNUUlVDVAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAhEoSW50LCBCeXRlVmVjdG9yKQQGc3RydWN0BQckbWF0Y2gwBQZzdHJ1Y3QJAAIBAh1mYWlsIHRvIGNhc3QgaW50byBUdXBsZTUgaW50cwEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFpBQckbWF0Y2gwBQFpCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50ARV2YWxpZGF0ZUFkZHJlc3NPckZhaWwBCmFkZHJlc3NTdHIEB2FkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQphZGRyZXNzU3RyCQCsAgICHWZhaWwgdG8gY29udmVydCBpbnRvIGFkZHJlc3MgBQphZGRyZXNzU3RyAwkAZgIAAAgJAO8HAQUHYWRkcmVzcwlhdmFpbGFibGUJAQV0aHJvdwAFCmFkZHJlc3NTdHIBD2tleU5vZGVSZWdpc3RyeQEHYWRkcmVzcwkArAICAgQlc19fBQdhZGRyZXNzARRrZXlOb2RlUmV3YXJkc1RvdGFscwEHYWRkcmVzcwkArAICAg4lcyVzX190b3RhbHNfXwUHYWRkcmVzcwETa2V5QXBwcm92ZWROb2RlTGlzdAACFCVzX19hcHByb3ZlZE5vZGVMaXN0ARBrZXlEZXBvc2l0QW1vdW50AAIYJXMlc19fY2ZnX19kZXBvc2l0QW1vdW50ARVrZXlOZXV0cmlub0FkZHJlc3NTdHIAAholcyVzX19jZmdfX25ldXRyaW5vQWRkcmVzcwEXa2V5TWFzdGVyTm9kZUFkZHJlc3NTdHIAAiIlcyVzX19jZmdfX21haW5OZXV0cmlub05vZGVBZGRyZXNzARFrZXlQcm90b2NvbFBhcnRYNgACGSVzJXNfX2NmZ19fcHJvdG9jb2xQYXJ0WDYBE2tleUJlbmlmaWNhcnlQYXJ0WDYAAhslcyVzX19jZmdfX2JlbmlmaWNhcnlQYXJ0WDYBFmtleU1pbkRpc3RyaWJ1dGVBbW91bnQAAh4lcyVzX19jZmdfX21pbkRpc3RyaWJ1dGVBbW91bnQBHGtleVN3b3BmaVVzZHRVc2RuUG9vbEFkZHJlc3MAAiQlcyVzX19jZmdfX3N3b3BmaVVzZHRVc2RuUG9vbEFkZHJlc3MBEWtleVNhdmluZ3NBZGRyZXNzAAIZJXMlc19fY2ZnX19zYXZpbmdzQWRkcmVzcwEVa2V5QmVuZWZpY2lhcnlBZGRyZXNzAAIdJXMlc19fY2ZnX19iZW5lZmljaWFyeUFkZHJlc3MAGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAAQAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAIAFElkeENvbnRyb2xDZmdScGREYXBwAAMAFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAEABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAUAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAGAB1JZHhDb250cm9sQ2ZnTm9kZVJlZ2lzdHJ5RGFwcAAHABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAgAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAACQAcSWR4Q29udHJvbENmZ1N1cmZTdGFraW5nRGFwcAAKACBJZHhDb250cm9sQ2ZnR25zYnRDb250cm9sbGVyRGFwcAALABdJZHhDb250cm9sQ2ZnUmVzdFYyRGFwcAAMABtJZHhDb250cm9sQ2ZnR292ZXJuYW5jZURhcHAADQERa2V5Q29udHJvbEFkZHJlc3MAAhwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQ1rZXlDb250cm9sQ2ZnAAIRJXNfX2NvbnRyb2xDb25maWcBDmtleVVzZG5Bc3NldElkAAIRbmV1dHJpbm9fYXNzZXRfaWQBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQdjb250cm9sCQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQdjb250cm9sCQENa2V5Q29udHJvbENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgpjb250cm9sQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKY29udHJvbENmZwUDaWR4CQCsAgICLUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAD2NvbnRyb2xDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5Q29udHJvbEFkZHJlc3MAAiMzUDVCZmQ1OFBQZk52Qk0ySHk4UWZiY0RxTWVOdHpnN0tmUAAKY29udHJvbENmZwkBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQUPY29udHJvbENvbnRyYWN0ABNuZXV0cmlub0NvbnRyYWN0U3RyAiMzUDU1NFZwZ1lEUzN0V3gycnlnVnVVRG85NGd3cEtqTnFhdQAQbmV1dHJpbm9Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUTbmV1dHJpbm9Db250cmFjdFN0cgAOdXNkbkFzc2V0SWRTdHIJAQxnZXRTdHJPckVsc2UDBRBuZXV0cmlub0NvbnRyYWN0CQEOa2V5VXNkbkFzc2V0SWQAAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAALdXNkbkFzc2V0SWQJANkEAQUOdXNkbkFzc2V0SWRTdHIADG5SZWdJZHhUeEFkZAABABBuUmVnSWR4SGVpZ2h0QWRkAAIADm5SZWdJZHhUaW1lQWRkAAMADm5SZWdJZHhEZXBvQW10AAQAEm5SZWdJZHhEZXBvQW10TGVmdAAFAA1uUmVnSWR4U3RhdHVzAAYAGW5SZWdJZHhTdGF0dXNDaGFuZ2VIZWlnaHQABwAXblJlZ0lkeFN0YXR1c0NoYW5nZVRpbWUACAEQZm9ybWF0RGVwb3NpdEFkZAQHdHhJZFN0cg1kZXBvc2l0QW1vdW50FnJlbWFpbmluZ0RlcG9zaXRBbW91bnQGc3RhdHVzCQC5CQIJAMwIAgIQJXMlZCVkJWQlZCVzJWQlZAkAzAgCBQd0eElkU3RyCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFDWRlcG9zaXRBbW91bnQJAMwIAgkApAMBBRZyZW1haW5pbmdEZXBvc2l0QW1vdW50CQDMCAIFBnN0YXR1cwkAzAgCAgEwCQDMCAICATAFA25pbAUDU0VQARlmb3JtYXREZXBvc2l0Q2hhbmdlU3RhdHVzAgVvcmlnUwluZXdTdGF0dXMEBG9yaWcJALUJAgUFb3JpZ1MFA1NFUAkAuQkCCQDMCAICECVzJWQlZCVkJWQlcyVkJWQJAMwIAgkAkQMCBQRvcmlnBQxuUmVnSWR4VHhBZGQJAMwIAgkAkQMCBQRvcmlnBRBuUmVnSWR4SGVpZ2h0QWRkCQDMCAIJAJEDAgUEb3JpZwUOblJlZ0lkeFRpbWVBZGQJAMwIAgkAkQMCBQRvcmlnBQ5uUmVnSWR4RGVwb0FtdAkAzAgCCQCRAwIFBG9yaWcFEm5SZWdJZHhEZXBvQW10TGVmdAkAzAgCBQluZXdTdGF0dXMJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQNuaWwFA1NFUAEQa2V5UmV3YXJkSGlzdG9yeQILbm9kZUFkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIJAKUIAQULbm9kZUFkZHJlc3MJAMwIAgkA2AQBBQR0eElkBQNuaWwFA1NFUAERZGF0YVJld2FyZEhpc3RvcnkFEHdhdmVzQW1vdW50VG90YWwOYmVuZWZpY2lhcnlBbXQLcHJvdG9jb2xBbXQQcHJvdG9jb2xBbXRQYXJ0MRBwcm90b2NvbEFtdFBhcnQyCQC5CQIJAMwIAgIOJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUQd2F2ZXNBbW91bnRUb3RhbAkAzAgCCQCkAwEFDmJlbmVmaWNpYXJ5QW10CQDMCAIJAKQDAQULcHJvdG9jb2xBbXQJAMwIAgkApAMBBRBwcm90b2NvbEFtdFBhcnQxCQDMCAIJAKQDAQUQcHJvdG9jb2xBbXRQYXJ0MgUDbmlsBQNTRVABElJld2FyZEhpc3RvcnlFbnRyeQcLbm9kZUFkZHJlc3MEdHhJZAhtaW5lZEFtdA5iZW5lZmljaWFyeUFtdAtwcm90b2NvbEFtdAxwcm90b2NvbEFtdDEMcHJvdG9jb2xBbXQyCQELU3RyaW5nRW50cnkCCQEQa2V5UmV3YXJkSGlzdG9yeQIFC25vZGVBZGRyZXNzBQR0eElkCQERZGF0YVJld2FyZEhpc3RvcnkFBQhtaW5lZEFtdAUOYmVuZWZpY2lhcnlBbXQFC3Byb3RvY29sQW10BQxwcm90b2NvbEFtdDEFDHByb3RvY29sQW10MgEQZGF0YVJld2FyZFRvdGFscwUIbWluZWRBbXQOYmVuZWZpY2lhcnlBbXQLcHJvdG9jb2xBbXQQcHJvdG9jb2xBbXRQYXJ0MRBwcm90b2NvbEFtdFBhcnQyCQC5CQIJAMwIAgIKJWQlZCVkJWQlZAkAzAgCCQCkAwEFCG1pbmVkQW10CQDMCAIJAKQDAQUOYmVuZWZpY2lhcnlBbXQJAMwIAgkApAMBBQtwcm90b2NvbEFtdAkAzAgCCQCkAwEFEHByb3RvY29sQW10UGFydDEJAMwIAgkApAMBBRBwcm90b2NvbEFtdFBhcnQyBQNuaWwFA1NFUAERUmV3YXJkVG90YWxzRW50cnkGBW1pbmVyCG1pbmVkQW10DmJlbmVmaWNpYXJ5QW10C3Byb3RvY29sQW10EHByb3RvY29sQW10UGFydDEQcHJvdG9jb2xBbXRQYXJ0MgQUbm9kZVJld2FyZHNUb3RhbHNLRVkJARRrZXlOb2RlUmV3YXJkc1RvdGFscwEJAKUIAQUFbWluZXIEEG5vZGVSZXdhcmRzQXJyYXkJALUJAgkBDGdldFN0ck9yRWxzZQMFBHRoaXMFFG5vZGVSZXdhcmRzVG90YWxzS0VZCQEQZGF0YVJld2FyZFRvdGFscwUAAAAAAAAAAAAABQNTRVAEC25ld01pbmVkQW10CQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFEG5vZGVSZXdhcmRzQXJyYXkAAQUIbWluZWRBbXQEEW5ld0JlbmVmaWNpYXJ5QW10CQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFEG5vZGVSZXdhcmRzQXJyYXkAAgUOYmVuZWZpY2lhcnlBbXQEDm5ld1Byb3RvY29sQW10CQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFEG5vZGVSZXdhcmRzQXJyYXkAAwULcHJvdG9jb2xBbXQEE25ld1Byb3RvY29sQW10UGFydDEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUQbm9kZVJld2FyZHNBcnJheQAEBRBwcm90b2NvbEFtdFBhcnQxBBNuZXdQcm90b2NvbEFtdFBhcnQyCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFEG5vZGVSZXdhcmRzQXJyYXkABQUQcHJvdG9jb2xBbXRQYXJ0MgkBC1N0cmluZ0VudHJ5AgUUbm9kZVJld2FyZHNUb3RhbHNLRVkJARBkYXRhUmV3YXJkVG90YWxzBQULbmV3TWluZWRBbXQFEW5ld0JlbmVmaWNpYXJ5QW10BQ5uZXdQcm90b2NvbEFtdAUTbmV3UHJvdG9jb2xBbXRQYXJ0MQUTbmV3UHJvdG9jb2xBbXRQYXJ0MgEUcmVzb2x2ZUJlbmVmaWNpYXJpZXMCDG1pbmVyQWRkcmVzcxRiZW5lZmljaWFyeUZyb21QYXJhbQQPbWluZXJTY3JpcHRIYXNoCQDxBwEFDG1pbmVyQWRkcmVzcwQZYmVuZWZpY2lhcnlGcm9tTWluZXJTdGF0ZQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBD2dldFN0cmluZ09yRmFpbAIFDG1pbmVyQWRkcmVzcwkBFWtleUJlbmVmaWNpYXJ5QWRkcmVzcwADCQAAAgUPbWluZXJTY3JpcHRIYXNoBQR1bml0BRRiZW5lZmljaWFyeUZyb21QYXJhbQUZYmVuZWZpY2lhcnlGcm9tTWluZXJTdGF0ZQEdcmVhZE5vZGVEYXRhQW5kVmFsaWRhdGVTdGF0dXMCCG5vZGVBZGRyDmV4cGVjdGVkU3RhdHVzBAtub2RlRGF0YU9wdAkAoggBCQEPa2V5Tm9kZVJlZ2lzdHJ5AQUIbm9kZUFkZHIDCQEBIQEJAQlpc0RlZmluZWQBBQtub2RlRGF0YU9wdAkAAgEJAKwCAgINVW5rbm93biBOb2RlIAUIbm9kZUFkZHIEC25vZGVEYXRhU3RyCQEFdmFsdWUBBQtub2RlRGF0YU9wdAQIbm9kZURhdGEJALUJAgULbm9kZURhdGFTdHIFA1NFUAQKbm9kZVN0YXR1cwMJAGcCCQCQAwEFCG5vZGVEYXRhAAkJAJEDAgUIbm9kZURhdGEFDW5SZWdJZHhTdGF0dXMCB1BFTkRJTkcDCQECIT0CBQpub2RlU3RhdHVzBQ5leHBlY3RlZFN0YXR1cwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgVOb2RlIAUIbm9kZUFkZHICEiBzdGF0dXMgc2hvdWxkIGJlIAUOZXhwZWN0ZWRTdGF0dXMCDywgYnV0IGFjdHVhbGx5IAUKbm9kZVN0YXR1cwULbm9kZURhdGFTdHIEAWkBFWRpc3RyaWJ1dGVNaW5lclJld2FyZAEVYmVuZWZpY2lhcnlBZGRyZXNzU3RyBBNtaW5EaXN0cmlidXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARZrZXlNaW5EaXN0cmlidXRlQW1vdW50AAkAaAIAGAUFTVVMVDgDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiBleGFjdCAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAMJAQIhPQIIBQFpBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyCQACAQIiZGFwcCB0byBkYXBwIGNhbGxzIGFyZSBub3QgYWxsb3dlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAECnBtdEFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIIBQNwbXQHYXNzZXRJZAUHV0FWRVNJRAQGZmVlQW10CAUBaQNmZWUECmZlZUFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIIBQFpCmZlZUFzc2V0SWQFB1dBVkVTSUQECmNhbGxSZXdhcmQJAGgCBQZmZWVBbXQAAwQIbWluZWRBbXQJAGUCCAUDcG10BmFtb3VudAUKY2FsbFJld2FyZAMJAQIhPQIFCnBtdEFzc2V0SWQFB1dBVkVTSUQJAAIBAiFvbmx5IFdhdmVzIGNhbiBiZSB1c2VkIGluIHBheW1lbnQDCQECIT0CBQpmZWVBc3NldElkBQdXQVZFU0lECQACAQIeb25seSBXYXZlcyBjYW4gYmUgdXNlZCBpbiBmZWVzAwkBAiE9AgUGZmVlQW10CQBpAgkAaAIABQUFTVVMVDgA6AcJAAIBAiBmZWUgYW1vdW50IGNvdWxkbid0IGV4Y2VlZCAwLjAwNQQMbWluZXJBZGRyZXNzCAUBaQZjYWxsZXIEDHByb3RvY29sUGFydAkBDGdldEludE9yRmFpbAEJARFrZXlQcm90b2NvbFBhcnRYNgAED2JlbmVmaWNpYXJ5UGFydAkBDGdldEludE9yRmFpbAEJARNrZXlCZW5pZmljYXJ5UGFydFg2AAQOYmVuZWZpY2lhcnlBbXQJAGsDBQhtaW5lZEFtdAUPYmVuZWZpY2lhcnlQYXJ0BQVNVUxUNgQLcHJvdG9jb2xBbXQJAGUCBQhtaW5lZEFtdAUOYmVuZWZpY2lhcnlBbXQEDHByb3RvY29sQW10MQAABAxwcm90b2NvbEFtdDIJAGUCBQtwcm90b2NvbEFtdAUMcHJvdG9jb2xBbXQxBAJhcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAgJhcwIABANhc2EJALwJAgUCYXMCASwDCQAAAgkAkAMBBQNhc2EABQkAzAgCCQELTGVhc2VDYW5jZWwBCQDZBAEJAJEDAgUDYXNhAAAJAMwIAgkBC0xlYXNlQ2FuY2VsAQkA2QQBCQCRAwIFA2FzYQABCQDMCAIJAQtMZWFzZUNhbmNlbAEJANkEAQkAkQMCBQNhc2EAAgkAzAgCCQELTGVhc2VDYW5jZWwBCQDZBAEJAJEDAgUDYXNhAAMJAMwIAgkBC0xlYXNlQ2FuY2VsAQkA2QQBCQCRAwIFA2FzYQAEBQNuaWwFA25pbAFpAQVjbGFpbQEGbkxpc3RTBAVuSWR4cwkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHBQNuaWwEBW5MaXN0CQC1CQIFBm5MaXN0UwUDU0VQBA1leHBlY3RlZENvdW50CQCQAwEFBW5JZHhzAwkBAiE9AggFAWkGY2FsbGVyBRBuZXV0cmlub0NvbnRyYWN0CQACAQIpdmFsaWRhdGVBbmRBcHByb3ZlTGVhc2luZ3Mgbm90IGF1dGhvcml6ZWQDCQECIT0CCQBqAgkAkAMBBQVuTGlzdAACAAEJAAIBAiNPbmx5IG9kZCBudW1iZXIgb2Ygbm9kZXMgaXMgYWxsb3dlZAoBF2ZvckVhY2hOb2RlQ2hhbmdlU3RhdHVzAgNhY2MBaQQIbm9kZUFkZHIJAJEDAgUFbkxpc3QFAWkEC25vZGVEYXRhU3RyCQEdcmVhZE5vZGVEYXRhQW5kVmFsaWRhdGVTdGF0dXMCBQhub2RlQWRkcgIHUEVORElORwkAzQgCBQNhY2MJAQtTdHJpbmdFbnRyeQIJAQ9rZXlOb2RlUmVnaXN0cnkBBQhub2RlQWRkcgkBGWZvcm1hdERlcG9zaXRDaGFuZ2VTdGF0dXMCBQtub2RlRGF0YVN0cgIIQVBQUk9WRUQJAMwIAgkBC1N0cmluZ0VudHJ5AgICYXMFBm5MaXN0UwUDbmlsAWkBE3JlcGxhY2VBcHByb3ZlZE5vZGUEDm9sZE5vZGVBZGRyU3RyDm5ld05vZGVBZGRyU3RyCGdyb3VwTnVtDXBlbmFsdHlBbW91bnQDCQECIT0CCAUBaQZjYWxsZXIFEG5ldXRyaW5vQ29udHJhY3QJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQECm9sZERhdGFTdHIJAR1yZWFkTm9kZURhdGFBbmRWYWxpZGF0ZVN0YXR1cwIFDm9sZE5vZGVBZGRyU3RyAghBUFBST1ZFRAQKbmV3RGF0YVN0cgkBHXJlYWROb2RlRGF0YUFuZFZhbGlkYXRlU3RhdHVzAgUObmV3Tm9kZUFkZHJTdHICB1BFTkRJTkcEEWFwcHJvdmVkTm9kZUxpc3RTCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBE2tleUFwcHJvdmVkTm9kZUxpc3QAAwkBASEBCQEIY29udGFpbnMCBRFhcHByb3ZlZE5vZGVMaXN0UwUOb2xkTm9kZUFkZHJTdHIJAAIBCQCsAgICImFwcHJvdmVkTm9kZUxpc3QgZG9lcyBub3QgY29udGFpbiAFDm9sZE5vZGVBZGRyU3RyBBB1cGRhdGVkTm9kZUxpc3RTCQC5CQIJALUJAgURYXBwcm92ZWROb2RlTGlzdFMFDm9sZE5vZGVBZGRyU3RyBQ5uZXdOb2RlQWRkclN0cgQLb2xkTm9kZUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDm9sZE5vZGVBZGRyU3RyBBJiZW5lZmljaWFyeUFkZHJlc3MJARRyZXNvbHZlQmVuZWZpY2lhcmllcwIFC29sZE5vZGVBZGRyBQtvbGROb2RlQWRkcgQKZGVwb0Ftb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgUKb2xkRGF0YVN0cgUDU0VQBQ5uUmVnSWR4RGVwb0FtdAQHYWN0aW9ucwkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5QXBwcm92ZWROb2RlTGlzdAAFEHVwZGF0ZWROb2RlTGlzdFMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBD2tleU5vZGVSZWdpc3RyeQEFDm9sZE5vZGVBZGRyU3RyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlOb2RlUmVnaXN0cnkBBQ5uZXdOb2RlQWRkclN0cgkBGWZvcm1hdERlcG9zaXRDaGFuZ2VTdGF0dXMCBQpuZXdEYXRhU3RyAghBUFBST1ZFRAUDbmlsCQCUCgIDCQBmAgUKZGVwb0Ftb3VudAUNcGVuYWx0eUFtb3VudAUHYWN0aW9ucwUHYWN0aW9ucwUEdW5pdAFpAQ1yZXR1cm5EZXBvc2l0AQ5ub2RlQWRkcmVzc1N0cgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECE05vIHBheW1lbnRzIGFsbG93ZWQEDWNhbGxlckFkZHJlc3MIBQFpBmNhbGxlcgQLbm9kZUFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDm5vZGVBZGRyZXNzU3RyBBBhcHByb3ZlZE5vZGVMaXN0CQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBE2tleUFwcHJvdmVkTm9kZUxpc3QAAwkBAiE9AggFAWkGY2FsbGVyBRBuZXV0cmlub0NvbnRyYWN0CQACAQIgcmV0dXJuRGVwb3NpdCBwZXJtaXNzaW9ucyBkZW5pZWQED25vZGVSZWdpc3RyeUtFWQkBD2tleU5vZGVSZWdpc3RyeQEFDm5vZGVBZGRyZXNzU3RyBAtub2RlRGF0YU9wdAkAnQgCBQR0aGlzBQ9ub2RlUmVnaXN0cnlLRVkDCQEBIQEJAQlpc0RlZmluZWQBBQtub2RlRGF0YU9wdAkAAgEJAKwCAgIpQWRkcmVzcyBpcyBub3QgYXBwbGllZCBhcyBuZXV0cmlubyBub2RlOiAFDm5vZGVBZGRyZXNzU3RyAwkBCGNvbnRhaW5zAgUQYXBwcm92ZWROb2RlTGlzdAUObm9kZUFkZHJlc3NTdHIJAAIBAkxJbXBvc3NpYmxlIHRvIHJldHVybiBkZXBvc2l0IGZyb20gYXBwcm92ZWQgTm9kZSwgcGxlYXNlIGNvbnRhY3Qgc3VwcG9ydCB0ZWFtBAhub2RlRGF0YQkAtQkCCQEFdmFsdWUBBQtub2RlRGF0YU9wdAUDU0VQBAZzdGF0dXMDCQBnAgkAkAMBBQhub2RlRGF0YQAJCQCRAwIFCG5vZGVEYXRhBQ1uUmVnSWR4U3RhdHVzAgdQRU5ESU5HAwkBAiE9AgUGc3RhdHVzAgdQRU5ESU5HCQACAQIiQXBwbGljYXRpb24gc3RhdHVzIGlzIG5vdCBQRU5ESU5HIQQKZGVwb0Ftb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCG5vZGVEYXRhBQ5uUmVnSWR4RGVwb0FtdAQSYmVuZWZpY2lhcnlBZGRyZXNzCQEUcmVzb2x2ZUJlbmVmaWNpYXJpZXMCBQtub2RlQWRkcmVzcwULbm9kZUFkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQUPbm9kZVJlZ2lzdHJ5S0VZBQNuaWwAQrhmzw==", "height": 3378698, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 35edR9wX5QxCcU22SjHBWREPhRXTsCYooUman1c1KJs5 Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEP = "__"
5+
6+let MULT6 = 1000000
7+
8+let MULT8 = 100000000
9+
10+let WAVESIDSTR = "WAVES"
11+
12+let WAVESID = fromBase58String(WAVESIDSTR)
13+
14+func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
15+
16+
17+func getStrOrElse (address,key,defaultVal) = valueOrElse(getString(address, key), defaultVal)
18+
19+
20+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("Mandatory this." + key) + " is not defined"))
21+
22+
23+func getAddressOrFail (key) = valueOrErrorMessage(addressFromString(getStringOrFail(this, key)), (("Fail to convert this." + key) + " value into Address"))
24+
25+
26+func asSwopfiResultSTRUCT (v) = match v {
27+ case struct: (Int, ByteVector) =>
28+ struct
29+ case _ =>
30+ throw("fail to cast into Tuple5 ints")
31+}
32+
33+
34+func asInt (v) = match v {
35+ case i: Int =>
36+ i
37+ case _ =>
38+ throw("fail to cast into Int")
39+}
40+
41+
42+func validateAddressOrFail (addressStr) = {
43+ let address = valueOrErrorMessage(addressFromString(addressStr), ("fail to convert into address " + addressStr))
44+ if ((0 > wavesBalance(address).available))
45+ then throw()
46+ else addressStr
47+ }
48+
49+
50+func keyNodeRegistry (address) = ("%s__" + address)
51+
52+
53+func keyNodeRewardsTotals (address) = ("%s%s__totals__" + address)
54+
55+
56+func keyApprovedNodeList () = "%s__approvedNodeList"
57+
58+
59+func keyDepositAmount () = "%s%s__cfg__depositAmount"
60+
61+
62+func keyNeutrinoAddressStr () = "%s%s__cfg__neutrinoAddress"
63+
64+
65+func keyMasterNodeAddressStr () = "%s%s__cfg__mainNeutrinoNodeAddress"
66+
67+
68+func keyProtocolPartX6 () = "%s%s__cfg__protocolPartX6"
69+
70+
71+func keyBenificaryPartX6 () = "%s%s__cfg__benificaryPartX6"
72+
73+
74+func keyMinDistributeAmount () = "%s%s__cfg__minDistributeAmount"
75+
76+
77+func keySwopfiUsdtUsdnPoolAddress () = "%s%s__cfg__swopfiUsdtUsdnPoolAddress"
78+
79+
80+func keySavingsAddress () = "%s%s__cfg__savingsAddress"
81+
82+
83+func keyBeneficiaryAddress () = "%s%s__cfg__beneficiaryAddress"
84+
85+
86+let IdxControlCfgNeutrinoDapp = 1
87+
88+let IdxControlCfgAuctionDapp = 2
89+
90+let IdxControlCfgRpdDapp = 3
91+
92+let IdxControlCfgMathDapp = 4
93+
94+let IdxControlCfgLiquidationDapp = 5
95+
96+let IdxControlCfgRestDapp = 6
97+
98+let IdxControlCfgNodeRegistryDapp = 7
99+
100+let IdxControlCfgNsbtStakingDapp = 8
101+
102+let IdxControlCfgMediatorDapp = 9
103+
104+let IdxControlCfgSurfStakingDapp = 10
105+
106+let IdxControlCfgGnsbtControllerDapp = 11
107+
108+let IdxControlCfgRestV2Dapp = 12
109+
110+let IdxControlCfgGovernanceDapp = 13
111+
112+func keyControlAddress () = "%s%s__config__controlAddress"
113+
114+
115+func keyControlCfg () = "%s__controlConfig"
116+
117+
118+func keyUsdnAssetId () = "neutrino_asset_id"
119+
120+
121+func readControlCfgOrFail (control) = split_4C(getStringOrFail(control, keyControlCfg()), SEP)
122+
123+
124+func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
125+
126+
127+let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP"))
128+
129+let controlCfg = readControlCfgOrFail(controlContract)
130+
131+let neutrinoContractStr = "3P554VpgYDS3tWx2rygVuUDo94gwpKjNqau"
132+
133+let neutrinoContract = addressFromStringValue(neutrinoContractStr)
134+
135+let usdnAssetIdStr = getStrOrElse(neutrinoContract, keyUsdnAssetId(), "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p")
136+
137+let usdnAssetId = fromBase58String(usdnAssetIdStr)
138+
139+let nRegIdxTxAdd = 1
140+
141+let nRegIdxHeightAdd = 2
142+
143+let nRegIdxTimeAdd = 3
144+
145+let nRegIdxDepoAmt = 4
146+
147+let nRegIdxDepoAmtLeft = 5
148+
149+let nRegIdxStatus = 6
150+
151+let nRegIdxStatusChangeHeight = 7
152+
153+let nRegIdxStatusChangeTime = 8
154+
155+func formatDepositAdd (txIdStr,depositAmount,remainingDepositAmount,status) = makeString(["%s%d%d%d%d%s%d%d", txIdStr, toString(lastBlock.height), toString(lastBlock.timestamp), toString(depositAmount), toString(remainingDepositAmount), status, "0", "0"], SEP)
156+
157+
158+func formatDepositChangeStatus (origS,newStatus) = {
159+ let orig = split(origS, SEP)
160+ makeString(["%s%d%d%d%d%s%d%d", orig[nRegIdxTxAdd], orig[nRegIdxHeightAdd], orig[nRegIdxTimeAdd], orig[nRegIdxDepoAmt], orig[nRegIdxDepoAmtLeft], newStatus, toString(lastBlock.height), toString(lastBlock.timestamp)], SEP)
161+ }
162+
163+
164+func keyRewardHistory (nodeAddress,txId) = makeString(["%s%s%s", "history", toString(nodeAddress), toBase58String(txId)], SEP)
165+
166+
167+func dataRewardHistory (wavesAmountTotal,beneficiaryAmt,protocolAmt,protocolAmtPart1,protocolAmtPart2) = makeString(["%d%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(wavesAmountTotal), toString(beneficiaryAmt), toString(protocolAmt), toString(protocolAmtPart1), toString(protocolAmtPart2)], SEP)
168+
169+
170+func RewardHistoryEntry (nodeAddress,txId,minedAmt,beneficiaryAmt,protocolAmt,protocolAmt1,protocolAmt2) = StringEntry(keyRewardHistory(nodeAddress, txId), dataRewardHistory(minedAmt, beneficiaryAmt, protocolAmt, protocolAmt1, protocolAmt2))
171+
172+
173+func dataRewardTotals (minedAmt,beneficiaryAmt,protocolAmt,protocolAmtPart1,protocolAmtPart2) = makeString(["%d%d%d%d%d", toString(minedAmt), toString(beneficiaryAmt), toString(protocolAmt), toString(protocolAmtPart1), toString(protocolAmtPart2)], SEP)
174+
175+
176+func RewardTotalsEntry (miner,minedAmt,beneficiaryAmt,protocolAmt,protocolAmtPart1,protocolAmtPart2) = {
177+ let nodeRewardsTotalsKEY = keyNodeRewardsTotals(toString(miner))
178+ let nodeRewardsArray = split(getStrOrElse(this, nodeRewardsTotalsKEY, dataRewardTotals(0, 0, 0, 0, 0)), SEP)
179+ let newMinedAmt = (parseIntValue(nodeRewardsArray[1]) + minedAmt)
180+ let newBeneficiaryAmt = (parseIntValue(nodeRewardsArray[2]) + beneficiaryAmt)
181+ let newProtocolAmt = (parseIntValue(nodeRewardsArray[3]) + protocolAmt)
182+ let newProtocolAmtPart1 = (parseIntValue(nodeRewardsArray[4]) + protocolAmtPart1)
183+ let newProtocolAmtPart2 = (parseIntValue(nodeRewardsArray[5]) + protocolAmtPart2)
184+ StringEntry(nodeRewardsTotalsKEY, dataRewardTotals(newMinedAmt, newBeneficiaryAmt, newProtocolAmt, newProtocolAmtPart1, newProtocolAmtPart2))
185+ }
186+
187+
188+func resolveBeneficiaries (minerAddress,beneficiaryFromParam) = {
189+ let minerScriptHash = scriptHash(minerAddress)
190+ let beneficiaryFromMinerState = addressFromStringValue(getStringOrFail(minerAddress, keyBeneficiaryAddress()))
191+ if ((minerScriptHash == unit))
192+ then beneficiaryFromParam
193+ else beneficiaryFromMinerState
194+ }
195+
196+
197+func readNodeDataAndValidateStatus (nodeAddr,expectedStatus) = {
198+ let nodeDataOpt = getString(keyNodeRegistry(nodeAddr))
199+ if (!(isDefined(nodeDataOpt)))
200+ then throw(("Unknown Node " + nodeAddr))
201+ else {
202+ let nodeDataStr = value(nodeDataOpt)
203+ let nodeData = split(nodeDataStr, SEP)
204+ let nodeStatus = if ((size(nodeData) >= 9))
205+ then nodeData[nRegIdxStatus]
206+ else "PENDING"
207+ if ((nodeStatus != expectedStatus))
208+ then throw(((((("Node " + nodeAddr) + " status should be ") + expectedStatus) + ", but actually ") + nodeStatus))
209+ else nodeDataStr
210+ }
211+ }
212+
213+
214+@Callable(i)
215+func distributeMinerReward (beneficiaryAddressStr) = {
216+ let minDistributeAmount = valueOrElse(getInteger(this, keyMinDistributeAmount()), (24 * MULT8))
217+ if ((size(i.payments) != 1))
218+ then throw("exact 1 payment must be attached")
219+ else if ((i.caller != i.originCaller))
220+ then throw("dapp to dapp calls are not allowed")
221+ else {
222+ let pmt = i.payments[0]
223+ let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
224+ let feeAmt = i.fee
225+ let feeAssetId = valueOrElse(i.feeAssetId, WAVESID)
226+ let callReward = (feeAmt * 3)
227+ let minedAmt = (pmt.amount - callReward)
228+ if ((pmtAssetId != WAVESID))
229+ then throw("only Waves can be used in payment")
230+ else if ((feeAssetId != WAVESID))
231+ then throw("only Waves can be used in fees")
232+ else if ((feeAmt != ((5 * MULT8) / 1000)))
233+ then throw("fee amount couldn't exceed 0.005")
234+ else {
235+ let minerAddress = i.caller
236+ let protocolPart = getIntOrFail(keyProtocolPartX6())
237+ let beneficiaryPart = getIntOrFail(keyBenificaryPartX6())
238+ let beneficiaryAmt = fraction(minedAmt, beneficiaryPart, MULT6)
239+ let protocolAmt = (minedAmt - beneficiaryAmt)
240+ let protocolAmt1 = 0
241+ let protocolAmt2 = (protocolAmt - protocolAmt1)
242+ let as = valueOrElse(getString(this, "as"), "")
243+ let asa = split_4C(as, ",")
244+ if ((size(asa) == 5))
245+ then [LeaseCancel(fromBase58String(asa[0])), LeaseCancel(fromBase58String(asa[1])), LeaseCancel(fromBase58String(asa[2])), LeaseCancel(fromBase58String(asa[3])), LeaseCancel(fromBase58String(asa[4]))]
246+ else nil
247+ }
248+ }
249+ }
250+
251+
252+
253+@Callable(i)
254+func claim (nListS) = {
255+ let nIdxs = [0, 1, 2, 3, 4, 5, 6, 7]
256+ let nList = split(nListS, SEP)
257+ let expectedCount = size(nIdxs)
258+ if ((i.caller != neutrinoContract))
259+ then throw("validateAndApproveLeasings not authorized")
260+ else if (((size(nList) % 2) != 1))
261+ then throw("Only odd number of nodes is allowed")
262+ else {
263+ func forEachNodeChangeStatus (acc,i) = {
264+ let nodeAddr = nList[i]
265+ let nodeDataStr = readNodeDataAndValidateStatus(nodeAddr, "PENDING")
266+ (acc :+ StringEntry(keyNodeRegistry(nodeAddr), formatDepositChangeStatus(nodeDataStr, "APPROVED")))
267+ }
268+
269+[StringEntry("as", nListS)]
270+ }
271+ }
272+
273+
274+
275+@Callable(i)
276+func replaceApprovedNode (oldNodeAddrStr,newNodeAddrStr,groupNum,penaltyAmount) = if ((i.caller != neutrinoContract))
277+ then throw("permissions denied")
278+ else {
279+ let oldDataStr = readNodeDataAndValidateStatus(oldNodeAddrStr, "APPROVED")
280+ let newDataStr = readNodeDataAndValidateStatus(newNodeAddrStr, "PENDING")
281+ let approvedNodeListS = getStringOrFail(this, keyApprovedNodeList())
282+ if (!(contains(approvedNodeListS, oldNodeAddrStr)))
283+ then throw(("approvedNodeList does not contain " + oldNodeAddrStr))
284+ else {
285+ let updatedNodeListS = makeString(split(approvedNodeListS, oldNodeAddrStr), newNodeAddrStr)
286+ let oldNodeAddr = addressFromStringValue(oldNodeAddrStr)
287+ let beneficiaryAddress = resolveBeneficiaries(oldNodeAddr, oldNodeAddr)
288+ let depoAmount = parseIntValue(split(oldDataStr, SEP)[nRegIdxDepoAmt])
289+ let actions = [StringEntry(keyApprovedNodeList(), updatedNodeListS), DeleteEntry(keyNodeRegistry(oldNodeAddrStr)), StringEntry(keyNodeRegistry(newNodeAddrStr), formatDepositChangeStatus(newDataStr, "APPROVED"))]
290+ $Tuple2(if ((depoAmount > penaltyAmount))
291+ then actions
292+ else actions, unit)
293+ }
294+ }
295+
296+
297+
298+@Callable(i)
299+func returnDeposit (nodeAddressStr) = if ((size(i.payments) != 0))
300+ then throw("No payments allowed")
301+ else {
302+ let callerAddress = i.caller
303+ let nodeAddress = addressFromStringValue(nodeAddressStr)
304+ let approvedNodeList = getStringOrFail(this, keyApprovedNodeList())
305+ if ((i.caller != neutrinoContract))
306+ then throw("returnDeposit permissions denied")
307+ else {
308+ let nodeRegistryKEY = keyNodeRegistry(nodeAddressStr)
309+ let nodeDataOpt = getString(this, nodeRegistryKEY)
310+ if (!(isDefined(nodeDataOpt)))
311+ then throw(("Address is not applied as neutrino node: " + nodeAddressStr))
312+ else if (contains(approvedNodeList, nodeAddressStr))
313+ then throw("Impossible to return deposit from approved Node, please contact support team")
314+ else {
315+ let nodeData = split(value(nodeDataOpt), SEP)
316+ let status = if ((size(nodeData) >= 9))
317+ then nodeData[nRegIdxStatus]
318+ else "PENDING"
319+ if ((status != "PENDING"))
320+ then throw("Application status is not PENDING!")
321+ else {
322+ let depoAmount = parseIntValue(nodeData[nRegIdxDepoAmt])
323+ let beneficiaryAddress = resolveBeneficiaries(nodeAddress, nodeAddress)
324+[DeleteEntry(nodeRegistryKEY)]
325+ }
326+ }
327+ }
328+ }
329+
330+

github/deemru/w8io/3ef1775 
27.63 ms