tx · 854KK492bggS3QfkMQ1iQBGHCwMXyUTT3tiyPJtg14GG

3PANnmCGrufT8SZY5u6BZUgZq4QTh5XdPMa:  -0.01200000 Waves

2024.03.12 09:41 [4080302] smart account 3PANnmCGrufT8SZY5u6BZUgZq4QTh5XdPMa > SELF 0.00000000 Waves

{ "type": 13, "id": "854KK492bggS3QfkMQ1iQBGHCwMXyUTT3tiyPJtg14GG", "fee": 1200000, "feeAssetId": null, "timestamp": 1710225188873, "version": 2, "chainId": 87, "sender": "3PANnmCGrufT8SZY5u6BZUgZq4QTh5XdPMa", "senderPublicKey": "EfRKQWb1FWaWmo9fkorRwMA4BrSzUWNAVhXqB9vLmv7g", "proofs": [ "4viWGrxkjMon3aLngJSY4u1DyRwcYBgYMTxUbMYde4rbdDRRyfgg15oByrtwVpMzZX9PTkGLBesfzwN5hSVDbqRC" ], "script": "base64:BgIOCAISAwoBCBIAEgMKAQgsAAxjb250cmFjdEZpbGUCDmwybXBfc3dhcC5yaWRlAANTRVACAl9fAAZzY2FsZTgAgMLXLwEHd3JhcEVycgEDbXNnCQCsAgIJAKwCAgUMY29udHJhY3RGaWxlAgI6IAUDbXNnAQh0aHJvd0VycgEDbXNnCQACAQkBB3dyYXBFcnIBBQNtc2cADGtleUFzc2V0SW5JZAkAuQkCCQDMCAICAiVzCQDMCAICCWFzc2V0SW5JZAUDbmlsBQNTRVAADWtleUFzc2V0T3V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgphc3NldE91dElkBQNuaWwFA1NFUAAQa2V5QXNzZXRPdXRQcmljZQkAuQkCCQDMCAICAiVzCQDMCAICDWFzc2V0T3V0UHJpY2UFA25pbAUDU0VQABFrZXlTdGFraW5nQWRkcmVzcwkAuQkCCQDMCAICAiVzCQDMCAICDnN0YWtpbmdBZGRyZXNzBQNuaWwFA1NFUAAPa2V5U3RhdHNUb3RhbEluCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAgd0b3RhbEluBQNuaWwFA1NFUAAQa2V5U3RhdHNUb3RhbE91dAkAuQkCCQDMCAICBCVzJXMJAMwIAgIFc3RhdHMJAMwIAgIIdG90YWxPdXQFA25pbAUDU0VQABFrZXlBbGxvd2VkQWRkcmVzcwkAuQkCCQDMCAICAiVzCQDMCAICDmFsbG93ZWRBZGRyZXNzBQNuaWwFA1NFUAEYa2V5U3RhdHNUb3RhbEluQnlBZGRyZXNzAQdhZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICBXN0YXRzCQDMCAICB3RvdGFsSW4JAMwIAgkApQgBBQdhZGRyZXNzBQNuaWwFA1NFUAEZa2V5U3RhdHNUb3RhbE91dEJ5QWRkcmVzcwEHYWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgVzdGF0cwkAzAgCAgh0b3RhbE91dAkAzAgCCQClCAEFB2FkZHJlc3MFA25pbAUDU0VQAQprZXlIaXN0b3J5AgdhZGRyZXNzBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHaGlzdG9yeQkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgkA2AQBBQR0eElkBQNuaWwFA1NFUAENZm9ybWF0SGlzdG9yeQQIYW1vdW50SW4JYW1vdW50T3V0BXN0YWtlC3N0YWtpbmdOb2RlCQC5CQIJAMwIAgIIJWQlZCViJXMJAMwIAgkApAMBBQhhbW91bnRJbgkAzAgCCQCkAwEFCWFtb3VudE91dAkAzAgCCQClAwEFBXN0YWtlCQDMCAIFC3N0YWtpbmdOb2RlBQNuaWwFA1NFUAAJYXNzZXRJbklkCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrZXlBc3NldEluSWQJAQd3cmFwRXJyAQIRaW52YWxpZCBhc3NldEluSWQAC2Fzc2V0SW5JbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUJYXNzZXRJbklkCQEHd3JhcEVycgECE2ludmFsaWQgYXNzZXRJbkluZm8ACmFzc2V0T3V0SWQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFDWtleUFzc2V0T3V0SWQJAQd3cmFwRXJyAQIRaW52YWxpZCBhc3NldEluSWQADGFzc2V0T3V0SW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFCmFzc2V0T3V0SWQJAQd3cmFwRXJyAQIUaW52YWxpZCBhc3NldE91dEluZm8ADWFzc2V0T3V0UHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBRBrZXlBc3NldE91dFByaWNlCQEHd3JhcEVycgECFWludmFsaWQgYXNzZXRPdXRQcmljZQAUc3Rha2luZ0FkZHJlc3NPcHRpb24EByRtYXRjaDAJAJ0IAgUEdGhpcwURa2V5U3Rha2luZ0FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAA5zdGFraW5nQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRRzdGFraW5nQWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAhZpbnZhbGlkIHN0YWtpbmdBZGRyZXNzABRhbGxvd2VkQWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQR0aGlzBRFrZXlBbGxvd2VkQWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IADmFsbG93ZWRBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFGFsbG93ZWRBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECFmludmFsaWQgYWxsb3dlZEFkZHJlc3MBDmlzVmFsaWRBZGRyZXNzAQ1hZGRyZXNzU3RyaW5nBAckbWF0Y2gwCQCmCAEFDWFkZHJlc3NTdHJpbmcDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBdAUHJG1hdGNoMAYHAA9BRE1JTl9MSVNUX1NJWkUABQAGUVVPUlVNAAMAEVRYSURfQllURVNfTEVOR1RIACABGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAglhbGxvd1R4SWQJAMwIAgUEdHhJZAUDbmlsBQNTRVABEGtleUZ1bGxBZG1pblZvdGUCBnByZWZpeAxhZG1pbkFkZHJlc3MJALkJAgkAzAgCBQZwcmVmaXgJAMwIAgUMYWRtaW5BZGRyZXNzBQNuaWwFA1NFUAETa2V5QWRtaW5BZGRyZXNzTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhBhZG1pbkFkZHJlc3NMaXN0BQNuaWwFA1NFUAEOa2V5QWxsb3dlZFR4SWQACQC5CQIJAMwIAgICJXMJAMwIAgIEdHhJZAUDbmlsBQNTRVABDGdldEFkbWluVm90ZQIGcHJlZml4BWFkbWluBAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQ1nZXRBZG1pbnNMaXN0AAQHJG1hdGNoMAkAnQgCBQR0aGlzCQETa2V5QWRtaW5BZGRyZXNzTGlzdAADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMFA1NFUAUDbmlsAQ1pc0luQWRtaW5MaXN0AQdhZGRyZXNzCQEPY29udGFpbnNFbGVtZW50AgkBDWdldEFkbWluc0xpc3QABQdhZGRyZXNzARJnZW5Wb3Rlc0tleXNIZWxwZXICAWEMYWRtaW5BZGRyZXNzBAskdDAzNDg2MzUxMAUBYQQGcmVzdWx0CAULJHQwMzQ4NjM1MTACXzEEBnByZWZpeAgFCyR0MDM0ODYzNTEwAl8yCQCUCgIJAM0IAgUGcmVzdWx0CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUMYWRtaW5BZGRyZXNzBQZwcmVmaXgBDGdlblZvdGVzS2V5cwEJa2V5UHJlZml4BAlhZG1pbkxpc3QJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAQLJHQwMzY1NzM3NDEKAAIkbAkBDWdldEFkbWluc0xpc3QACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFCWtleVByZWZpeAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQESZ2VuVm90ZXNLZXlzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQGcmVzdWx0CAULJHQwMzY1NzM3NDECXzEEBnByZWZpeAgFCyR0MDM2NTczNzQxAl8yBQZyZXN1bHQBEGNvdW50Vm90ZXNIZWxwZXICBnJlc3VsdAd2b3RlS2V5CQBkAgUGcmVzdWx0CQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAEKY291bnRWb3RlcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY291bnRWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBEGNsZWFyVm90ZXNIZWxwZXICBnJlc3VsdANrZXkJAM0IAgUGcmVzdWx0CQELRGVsZXRlRW50cnkBBQNrZXkBE2dldENsZWFyVm90ZUVudHJpZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNsZWFyVm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAQx2b3RlSU5URVJOQUwEE2NhbGxlckFkZHJlc3NTdHJpbmcJa2V5UHJlZml4CG1pblZvdGVzCnZvdGVSZXN1bHQEB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBBBhZG1pbkN1cnJlbnRWb3RlCQEMZ2V0QWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBANlcnIDCQEBIQEJAQ1pc0luQWRtaW5MaXN0AQUTY2FsbGVyQWRkcmVzc1N0cmluZwkBCHRocm93RXJyAQkArAICCQCsAgICCUFkZHJlc3M6IAUTY2FsbGVyQWRkcmVzc1N0cmluZwISIG5vdCBpbiBBZG1pbiBsaXN0AwkAAAIFEGFkbWluQ3VycmVudFZvdGUAAQkBCHRocm93RXJyAQkArAICBQd2b3RlS2V5AhIgeW91IGFscmVhZHkgdm90ZWQFBHVuaXQDCQAAAgUDZXJyBQNlcnIEBXZvdGVzCQEKY291bnRWb3RlcwEFCWtleVByZWZpeAMJAGcCCQBkAgUFdm90ZXMAAQUIbWluVm90ZXMEEGNsZWFyVm90ZUVudHJpZXMJARNnZXRDbGVhclZvdGVFbnRyaWVzAQUJa2V5UHJlZml4CQDOCAIFEGNsZWFyVm90ZUVudHJpZXMFCnZvdGVSZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3ZvdGVLZXkAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ5nZXRTd2FwQWN0aW9ucwIBaQtzdGFraW5nTm9kZQQLdXNlckFkZHJlc3MIBQFpDG9yaWdpbkNhbGxlcgQHcGF5bWVudAkAkQMCCAUBaQhwYXltZW50cwAABA1hc3NldEluQW1vdW50CAUHcGF5bWVudAZhbW91bnQEDmFzc2V0T3V0QW1vdW50CQBrAwUNYXNzZXRJbkFtb3VudAUGc2NhbGU4BQ1hc3NldE91dFByaWNlBAZjaGVja3MJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhVpbnZhbGlkIHBheW1lbnRzIHNpemUJAMwIAgMJAAACCAUHcGF5bWVudAdhc3NldElkBQlhc3NldEluSWQGCQEIdGhyb3dFcnIBAhdpbnZhbGlkIHBheW1lbnQgYXNzZXRJZAkAzAgCAwkAZgIFDWFzc2V0T3V0UHJpY2UAAAYJAQh0aHJvd0VycgECFWludmFsaWQgYXNzZXRPdXRQcmljZQkAzAgCAwkAZgIFDmFzc2V0T3V0QW1vdW50AAAGCQEIdGhyb3dFcnIBAhZpbnZhbGlkIGFzc2V0T3V0QW1vdW50BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEC3N0YWtlSW52b2tlCQD8BwQFDnN0YWtpbmdBZGRyZXNzAg5sZWFzZUJ5QWRkcmVzcwkAzAgCBQtzdGFraW5nTm9kZQkAzAgCCQClCAEFC3VzZXJBZGRyZXNzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCmFzc2V0T3V0SWQFDmFzc2V0T3V0QW1vdW50BQNuaWwDCQAAAgULc3Rha2VJbnZva2UFC3N0YWtlSW52b2tlCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tleVN0YXRzVG90YWxJbgkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPa2V5U3RhdHNUb3RhbEluAAAFDWFzc2V0SW5BbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVN0YXRzVG90YWxPdXQJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEGtleVN0YXRzVG90YWxPdXQAAAUOYXNzZXRPdXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlTdGF0c1RvdGFsSW5CeUFkZHJlc3MBBQt1c2VyQWRkcmVzcwkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBGGtleVN0YXRzVG90YWxJbkJ5QWRkcmVzcwEFC3VzZXJBZGRyZXNzAAAFDWFzc2V0SW5BbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARlrZXlTdGF0c1RvdGFsT3V0QnlBZGRyZXNzAQULdXNlckFkZHJlc3MJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARlrZXlTdGF0c1RvdGFsT3V0QnlBZGRyZXNzAQULdXNlckFkZHJlc3MAAAUOYXNzZXRPdXRBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUhpc3RvcnkCBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAkBDWZvcm1hdEhpc3RvcnkEBQ1hc3NldEluQW1vdW50BQ5hc3NldE91dEFtb3VudAYFC3N0YWtpbmdOb2RlBQNuaWwFDmFzc2V0T3V0QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwFpAQxzd2FwQW5kU3Rha2UBC3N0YWtpbmdOb2RlBAVjaGVjawkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULc3Rha2luZ05vZGUGCQEIdGhyb3dFcnIBAiBzdGFraW5nIG5vZGUgYWRkcmVzcyBpcyBubyB2YWxpZAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkBDmdldFN3YXBBY3Rpb25zAgUBaQULc3Rha2luZ05vZGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0ABAtjaGVja0NhbGxlcgMJAAACCAUBaQZjYWxsZXIFDmFsbG93ZWRBZGRyZXNzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOYWxsb3dlZEFkZHJlc3MJAPAHAgUEdGhpcwUJYXNzZXRJbklkBQlhc3NldEluSWQFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt2b3RlRm9yVHhJZAEEdHhJZAQTY2FsbGVyQWRkcmVzc1N0cmluZwkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBAlrZXlQcmVmaXgJARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBQR0eElkBAZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUFsbG93ZWRUeElkAAUEdHhJZAUDbmlsBBFhbGxvd2VkVHhJZE9wdGlvbgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQABANlcnIJAMwIAgMJAAACCQDIAQEJANkEAQUEdHhJZAURVFhJRF9CWVRFU19MRU5HVEgGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEiBpcyBub3QgdmFsaWQgdHhJZAkAzAgCAwMJAAACBRFhbGxvd2VkVHhJZE9wdGlvbgUEdW5pdAYJAQIhPQIJAQV2YWx1ZQEFEWFsbG93ZWRUeElkT3B0aW9uBQR0eElkBgkBCHRocm93RXJyAQkArAICBQR0eElkAhMgaXMgYWxyZWFkeSBhbGxvd2VkBQNuaWwDCQAAAgUDZXJyBQNlcnIJAQx2b3RlSU5URVJOQUwEBRNjYWxsZXJBZGRyZXNzU3RyaW5nBQlrZXlQcmVmaXgFBlFVT1JVTQUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQIYnlBZG1pbnMJAAACCAUCdHgCaWQJANkEAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQAAgAEB2J5T3duZXIDCQBnAgkAkAMBCQENZ2V0QWRtaW5zTGlzdAAFBlFVT1JVTQcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkDBQhieUFkbWlucwYFB2J5T3duZXIAtlx+", "height": 4080302, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AWZ1s9C91zXx6iUqgtuPL2iKUyM4HeRG6emYFdc1hQnq Next: none Diff:
OldNewDifferences
211211 let payment = i.payments[0]
212212 let assetInAmount = payment.amount
213213 let assetOutAmount = fraction(assetInAmount, scale8, assetOutPrice)
214- let stake = if (isValidAddress(stakingNode))
215- then true
216- else false
217214 let checks = [if ((size(i.payments) == 1))
218215 then true
219216 else throwErr("invalid payments size"), if ((payment.assetId == assetInId))
225222 else throwErr("invalid assetOutAmount")]
226223 if ((checks == checks))
227224 then {
228- let stakeAction = if (!(stake))
229- then [ScriptTransfer(userAddress, assetOutAmount, assetOutId)]
230- else {
231- let stakeInvoke = invoke(stakingAddress, "leaseByAddress", [stakingNode, toString(userAddress)], [AttachedPayment(assetOutId, assetOutAmount)])
232- if ((stakeInvoke == stakeInvoke))
233- then nil
234- else throw("Strict value is not equal to itself.")
235- }
236- $Tuple2(([IntegerEntry(keyStatsTotalIn, (valueOrElse(getInteger(this, keyStatsTotalIn), 0) + assetInAmount)), IntegerEntry(keyStatsTotalOut, (valueOrElse(getInteger(this, keyStatsTotalOut), 0) + assetOutAmount)), IntegerEntry(keyStatsTotalInByAddress(userAddress), (valueOrElse(getInteger(this, keyStatsTotalInByAddress(userAddress)), 0) + assetInAmount)), IntegerEntry(keyStatsTotalOutByAddress(userAddress), (valueOrElse(getInteger(this, keyStatsTotalOutByAddress(userAddress)), 0) + assetOutAmount)), StringEntry(keyHistory(userAddress, i.transactionId), formatHistory(assetInAmount, assetOutAmount, stake, stakingNode))] ++ stakeAction), assetOutAmount)
225+ let stakeInvoke = invoke(stakingAddress, "leaseByAddress", [stakingNode, toString(userAddress)], [AttachedPayment(assetOutId, assetOutAmount)])
226+ if ((stakeInvoke == stakeInvoke))
227+ then $Tuple2([IntegerEntry(keyStatsTotalIn, (valueOrElse(getInteger(this, keyStatsTotalIn), 0) + assetInAmount)), IntegerEntry(keyStatsTotalOut, (valueOrElse(getInteger(this, keyStatsTotalOut), 0) + assetOutAmount)), IntegerEntry(keyStatsTotalInByAddress(userAddress), (valueOrElse(getInteger(this, keyStatsTotalInByAddress(userAddress)), 0) + assetInAmount)), IntegerEntry(keyStatsTotalOutByAddress(userAddress), (valueOrElse(getInteger(this, keyStatsTotalOutByAddress(userAddress)), 0) + assetOutAmount)), StringEntry(keyHistory(userAddress, i.transactionId), formatHistory(assetInAmount, assetOutAmount, true, stakingNode))], assetOutAmount)
228+ else throw("Strict value is not equal to itself.")
237229 }
238230 else throw("Strict value is not equal to itself.")
239231 }
240232
241233
242234 @Callable(i)
243-func swap () = getSwapActions(i, "NULL")
244-
245-
246-
247-@Callable(i)
248235 func swapAndStake (stakingNode) = {
249- let check = [if (if (isValidAddress(stakingNode))
250- then true
251- else (stakingNode == ""))
236+ let check = [if (isValidAddress(stakingNode))
252237 then true
253238 else throwErr("staking node address is no valid")]
254239 if ((check == check))
255- then {
256- let node = if ((stakingNode == ""))
257- then "NULL"
258- else stakingNode
259- getSwapActions(i, node)
260- }
240+ then getSwapActions(i, stakingNode)
261241 else throw("Strict value is not equal to itself.")
262242 }
263243
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFile = "l2mp_swap.ride"
55
66 let SEP = "__"
77
88 let scale8 = 100000000
99
1010 func wrapErr (msg) = ((contractFile + ": ") + msg)
1111
1212
1313 func throwErr (msg) = throw(wrapErr(msg))
1414
1515
1616 let keyAssetInId = makeString(["%s", "assetInId"], SEP)
1717
1818 let keyAssetOutId = makeString(["%s", "assetOutId"], SEP)
1919
2020 let keyAssetOutPrice = makeString(["%s", "assetOutPrice"], SEP)
2121
2222 let keyStakingAddress = makeString(["%s", "stakingAddress"], SEP)
2323
2424 let keyStatsTotalIn = makeString(["%s%s", "stats", "totalIn"], SEP)
2525
2626 let keyStatsTotalOut = makeString(["%s%s", "stats", "totalOut"], SEP)
2727
2828 let keyAllowedAddress = makeString(["%s", "allowedAddress"], SEP)
2929
3030 func keyStatsTotalInByAddress (address) = makeString(["%s%s%s", "stats", "totalIn", toString(address)], SEP)
3131
3232
3333 func keyStatsTotalOutByAddress (address) = makeString(["%s%s%s", "stats", "totalOut", toString(address)], SEP)
3434
3535
3636 func keyHistory (address,txId) = makeString(["%s%s%s", "history", toString(address), toBase58String(txId)], SEP)
3737
3838
3939 func formatHistory (amountIn,amountOut,stake,stakingNode) = makeString(["%d%d%b%s", toString(amountIn), toString(amountOut), toString(stake), stakingNode], SEP)
4040
4141
4242 let assetInId = fromBase58String(valueOrErrorMessage(getString(this, keyAssetInId), wrapErr("invalid assetInId")))
4343
4444 let assetInInfo = valueOrErrorMessage(assetInfo(assetInId), wrapErr("invalid assetInInfo"))
4545
4646 let assetOutId = fromBase58String(valueOrErrorMessage(getString(this, keyAssetOutId), wrapErr("invalid assetInId")))
4747
4848 let assetOutInfo = valueOrErrorMessage(assetInfo(assetOutId), wrapErr("invalid assetOutInfo"))
4949
5050 let assetOutPrice = valueOrErrorMessage(getInteger(this, keyAssetOutPrice), wrapErr("invalid assetOutPrice"))
5151
5252 let stakingAddressOption = match getString(this, keyStakingAddress) {
5353 case s: String =>
5454 addressFromString(s)
5555 case _: Unit =>
5656 unit
5757 case _ =>
5858 throw("Match error")
5959 }
6060
6161 let stakingAddress = valueOrErrorMessage(stakingAddressOption, wrapErr("invalid stakingAddress"))
6262
6363 let allowedAddressOption = match getString(this, keyAllowedAddress) {
6464 case s: String =>
6565 addressFromString(s)
6666 case _: Unit =>
6767 unit
6868 case _ =>
6969 throw("Match error")
7070 }
7171
7272 let allowedAddress = valueOrErrorMessage(allowedAddressOption, wrapErr("invalid allowedAddress"))
7373
7474 func isValidAddress (addressString) = match addressFromString(addressString) {
7575 case t: Address =>
7676 true
7777 case _ =>
7878 false
7979 }
8080
8181
8282 let ADMIN_LIST_SIZE = 5
8383
8484 let QUORUM = 3
8585
8686 let TXID_BYTES_LENGTH = 32
8787
8888 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
8989
9090
9191 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
9292
9393
9494 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
9595
9696
9797 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
9898
9999
100100 func getAdminVote (prefix,admin) = {
101101 let voteKey = keyFullAdminVote(prefix, admin)
102102 valueOrElse(getInteger(voteKey), 0)
103103 }
104104
105105
106106 func getAdminsList () = match getString(this, keyAdminAddressList()) {
107107 case s: String =>
108108 split(s, SEP)
109109 case _ =>
110110 nil
111111 }
112112
113113
114114 func isInAdminList (address) = containsElement(getAdminsList(), address)
115115
116116
117117 func genVotesKeysHelper (a,adminAddress) = {
118118 let $t034863510 = a
119119 let result = $t034863510._1
120120 let prefix = $t034863510._2
121121 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
122122 }
123123
124124
125125 func genVotesKeys (keyPrefix) = {
126126 let adminList = keyAdminAddressList()
127127 let $t036573741 = {
128128 let $l = getAdminsList()
129129 let $s = size($l)
130130 let $acc0 = $Tuple2(nil, keyPrefix)
131131 func $f0_1 ($a,$i) = if (($i >= $s))
132132 then $a
133133 else genVotesKeysHelper($a, $l[$i])
134134
135135 func $f0_2 ($a,$i) = if (($i >= $s))
136136 then $a
137137 else throw("List size exceeds 5")
138138
139139 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
140140 }
141141 let result = $t036573741._1
142142 let prefix = $t036573741._2
143143 result
144144 }
145145
146146
147147 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
148148
149149
150150 func countVotes (prefix) = {
151151 let votes = genVotesKeys(prefix)
152152 let $l = votes
153153 let $s = size($l)
154154 let $acc0 = 0
155155 func $f0_1 ($a,$i) = if (($i >= $s))
156156 then $a
157157 else countVotesHelper($a, $l[$i])
158158
159159 func $f0_2 ($a,$i) = if (($i >= $s))
160160 then $a
161161 else throw("List size exceeds 5")
162162
163163 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
164164 }
165165
166166
167167 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
168168
169169
170170 func getClearVoteEntries (prefix) = {
171171 let votes = genVotesKeys(prefix)
172172 let $l = votes
173173 let $s = size($l)
174174 let $acc0 = nil
175175 func $f0_1 ($a,$i) = if (($i >= $s))
176176 then $a
177177 else clearVotesHelper($a, $l[$i])
178178
179179 func $f0_2 ($a,$i) = if (($i >= $s))
180180 then $a
181181 else throw("List size exceeds 5")
182182
183183 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
184184 }
185185
186186
187187 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
188188 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
189189 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
190190 let err = if (!(isInAdminList(callerAddressString)))
191191 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
192192 else if ((adminCurrentVote == 1))
193193 then throwErr((voteKey + " you already voted"))
194194 else unit
195195 if ((err == err))
196196 then {
197197 let votes = countVotes(keyPrefix)
198198 if (((votes + 1) >= minVotes))
199199 then {
200200 let clearVoteEntries = getClearVoteEntries(keyPrefix)
201201 (clearVoteEntries ++ voteResult)
202202 }
203203 else [IntegerEntry(voteKey, 1)]
204204 }
205205 else throw("Strict value is not equal to itself.")
206206 }
207207
208208
209209 func getSwapActions (i,stakingNode) = {
210210 let userAddress = i.originCaller
211211 let payment = i.payments[0]
212212 let assetInAmount = payment.amount
213213 let assetOutAmount = fraction(assetInAmount, scale8, assetOutPrice)
214- let stake = if (isValidAddress(stakingNode))
215- then true
216- else false
217214 let checks = [if ((size(i.payments) == 1))
218215 then true
219216 else throwErr("invalid payments size"), if ((payment.assetId == assetInId))
220217 then true
221218 else throwErr("invalid payment assetId"), if ((assetOutPrice > 0))
222219 then true
223220 else throwErr("invalid assetOutPrice"), if ((assetOutAmount > 0))
224221 then true
225222 else throwErr("invalid assetOutAmount")]
226223 if ((checks == checks))
227224 then {
228- let stakeAction = if (!(stake))
229- then [ScriptTransfer(userAddress, assetOutAmount, assetOutId)]
230- else {
231- let stakeInvoke = invoke(stakingAddress, "leaseByAddress", [stakingNode, toString(userAddress)], [AttachedPayment(assetOutId, assetOutAmount)])
232- if ((stakeInvoke == stakeInvoke))
233- then nil
234- else throw("Strict value is not equal to itself.")
235- }
236- $Tuple2(([IntegerEntry(keyStatsTotalIn, (valueOrElse(getInteger(this, keyStatsTotalIn), 0) + assetInAmount)), IntegerEntry(keyStatsTotalOut, (valueOrElse(getInteger(this, keyStatsTotalOut), 0) + assetOutAmount)), IntegerEntry(keyStatsTotalInByAddress(userAddress), (valueOrElse(getInteger(this, keyStatsTotalInByAddress(userAddress)), 0) + assetInAmount)), IntegerEntry(keyStatsTotalOutByAddress(userAddress), (valueOrElse(getInteger(this, keyStatsTotalOutByAddress(userAddress)), 0) + assetOutAmount)), StringEntry(keyHistory(userAddress, i.transactionId), formatHistory(assetInAmount, assetOutAmount, stake, stakingNode))] ++ stakeAction), assetOutAmount)
225+ let stakeInvoke = invoke(stakingAddress, "leaseByAddress", [stakingNode, toString(userAddress)], [AttachedPayment(assetOutId, assetOutAmount)])
226+ if ((stakeInvoke == stakeInvoke))
227+ then $Tuple2([IntegerEntry(keyStatsTotalIn, (valueOrElse(getInteger(this, keyStatsTotalIn), 0) + assetInAmount)), IntegerEntry(keyStatsTotalOut, (valueOrElse(getInteger(this, keyStatsTotalOut), 0) + assetOutAmount)), IntegerEntry(keyStatsTotalInByAddress(userAddress), (valueOrElse(getInteger(this, keyStatsTotalInByAddress(userAddress)), 0) + assetInAmount)), IntegerEntry(keyStatsTotalOutByAddress(userAddress), (valueOrElse(getInteger(this, keyStatsTotalOutByAddress(userAddress)), 0) + assetOutAmount)), StringEntry(keyHistory(userAddress, i.transactionId), formatHistory(assetInAmount, assetOutAmount, true, stakingNode))], assetOutAmount)
228+ else throw("Strict value is not equal to itself.")
237229 }
238230 else throw("Strict value is not equal to itself.")
239231 }
240232
241233
242234 @Callable(i)
243-func swap () = getSwapActions(i, "NULL")
244-
245-
246-
247-@Callable(i)
248235 func swapAndStake (stakingNode) = {
249- let check = [if (if (isValidAddress(stakingNode))
250- then true
251- else (stakingNode == ""))
236+ let check = [if (isValidAddress(stakingNode))
252237 then true
253238 else throwErr("staking node address is no valid")]
254239 if ((check == check))
255- then {
256- let node = if ((stakingNode == ""))
257- then "NULL"
258- else stakingNode
259- getSwapActions(i, node)
260- }
240+ then getSwapActions(i, stakingNode)
261241 else throw("Strict value is not equal to itself.")
262242 }
263243
264244
265245
266246 @Callable(i)
267247 func claim () = {
268248 let checkCaller = if ((i.caller == allowedAddress))
269249 then true
270250 else throwErr("permission denied")
271251 if ((checkCaller == checkCaller))
272252 then $Tuple2([ScriptTransfer(allowedAddress, assetBalance(this, assetInId), assetInId)], unit)
273253 else throw("Strict value is not equal to itself.")
274254 }
275255
276256
277257
278258 @Callable(i)
279259 func voteForTxId (txId) = {
280260 let callerAddressString = toBase58String(i.caller.bytes)
281261 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
282262 let result = [StringEntry(keyAllowedTxId(), txId)]
283263 let allowedTxIdOption = getString(this, keyAllowedTxId())
284264 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
285265 then true
286266 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
287267 then true
288268 else (value(allowedTxIdOption) != txId))
289269 then true
290270 else throwErr((txId + " is already allowed"))]
291271 if ((err == err))
292272 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
293273 else throw("Strict value is not equal to itself.")
294274 }
295275
296276
297277 @Verifier(tx)
298278 func verify () = {
299279 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
300280 let byOwner = if ((size(getAdminsList()) >= QUORUM))
301281 then false
302282 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
303283 if (byAdmins)
304284 then true
305285 else byOwner
306286 }
307287

github/deemru/w8io/6500d08 
34.26 ms