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:
Old | New | Differences | |
---|---|---|---|
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 ◑