tx · 41bKCubY3kMzrmtWrx1BwzPcbC7MJ6tfbhriM41x7VCD

3N5NAftzfcw3gAt8nc35bNr9UdPTVgC81fd:  -0.01900000 Waves

2023.03.01 18:18 [2471169] smart account 3N5NAftzfcw3gAt8nc35bNr9UdPTVgC81fd > SELF 0.00000000 Waves

{ "type": 13, "id": "41bKCubY3kMzrmtWrx1BwzPcbC7MJ6tfbhriM41x7VCD", "fee": 1900000, "feeAssetId": null, "timestamp": 1677683921290, "version": 2, "chainId": 84, "sender": "3N5NAftzfcw3gAt8nc35bNr9UdPTVgC81fd", "senderPublicKey": "CdnTmMHxT68Qa4MtHEnAiUhsdKTi2YkHPGn92ThinVNt", "proofs": [ "26ydS2TunCqHrpLcL5Ba6chpZmAaReVeyZGeQVoenafLQFBZm7bmzkch6gHXt7YEDfGuEPZN4iLgoCdTgdQMERsm", "2EKfSt3cTgnRtw2xfmmY13Z9ZvBDTomUQRdBQaUi3vL8g5wLCCSxE3WWYuHN8k6opx9Z239gJZfFjUBKUBqRuiHB", "613UdSZBxyfsZFJ5Mrg4npG2HpXirYQXda2WhBCuZubKnru8hKM2SoruVsqLSAvYXAUcLiLqQF5WUS51PBR447aN" ], "script": "base64:BgIuCAISBQoDCAEBEgUKAwEBCBIAEgASAwoBCBIAEgASABIAEgUKAwEBBBIECgIBCG0BDmdldE51bWJlckJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgABFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkCB2FkZHJlc3MDa2V5CQELdmFsdWVPckVsc2UCCQCbCAIFB2FkZHJlc3MFA2tleQcBGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQIHYWRkcmVzcwNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUHYWRkcmVzcwUDa2V5AgABGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQIHYWRkcmVzcwNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUHYWRkcmVzcwUDa2V5AAABCWFzQW55TGlzdAEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIJTGlzdFtBbnldBAp2YWxBbnlMeXN0BQckbWF0Y2gwBQp2YWxBbnlMeXN0CQACAQIbZmFpbCB0byBjYXN0IGludG8gTGlzdFtBbnldAQhhc1N0cmluZwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZ2YWxTdHIFByRtYXRjaDAFBnZhbFN0cgkAAgECGGZhaWwgdG8gY2FzdCBpbnRvIFN0cmluZwEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBB2FzQnl0ZXMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEB3ZhbEJ5dGUFByRtYXRjaDAFB3ZhbEJ5dGUJAAIBAhxmYWlsIHRvIGNhc3QgaW50byBCeXRlVmVjdG9yAANTRVACAl9fAAVNVUxUNgDAhD0ABU1VTFQ4AIDC1y8AB01VTFRYMTAJALYCAQCAyK+gJQAHTVVMVFgxMgkAtgIBAICglKWNHQAHTVVMVFgxNgkAtgIBAICAhP6m3uERAAhDQU5DRUxFRAIIY2FuY2VsZWQAA05FVwIDbmV3AAZGSUxMRUQCBmZpbGxlZAAHV0FWRVNJRAkA2QQBAgVXQVZFUwAPbk1ldHJpY0lkeFByaWNlAAAAG25NZXRyaWNJZHhVc2RuTG9ja2VkQmFsYW5jZQABABxuTWV0cmljSWR4V2F2ZXNMb2NrZWRCYWxhbmNlAAIAEW5NZXRyaWNJZHhSZXNlcnZlAAMAF25NZXRyaWNJZHhSZXNlcnZlSW5Vc2RuAAQAFG5NZXRyaWNJZHhVc2RuU3VwcGx5AAUAEW5NZXRyaWNJZHhTdXJwbHVzAAYAGG5NZXRyaWNJZHhTdXJwbHVzUGVyY2VudAAHAAxuTWV0cmljSWR4QlIACAAUbk1ldHJpY0lkeE5zYnRTdXBwbHkACQAXbk1ldHJpY0lkeE1heE5zYnRTdXBwbHkACgAUbk1ldHJpY0lkeFN1cmZTdXBwbHkACwAMYkZ1bmNJZHhTdXJmAAAADWJGdW5jSWR4V2F2ZXMAAQAMYkZ1bmNJZHhVc2RuAAIAFGJGdW5jSWR4UmVzZXJ2ZVN0YXJ0AAMAE2JGdW5jSWR4U3VwcGx5U3RhcnQABAAPYkZ1bmNJZHhCUlN0YXJ0AAUAEmJGdW5jSWR4UmVzZXJ2ZUVuZAAGABFiRnVuY0lkeFN1cHBseUVuZAAHAA1iRnVuY0lkeEJSRW5kAAgADGJGdW5jSWR4UmVzdAAJABJiRnVuY0lkeFdhdmVzUHJpY2UACgAZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAABABhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAAgAUSWR4Q29udHJvbENmZ1JwZERhcHAAAwAVSWR4Q29udHJvbENmZ01hdGhEYXBwAAQAHElkeENvbnRyb2xDZmdMaXF1aWRhdGlvbkRhcHAABQAVSWR4Q29udHJvbENmZ1Jlc3REYXBwAAYAHUlkeENvbnRyb2xDZmdOb2RlUmVnaXN0cnlEYXBwAAcAHElkeENvbnRyb2xDZmdOc2J0U3Rha2luZ0RhcHAACAAZSWR4Q29udHJvbENmZ01lZGlhdG9yRGFwcAAJABxJZHhDb250cm9sQ2ZnU3VyZlN0YWtpbmdEYXBwAAoAIElkeENvbnRyb2xDZmdHbnNidENvbnRyb2xsZXJEYXBwAAsBD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJAKwCAgkArAICCQCsAgIJAKwCAgIKbWFuZGF0b3J5IAkApQgBBQdhZGRyZXNzAgEuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAERa2V5Q29udHJvbEFkZHJlc3MAAhwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQ1rZXlDb250cm9sQ2ZnAAIRJXNfX2NvbnRyb2xDb25maWcBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQdjb250cm9sCQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQdjb250cm9sCQENa2V5Q29udHJvbENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgpjb250cm9sQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKY29udHJvbENmZwUDaWR4CQCsAgICLUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAD2NvbnRyb2xDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5Q29udHJvbEFkZHJlc3MAAiMzTjROUzdkNEpvOWE2RjE0TGlGVUtLWVZkVWtrZjJlUDRaeAAKY29udHJvbENmZwkBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQUPY29udHJvbENvbnRyYWN0AAxtYXRoQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRVJZHhDb250cm9sQ2ZnTWF0aERhcHAAEG5ldXRyaW5vQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwABNzdXJmU3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUcSWR4Q29udHJvbENmZ1N1cmZTdGFraW5nRGFwcAAIUHJpY2VLZXkCBXByaWNlAA5Oc2J0QXNzZXRJZEtleQINYm9uZF9hc3NldF9pZAASTmV1dHJpbm9Bc3NldElkS2V5AhFuZXV0cmlub19hc3NldF9pZAAOU3VyZkFzc2V0SWRLZXkCDXN1cmZfYXNzZXRfaWQAEUJhbGFuY2VMb2NrZWRrS2V5Ag1iYWxhbmNlX2xvY2tfABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkJAKwCAgURQmFsYW5jZUxvY2tlZGtLZXkCBXdhdmVzABhOZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkJAKwCAgURQmFsYW5jZUxvY2tlZGtLZXkCCG5ldXRyaW5vAA1GaXJzdE9yZGVyS2V5AgtvcmRlcl9maXJzdAAPTWF0aENvbnRyYWN0S2V5Ag1tYXRoX2NvbnRyYWN0ABVNaW5XYXZlc0Zvck5zYnRCdXlLZXkCEm1pbl93YXZlc19uc2J0X2J1eQAOTWluTnNidFNlbGxLZXkCDW1pbl9uc2J0X3NlbGwAFU1pbldhdmVzRm9yU3VyZkJ1eUtleQISbWluX3dhdmVzX3N1cmZfYnV5ABRNaW5Vc2RuRm9yU3VyZkJ1eUtleQIRbWluX3VzZG5fc3VyZl9idXkBEmdldFJvaUJ5T3JkZXJJZEtleQEHb3JkZXJJZAkArAICAhBkZWJ1Z19vcmRlcl9yb2lfBQdvcmRlcklkARBnZXRPcmRlclByaWNlS2V5AQdvcmRlcklkCQCsAgICDG9yZGVyX3ByaWNlXwUHb3JkZXJJZAEQZ2V0T3JkZXJUb3RhbEtleQEHb3JkZXJJZAkArAICAgxvcmRlcl90b3RhbF8FB29yZGVySWQBEGdldE9yZGVyT3duZXJLZXkBB29yZGVySWQJAKwCAgIMb3JkZXJfb3duZXJfBQdvcmRlcklkARFnZXRPcmRlckhlaWdodEtleQEHb3JkZXJJZAkArAICAg1vcmRlcl9oZWlnaHRfBQdvcmRlcklkARFnZXRPcmRlclN0YXR1c0tleQEHb3JkZXJJZAkArAICAg1vcmRlcl9zdGF0dXNfBQdvcmRlcklkARZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AQdvcmRlcklkCQCsAgICE29yZGVyX2ZpbGxlZF90b3RhbF8FB29yZGVySWQBD2dldFByZXZPcmRlcktleQEHb3JkZXJJZAkArAICAgtvcmRlcl9wcmV2XwUHb3JkZXJJZAEPZ2V0TmV4dE9yZGVyS2V5AQdvcmRlcklkCQCsAgICC29yZGVyX25leHRfBQdvcmRlcklkARZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAgZhbW91bnQFcHJpY2UJAGsDBQZhbW91bnQFBU1VTFQ4BQVwcmljZQEWY29udmVydFdhdmVzVG9OZXV0cmlubwIGYW1vdW50BXByaWNlCQBrAwUGYW1vdW50BQVwcmljZQUFTVVMVDgBBXRvWDE2AgdvcmlnVmFsDW9yaWdTY2FsZU11bHQJALwCAwkAtgIBBQdvcmlnVmFsBQdNVUxUWDE2CQC2AgEFDW9yaWdTY2FsZU11bHQBB2Zyb21YMTYCA3ZhbA9yZXN1bHRTY2FsZU11bHQJAKADAQkAvAIDBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQdNVUxUWDE2AA9uZXV0cmlub0Fzc2V0SWQBIPd26vf3g8pl224T7gI7z1gplanB0Y3yS9ps2B1igMjeAAtuc2J0QXNzZXRJZAEg0LXMsc32iGTNRyotjPq8+T7E/Q4lTB90XCk6/p1poRAACWlzQmxvY2tlZAkBFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkCBQ9jb250cm9sQ29udHJhY3QCCmlzX2Jsb2NrZWQAFW1pbldhdmVzQW1vdW50TnNidEJ1eQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRVNaW5XYXZlc0Zvck5zYnRCdXlLZXkAgJTr3AMAC21pbk5zYnRTZWxsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDk1pbk5zYnRTZWxsS2V5AMCEPQAVbWluV2F2ZXNBbW91bnRTdXJmQnV5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFU1pbldhdmVzRm9yU3VyZkJ1eUtleQCAwtcvABRtaW5Vc2RuQW1vdW50U3VyZkJ1eQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRRNaW5Vc2RuRm9yU3VyZkJ1eUtleQCAreIEAApmaXJzdE9yZGVyCQEOZ2V0U3RyaW5nQnlLZXkBBQ1GaXJzdE9yZGVyS2V5AQ1nZXRPcmRlclByaWNlAQJpZAkBDmdldE51bWJlckJ5S2V5AQkBEGdldE9yZGVyUHJpY2VLZXkBBQJpZAENZ2V0T3JkZXJUb3RhbAECaWQJAQ5nZXROdW1iZXJCeUtleQEJARBnZXRPcmRlclRvdGFsS2V5AQUCaWQBDWdldE9yZGVyT3duZXIBAmlkCQEOZ2V0U3RyaW5nQnlLZXkBCQEQZ2V0T3JkZXJPd25lcktleQEFAmlkAQ5nZXRPcmRlclN0YXR1cwECaWQJAQ5nZXRTdHJpbmdCeUtleQEJARFnZXRPcmRlclN0YXR1c0tleQEFAmlkARNnZXRPcmRlckZpbGxlZFRvdGFsAQJpZAkBDmdldE51bWJlckJ5S2V5AQkBFmdldE9yZGVyRmlsbGVkVG90YWxLZXkBBQJpZAEMZ2V0UHJldk9yZGVyAQJpZAkBDmdldFN0cmluZ0J5S2V5AQkBD2dldFByZXZPcmRlcktleQEFAmlkAQxnZXROZXh0T3JkZXIBAmlkCQEOZ2V0U3RyaW5nQnlLZXkBCQEPZ2V0TmV4dE9yZGVyS2V5AQUCaWQBD2dldFJldmVyc2VQcmljZQEFcHJpY2UJAGkCCQBoAgUFTVVMVDYFBU1VTFQ2BQVwcmljZQEWY2FsY05zYnQyV2F2ZXNQcmljZVJhdwINc3BlbnRXYXZlc1Jhdw9yZWNlaXZlZE5zYnRSYXcJALwCAwkAtgIBBQ1zcGVudFdhdmVzUmF3CQC2AgEJAGgCBQVNVUxUNgUFTVVMVDYJALYCAQUPcmVjZWl2ZWROc2J0UmF3AQlvcmRlckRhdGEIB29yZGVySWQNdG90YWxXYXZlbGV0cw5maWxsZWRXYXZlbGV0cwVvd25lcgZzdGF0dXMDcm9pBXByaWNlDGN1cnJlbnRQcmljZQkAzAgCCQELU3RyaW5nRW50cnkCCQEQZ2V0T3JkZXJQcmljZUtleQEFB29yZGVySWQJAKYDAQUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARBnZXRPcmRlclRvdGFsS2V5AQUHb3JkZXJJZAUNdG90YWxXYXZlbGV0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmdldE9yZGVyRmlsbGVkVG90YWxLZXkBBQdvcmRlcklkBQ5maWxsZWRXYXZlbGV0cwkAzAgCCQELU3RyaW5nRW50cnkCCQEQZ2V0T3JkZXJPd25lcktleQEFB29yZGVySWQFBW93bmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERZ2V0T3JkZXJIZWlnaHRLZXkBBQdvcmRlcklkBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWdldE9yZGVyU3RhdHVzS2V5AQUHb3JkZXJJZAUGc3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICGWRlYnVnX29yZGVyX2N1cnJlbnRQcmljZV8FB29yZGVySWQFDGN1cnJlbnRQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmdldFJvaUJ5T3JkZXJJZEtleQEFB29yZGVySWQFA3JvaQUDbmlsAQV0b1N0cgIEbmFtZQtjdXJ2ZVJlc3VsdAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBG5hbWUCD1tuc2J0QW1vdW50UmF3PQkApAMBCQEFYXNJbnQBCQCRAwIFC2N1cnZlUmVzdWx0AAACDSB1c2RuUGF5bWVudD0JAKQDAQkBBWFzSW50AQkAkQMCBQtjdXJ2ZVJlc3VsdAABAgYgd1Jhdz0JAKQDAQkBBWFzSW50AQkAkQMCBQtjdXJ2ZVJlc3VsdAACAgYgdVJhdz0JAKQDAQkBBWFzSW50AQkAkQMCBQtjdXJ2ZVJlc3VsdAADAgYgbVJhdz0JAKQDAQkBBWFzSW50AQkAkQMCBQtjdXJ2ZVJlc3VsdAAEAgYgc1Jhdz0JAKQDAQkBBWFzSW50AQkAkQMCBQtjdXJ2ZVJlc3VsdAAFAhIgbnNidEN1cnZlUGFyYW1fYT0JAKQDAQkBBWFzSW50AQkAkQMCBQtjdXJ2ZVJlc3VsdAAGAhIgbnNidEN1cnZlUGFyYW1fYj0JAKQDAQkBBWFzSW50AQkAkQMCBQtjdXJ2ZVJlc3VsdAAHAhEgd1Jlc2VydmVzSW5Vc2RuPQkApAMBCQEFYXNJbnQBCQCRAwIFC2N1cnZlUmVzdWx0AAgCByBwcmljZT0JAKQDAQkBBWFzSW50AQkAkQMCBQtjdXJ2ZVJlc3VsdAAJAgggbXVsdEJSPQkApAMBCQEFYXNJbnQBCQCRAwIFC2N1cnZlUmVzdWx0AAoCCyBtdWx0UG93ZXI9CQCkAwEJAQVhc0ludAEJAJEDAgULY3VydmVSZXN1bHQACwIQIG11bHRFeHBJblBvd2VyPQkBCGFzU3RyaW5nAQkAkQMCBQtjdXJ2ZVJlc3VsdAAMAgcgbXVsdEs9CQEIYXNTdHJpbmcBCQCRAwIFC2N1cnZlUmVzdWx0AA0CByBzdGVwMT0JAQhhc1N0cmluZwEJAJEDAgULY3VydmVSZXN1bHQADgIHIHN0ZXAyPQkBCGFzU3RyaW5nAQkAkQMCBQtjdXJ2ZVJlc3VsdAAPAgcgc3RlcDM9CQCkAwEJAQVhc0ludAEJAJEDAgULY3VydmVSZXN1bHQAEAIBXQEIc3VyZkRhdGEBCnN1cmZSZXN1bHQJAQtTdHJpbmdFbnRyeQICEGRlYnVnX3N1cmZSZXN1bHQJALkJAgkAzAgCAhYlZCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQpzdXJmUmVzdWx0BQxiRnVuY0lkeFN1cmYJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFCnN1cmZSZXN1bHQFDWJGdW5jSWR4V2F2ZXMJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFCnN1cmZSZXN1bHQFDGJGdW5jSWR4VXNkbgkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUKc3VyZlJlc3VsdAUUYkZ1bmNJZHhSZXNlcnZlU3RhcnQJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFCnN1cmZSZXN1bHQFE2JGdW5jSWR4U3VwcGx5U3RhcnQJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFCnN1cmZSZXN1bHQFD2JGdW5jSWR4QlJTdGFydAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUKc3VyZlJlc3VsdAUSYkZ1bmNJZHhSZXNlcnZlRW5kCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQpzdXJmUmVzdWx0BRFiRnVuY0lkeFN1cHBseUVuZAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUKc3VyZlJlc3VsdAUNYkZ1bmNJZHhCUkVuZAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUKc3VyZlJlc3VsdAUMYkZ1bmNJZHhSZXN0CQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQpzdXJmUmVzdWx0BRJiRnVuY0lkeFdhdmVzUHJpY2UFA25pbAUDU0VQCwFpAQ1jb25zdHJ1Y3RvclYxAxNtYXRoQ29udHJhY3RBZGRyZXNzEm1pbldhdmVzRm9yTnNidEJ1eQttaW5Oc2J0U2VsbAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD01hdGhDb250cmFjdEtleQUTbWF0aENvbnRyYWN0QWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUOTWluTnNidFNlbGxLZXkFC21pbk5zYnRTZWxsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVNaW5XYXZlc0Zvck5zYnRCdXlLZXkFEm1pbldhdmVzRm9yTnNidEJ1eQUDbmlsAWkBDWNvbnN0cnVjdG9yVjIDFW1pbldhdmVzRm9yU3VyZkJ1eUtleRRtaW5Vc2RuRm9yU3VyZkJ1eUtleQtkZXNjcmlwdGlvbgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAVpc3N1ZQkAwwgHAgRTVVJGBQtkZXNjcmlwdGlvbgAAAAYGBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUFaXNzdWUJAMwIAgUFaXNzdWUJAMwIAgkBC1N0cmluZ0VudHJ5AgUOU3VyZkFzc2V0SWRLZXkJANgEAQUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVTWluV2F2ZXNGb3JTdXJmQnV5S2V5BRVtaW5XYXZlc0ZvclN1cmZCdXlLZXkJAMwIAgkBDEludGVnZXJFbnRyeQIFFE1pblVzZG5Gb3JTdXJmQnV5S2V5BRRtaW5Vc2RuRm9yU3VyZkJ1eUtleQUDbmlsAWkBB2J1eU5zYnQABANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQJcG10QW1vdW50CAUDcG10BmFtb3VudAQId2F2ZXNQYXkFCXBtdEFtb3VudAMFCWlzQmxvY2tlZAkAAgECWWNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAkAAgECEmNhbiB1c2Ugd2F2ZXMgb25seQMJAGYCBRVtaW5XYXZlc0Ftb3VudE5zYnRCdXkFCXBtdEFtb3VudAkAAgEJAKwCAgkArAICAgRtaW4gCQCkAwEJAGkCBRVtaW5XYXZlc0Ftb3VudE5zYnRCdXkFBU1VTFQ4Ag8gd2F2ZXMgZXhwZWN0ZWQEDG93bmVyQWRkcmVzcwgFAWkGY2FsbGVyBA9uZXV0cmlub01ldHJpY3MJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFA25pbAUDbmlsBAxjdXJyZW50UHJpY2UJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzAAAEC2N1cnZlUmVzdWx0CQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCFWN1cnZlRnVuY3Rpb25SRUFET05MWQkAzAgCBQh3YXZlc1BheQUDbmlsBQNuaWwECm5zYnRBbW91bnQJAQVhc0ludAEJAJEDAgULY3VydmVSZXN1bHQAAAMJAGcCAAAFCm5zYnRBbW91bnQJAAIBAg9uc2J0QW1vdW50IDw9IDAEEm5zYnQyV2F2ZXNQcmljZVJhdwkBFmNhbGNOc2J0MldhdmVzUHJpY2VSYXcCBQh3YXZlc1BheQUKbnNidEFtb3VudAQDcm9pAAAEDGFtb3VudExlYXNlZAkA/AcEBRBuZXV0cmlub0NvbnRyYWN0AgthY2NlcHRXYXZlcwUDbmlsCAUBaQhwYXltZW50cwMJAAACBQxhbW91bnRMZWFzZWQFDGFtb3VudExlYXNlZAkAlAoCCQDOCAIJAQlvcmRlckRhdGEICQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFCXBtdEFtb3VudAUJcG10QW1vdW50CQClCAEFDG93bmVyQWRkcmVzcwUGRklMTEVEBQNyb2kFEm5zYnQyV2F2ZXNQcmljZVJhdwUMY3VycmVudFByaWNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDG93bmVyQWRkcmVzcwUKbnNidEFtb3VudAULbnNidEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgIRZGVidWdfY3VydmVSZXN1bHQJAQV0b1N0cgICC2N1cnZlUmVzdWx0BQtjdXJ2ZVJlc3VsdAUDbmlsBQpuc2J0QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHNlbGxOc2J0AAMFCWlzQmxvY2tlZAkAAgECWWNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQJcG10QW1vdW50CAUDcG10BmFtb3VudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAULbnNidEFzc2V0SWQJAAIBAhFjYW4gdXNlIE5TQlQgb25seQMJAGYCBQttaW5Oc2J0U2VsbAUJcG10QW1vdW50CQACAQkArAICCQCsAgICBG1pbiAJAKQDAQkAaQIFC21pbk5zYnRTZWxsBQVNVUxUNgIOIG5zYnQgZXhwZWN0ZWQECG5ld1ByaWNlCQEFYXNJbnQBCQCRAwIJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIgY2FsY0NvbnRyYWN0TnNidFByaWNlU1lTUkVBRE9OTFkJAMwIAgkBAS0BBQlwbXRBbW91bnQFA25pbAUDbmlsAAADCQBmAgUFTVVMVDYFCG5ld1ByaWNlCQACAQkArAICCQCsAgICI3Jlc3VsdGluZyBuc2J0IHByaWNlIHdvdWxkIGJlIDwgMSAoCQCkAwEFCG5ld1ByaWNlAgYgdXNkbikEBnRyYW5zZgkA/AcEBRBuZXV0cmlub0NvbnRyYWN0AhJ0cmFuc2ZlclVzZG5Ub1VzZXIJAMwIAgUJcG10QW1vdW50CQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQZ0cmFuc2YFBnRyYW5zZgkAlAoCBQNuaWwFCG5ld1ByaWNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2NhbmNlbE9yZGVyAQdvcmRlcklkBAVvd25lcgkBDWdldE9yZGVyT3duZXIBBQdvcmRlcklkBAZhbW91bnQJAGUCCQENZ2V0T3JkZXJUb3RhbAEFB29yZGVySWQJARNnZXRPcmRlckZpbGxlZFRvdGFsAQUHb3JkZXJJZAQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgQJbmV4dE9yZGVyCQEMZ2V0TmV4dE9yZGVyAQUHb3JkZXJJZAQJcHJldk9yZGVyCQEMZ2V0UHJldk9yZGVyAQUHb3JkZXJJZAMJAQIhPQIJAQ5nZXRPcmRlclN0YXR1cwEFB29yZGVySWQFA05FVwkAAgECFGludmFsaWQgb3JkZXIgc3RhdHVzCQDMCAIJAQtTdHJpbmdFbnRyeQIFDUZpcnN0T3JkZXJLZXkDCQAAAgUKZmlyc3RPcmRlcgUHb3JkZXJJZAUJbmV4dE9yZGVyBQpmaXJzdE9yZGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9nZXROZXh0T3JkZXJLZXkBBQlwcmV2T3JkZXIFCW5leHRPcmRlcgkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0UHJldk9yZGVyS2V5AQUJbmV4dE9yZGVyBQlwcmV2T3JkZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWdldE9yZGVyU3RhdHVzS2V5AQUHb3JkZXJJZAUIQ0FOQ0VMRUQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQFBHVuaXQFA25pbAFpASBtaW5XYXZlc0Ftb3VudE5zYnRCdXlTWVNSRUFET05MWQAJAJQKAgUDbmlsBRVtaW5XYXZlc0Ftb3VudE5zYnRCdXkBaQEfbWluTnNidEFtb3VudEZvclNlbGxTWVNSRUFET05MWQAJAJQKAgUDbmlsBQttaW5Oc2J0U2VsbAFpASBtaW5XYXZlc0Ftb3VudFN1cmZCdXlTWVNSRUFET05MWQAJAJQKAgUDbmlsBRVtaW5XYXZlc0Ftb3VudFN1cmZCdXkBaQEfbWluVXNkbkFtb3VudFN1cmZCdXlTWVNSRUFET05MWQAJAJQKAgUDbmlsBRRtaW5Vc2RuQW1vdW50U3VyZkJ1eQFpAQdidXlTdXJmAxJhdmVyYWdlUHJpY2VXYW50ZWQQbWF4VG9sZXJhbmNlUGVyYwlhdXRvU3Rha2UEDHRlc3RBY2NvdW50cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAgx0ZXN0QWNjb3VudHMCAAMDCQECIT0CBQx0ZXN0QWNjb3VudHMCAAkBASEBCQEIY29udGFpbnMCBQx0ZXN0QWNjb3VudHMJAKUIAQgFAWkGY2FsbGVyBwkAAgECMkJlIHBhdGllbnQhIE5lZWQgdG8gdGVzdCBpbiBtYWlubmV0IGJlZm9yZSBsYXVuY2guAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAMJAGcCAAAFEmF2ZXJhZ2VQcmljZVdhbnRlZAkAAgECJWF2ZXJhZ2VQcmljZVdhbnRlZCBzaG91bGQgYmUgcG9zaXRpdmUDCQBnAgAABRBtYXhUb2xlcmFuY2VQZXJjCQACAQIjbWF4VG9sZXJhbmNlUGVyYyBzaG91bGQgYmUgcG9zaXRpdmUDBQlpc0Jsb2NrZWQJAAIBAlljb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIIBQNwbXQHYXNzZXRJZAUHV0FWRVNJRAMDCQECIT0CBQpwbXRBc3NldElkBQ9uZXV0cmlub0Fzc2V0SWQJAQIhPQIFCnBtdEFzc2V0SWQFB1dBVkVTSUQHCQACAQIZVW5zdXBwb3J0ZWQgcGF5bWVudCBhc3NldAMDCQAAAgUKcG10QXNzZXRJZAUPbmV1dHJpbm9Bc3NldElkCQBmAgUUbWluVXNkbkFtb3VudFN1cmZCdXkFA2FtdAcJAAIBCQCsAgIJAKwCAgIEbWluIAkApAMBCQBpAgUUbWluVXNkbkFtb3VudFN1cmZCdXkFBU1VTFQ2Ag4gVVNETiBleHBlY3RlZAMDCQAAAgUKcG10QXNzZXRJZAUHV0FWRVNJRAkAZgIFFW1pbldhdmVzQW1vdW50U3VyZkJ1eQUDYW10BwkAAgEJAKwCAgkArAICAgRtaW4gCQCkAwEJAGkCBRVtaW5XYXZlc0Ftb3VudFN1cmZCdXkFBU1VTFQ4Ag8gV0FWRVMgZXhwZWN0ZWQECnN1cmZSZXN1bHQJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIUc3VyZkZ1bmN0aW9uUkVBRE9OTFkJAMwIAgUDYW10CQDMCAIFCnBtdEFzc2V0SWQFA25pbAUDbmlsBApzcGVudFdhdmVzCQEFYXNJbnQBCQCRAwIFCnN1cmZSZXN1bHQFDWJGdW5jSWR4V2F2ZXMECXNwZW50VXNkbgkBBWFzSW50AQkAkQMCBQpzdXJmUmVzdWx0BQxiRnVuY0lkeFVzZG4ECnN1cmZBbW91bnQJAQVhc0ludAEJAJEDAgUKc3VyZlJlc3VsdAUMYkZ1bmNJZHhTdXJmBAxzdXJmQW1vdW50WDYJALYCAQUKc3VyZkFtb3VudAQOc3BlbnRBY3R1YWxYMTgDCQAAAgUKcG10QXNzZXRJZAUHV0FWRVNJRAkAuQICCQC2AgEFCnNwZW50V2F2ZXMFB01VTFRYMTAJALkCAgkAtgIBBQlzcGVudFVzZG4FB01VTFRYMTIDCQC/AgIFDnNwZW50QWN0dWFsWDE4CQC5AgIJALkCAgkAtgIBCQBkAgUQbWF4VG9sZXJhbmNlUGVyYwUFTVVMVDYJALYCAQUSYXZlcmFnZVByaWNlV2FudGVkBQxzdXJmQW1vdW50WDYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgpUb2xlcmFuY2UgCQCkAwEFEG1heFRvbGVyYW5jZVBlcmMCESBleGNlZWRlZDogc3BlbnQgAwkAAAIFCnBtdEFzc2V0SWQFB1dBVkVTSUQJAKwCAgkApAMBBQpzcGVudFdhdmVzAgYgV0FWRVMJAKwCAgkApAMBBQlzcGVudFVzZG4CBSBVU0ROAgUgZm9yIAkApAMBBQpzdXJmQW1vdW50AgUgU1VSRgQEcmVzdAkBBWFzSW50AQkAkQMCBQpzdXJmUmVzdWx0BQxiRnVuY0lkeFJlc3QECHRyYW5zZmVyAwkAAAIFCnBtdEFzc2V0SWQFB1dBVkVTSUQECHdhdmVzQW10CQD8BwQFEG5ldXRyaW5vQ29udHJhY3QCC2FjY2VwdFdhdmVzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQJAGUCBQNhbXQFBHJlc3QFA25pbAMJAAACBQh3YXZlc0FtdAUId2F2ZXNBbXQDCQBmAgUEcmVzdAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUEcmVzdAUEdW5pdAUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBmAgUEcmVzdAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEG5ldXRyaW5vQ29udHJhY3QJAGUCBQNhbXQFBHJlc3QFD25ldXRyaW5vQXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBHJlc3QFD25ldXRyaW5vQXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEG5ldXRyaW5vQ29udHJhY3QJAGUCBQNhbXQFBHJlc3QFD25ldXRyaW5vQXNzZXRJZAUDbmlsBAtzdXJmQXNzZXRJZAkBB2FzQnl0ZXMBCQD8BwQFBHRoaXMCCWlzc3VlU3VyZgkAzAgCBQpzdXJmQW1vdW50CQDMCAICAAUDbmlsBQNuaWwECnN1cmZBY3Rpb24DBQlhdXRvU3Rha2UECnN0YWtpbmdJbnYJAPwHBAUTc3VyZlN0YWtpbmdDb250cmFjdAITc3Rha2VCeU9yaWdpbkNhbGxlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQtzdXJmQXNzZXRJZAUKc3VyZkFtb3VudAUDbmlsAwkAAAIFCnN0YWtpbmdJbnYFCnN0YWtpbmdJbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCnN1cmZBbW91bnQFC3N1cmZBc3NldElkBQNuaWwJAM4IAgkAzggCBQh0cmFuc2ZlcgkAzAgCCQEIc3VyZkRhdGEBBQpzdXJmUmVzdWx0BQNuaWwFCnN1cmZBY3Rpb24BaQEJaXNzdWVTdXJmAgpzdXJmQW1vdW50DXRhcmdldEFkZHJlc3MEC3N1cmZBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFDlN1cmZBc3NldElkS2V5AwkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAlAoCCQDMCAIJAQdSZWlzc3VlAwULc3VyZkFzc2V0SWQFCnN1cmZBbW91bnQGBQNuaWwFC3N1cmZBc3NldElkAwkAAAIIBQFpBmNhbGxlcgUQbmV1dHJpbm9Db250cmFjdAkAlAoCCQDMCAIJAQdSZWlzc3VlAwULc3VyZkFzc2V0SWQFCnN1cmZBbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDXRhcmdldEFkZHJlc3MFCnN1cmZBbW91bnQFC3N1cmZBc3NldElkBQNuaWwFC3N1cmZBc3NldElkCQACAQIdaXNzdWVTdXJmIC0gcGVybWlzc2lvbiBkZW5pZWQBAnR4AQZ2ZXJpZnkABBNwdWJLZXlBZG1pbnNMaXN0U3RyCQC5CQIJAMwIAgIsRXh0RUVLMTlubUtqOW1DcG5XeXZFRUpGWUFUTE1jVkVNdm9oaFVIa3lITm0JAMwIAgIsRXY1cHk1RmZCUVg5Y1pwWUtuZlFyVEI0OUJ5ZjhRbXBaV2VEVlJpbTR5VjcJAMwIAgIsRFV1dUxqWHU5OG5Cd1pjN2Zxd0NUanRBM25uUndnVGJrTVNyNVNVMk5tRFIJAMwIAgIsRFV1dUxqWHU5OG5Cd1pjN2Zxd0NUanRBM25uUndnVGJrTVNyNVNVMk5tRFIFA25pbAUDU0VQBBBwdWJLZXlBZG1pbnNMaXN0CQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPY29udHJvbENvbnRyYWN0Agwlc19fbXVsdGlzaWcFE3B1YktleUFkbWluc0xpc3RTdHIFA1NFUAQFY291bnQJAGQCCQBkAgkAZAIDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAJEDAgUQcHViS2V5QWRtaW5zTGlzdAAAAAEAAAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEJANkEAQkAkQMCBRBwdWJLZXlBZG1pbnNMaXN0AAEAAQAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgkA2QQBCQCRAwIFEHB1YktleUFkbWluc0xpc3QAAgABAAADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwADCQDZBAEJAJEDAgUQcHViS2V5QWRtaW5zTGlzdAADAAIAAAkAZwIFBWNvdW50AAMe6YIK", "height": 2471169, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: F9p2EZp6KYaGKNkne7XimzcXk67u1Ee3kMrte7TrHvcQ Next: 9YdrK9ZqosM3xe1aezidgGu67UcaNPZLKGahDq49Z54 Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
145145 func keyControlCfg () = "%s__controlConfig"
146146
147147
148-func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
148+func readControlCfgOrFail (control) = split_4C(getStringOrFail(control, keyControlCfg()), SEP)
149149
150150
151151 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
55
66
77 func getStringByKey (key) = valueOrElse(getString(this, key), "")
88
99
1010 func getBoolByAddressAndKey (address,key) = valueOrElse(getBoolean(address, key), false)
1111
1212
1313 func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "")
1414
1515
1616 func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(address, key), 0)
1717
1818
1919 func asAnyList (val) = match val {
2020 case valAnyLyst: List[Any] =>
2121 valAnyLyst
2222 case _ =>
2323 throw("fail to cast into List[Any]")
2424 }
2525
2626
2727 func asString (val) = match val {
2828 case valStr: String =>
2929 valStr
3030 case _ =>
3131 throw("fail to cast into String")
3232 }
3333
3434
3535 func asInt (val) = match val {
3636 case valInt: Int =>
3737 valInt
3838 case _ =>
3939 throw("fail to cast into Int")
4040 }
4141
4242
4343 func asBytes (val) = match val {
4444 case valByte: ByteVector =>
4545 valByte
4646 case _ =>
4747 throw("fail to cast into ByteVector")
4848 }
4949
5050
5151 let SEP = "__"
5252
5353 let MULT6 = 1000000
5454
5555 let MULT8 = 100000000
5656
5757 let MULTX10 = toBigInt(10000000000)
5858
5959 let MULTX12 = toBigInt(1000000000000)
6060
6161 let MULTX16 = toBigInt(10000000000000000)
6262
6363 let CANCELED = "canceled"
6464
6565 let NEW = "new"
6666
6767 let FILLED = "filled"
6868
6969 let WAVESID = fromBase58String("WAVES")
7070
7171 let nMetricIdxPrice = 0
7272
7373 let nMetricIdxUsdnLockedBalance = 1
7474
7575 let nMetricIdxWavesLockedBalance = 2
7676
7777 let nMetricIdxReserve = 3
7878
7979 let nMetricIdxReserveInUsdn = 4
8080
8181 let nMetricIdxUsdnSupply = 5
8282
8383 let nMetricIdxSurplus = 6
8484
8585 let nMetricIdxSurplusPercent = 7
8686
8787 let nMetricIdxBR = 8
8888
8989 let nMetricIdxNsbtSupply = 9
9090
9191 let nMetricIdxMaxNsbtSupply = 10
9292
9393 let nMetricIdxSurfSupply = 11
9494
9595 let bFuncIdxSurf = 0
9696
9797 let bFuncIdxWaves = 1
9898
9999 let bFuncIdxUsdn = 2
100100
101101 let bFuncIdxReserveStart = 3
102102
103103 let bFuncIdxSupplyStart = 4
104104
105105 let bFuncIdxBRStart = 5
106106
107107 let bFuncIdxReserveEnd = 6
108108
109109 let bFuncIdxSupplyEnd = 7
110110
111111 let bFuncIdxBREnd = 8
112112
113113 let bFuncIdxRest = 9
114114
115115 let bFuncIdxWavesPrice = 10
116116
117117 let IdxControlCfgNeutrinoDapp = 1
118118
119119 let IdxControlCfgAuctionDapp = 2
120120
121121 let IdxControlCfgRpdDapp = 3
122122
123123 let IdxControlCfgMathDapp = 4
124124
125125 let IdxControlCfgLiquidationDapp = 5
126126
127127 let IdxControlCfgRestDapp = 6
128128
129129 let IdxControlCfgNodeRegistryDapp = 7
130130
131131 let IdxControlCfgNsbtStakingDapp = 8
132132
133133 let IdxControlCfgMediatorDapp = 9
134134
135135 let IdxControlCfgSurfStakingDapp = 10
136136
137137 let IdxControlCfgGnsbtControllerDapp = 11
138138
139139 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
140140
141141
142142 func keyControlAddress () = "%s%s__config__controlAddress"
143143
144144
145145 func keyControlCfg () = "%s__controlConfig"
146146
147147
148-func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
148+func readControlCfgOrFail (control) = split_4C(getStringOrFail(control, keyControlCfg()), SEP)
149149
150150
151151 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
152152
153153
154154 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
155155
156156 let controlCfg = readControlCfgOrFail(controlContract)
157157
158158 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
159159
160160 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
161161
162162 let surfStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgSurfStakingDapp)
163163
164164 let PriceKey = "price"
165165
166166 let NsbtAssetIdKey = "bond_asset_id"
167167
168168 let NeutrinoAssetIdKey = "neutrino_asset_id"
169169
170170 let SurfAssetIdKey = "surf_asset_id"
171171
172172 let BalanceLockedkKey = "balance_lock_"
173173
174174 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
175175
176176 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
177177
178178 let FirstOrderKey = "order_first"
179179
180180 let MathContractKey = "math_contract"
181181
182182 let MinWavesForNsbtBuyKey = "min_waves_nsbt_buy"
183183
184184 let MinNsbtSellKey = "min_nsbt_sell"
185185
186186 let MinWavesForSurfBuyKey = "min_waves_surf_buy"
187187
188188 let MinUsdnForSurfBuyKey = "min_usdn_surf_buy"
189189
190190 func getRoiByOrderIdKey (orderId) = ("debug_order_roi_" + orderId)
191191
192192
193193 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
194194
195195
196196 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
197197
198198
199199 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
200200
201201
202202 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
203203
204204
205205 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
206206
207207
208208 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
209209
210210
211211 func getPrevOrderKey (orderId) = ("order_prev_" + orderId)
212212
213213
214214 func getNextOrderKey (orderId) = ("order_next_" + orderId)
215215
216216
217217 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
218218
219219
220220 func convertWavesToNeutrino (amount,price) = fraction(amount, price, MULT8)
221221
222222
223223 func toX16 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULTX16, toBigInt(origScaleMult))
224224
225225
226226 func fromX16 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULTX16))
227227
228228
229229 let neutrinoAssetId = base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
230230
231231 let nsbtAssetId = base58'F3iaxzruFeKujfVfYSZEkejpjh67wmRfPCRHiNmWKp3Z'
232232
233233 let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
234234
235235 let minWavesAmountNsbtBuy = valueOrElse(getInteger(this, MinWavesForNsbtBuyKey), 1000000000)
236236
237237 let minNsbtSell = valueOrElse(getInteger(this, MinNsbtSellKey), 1000000)
238238
239239 let minWavesAmountSurfBuy = valueOrElse(getInteger(this, MinWavesForSurfBuyKey), 100000000)
240240
241241 let minUsdnAmountSurfBuy = valueOrElse(getInteger(this, MinUsdnForSurfBuyKey), 10000000)
242242
243243 let firstOrder = getStringByKey(FirstOrderKey)
244244
245245 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
246246
247247
248248 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
249249
250250
251251 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
252252
253253
254254 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
255255
256256
257257 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
258258
259259
260260 func getPrevOrder (id) = getStringByKey(getPrevOrderKey(id))
261261
262262
263263 func getNextOrder (id) = getStringByKey(getNextOrderKey(id))
264264
265265
266266 func getReversePrice (price) = ((MULT6 * MULT6) / price)
267267
268268
269269 func calcNsbt2WavesPriceRaw (spentWavesRaw,receivedNsbtRaw) = fraction(toBigInt(spentWavesRaw), toBigInt((MULT6 * MULT6)), toBigInt(receivedNsbtRaw))
270270
271271
272272 func orderData (orderId,totalWavelets,filledWavelets,owner,status,roi,price,currentPrice) = [StringEntry(getOrderPriceKey(orderId), toString(price)), IntegerEntry(getOrderTotalKey(orderId), totalWavelets), IntegerEntry(getOrderFilledTotalKey(orderId), filledWavelets), StringEntry(getOrderOwnerKey(orderId), owner), IntegerEntry(getOrderHeightKey(orderId), height), StringEntry(getOrderStatusKey(orderId), status), IntegerEntry(("debug_order_currentPrice_" + orderId), currentPrice), IntegerEntry(getRoiByOrderIdKey(orderId), roi)]
273273
274274
275275 func toStr (name,curveResult) = (((((((((((((((((((((((((((((((((((name + "[nsbtAmountRaw=") + toString(asInt(curveResult[0]))) + " usdnPayment=") + toString(asInt(curveResult[1]))) + " wRaw=") + toString(asInt(curveResult[2]))) + " uRaw=") + toString(asInt(curveResult[3]))) + " mRaw=") + toString(asInt(curveResult[4]))) + " sRaw=") + toString(asInt(curveResult[5]))) + " nsbtCurveParam_a=") + toString(asInt(curveResult[6]))) + " nsbtCurveParam_b=") + toString(asInt(curveResult[7]))) + " wReservesInUsdn=") + toString(asInt(curveResult[8]))) + " price=") + toString(asInt(curveResult[9]))) + " multBR=") + toString(asInt(curveResult[10]))) + " multPower=") + toString(asInt(curveResult[11]))) + " multExpInPower=") + asString(curveResult[12])) + " multK=") + asString(curveResult[13])) + " step1=") + asString(curveResult[14])) + " step2=") + asString(curveResult[15])) + " step3=") + toString(asInt(curveResult[16]))) + "]")
276276
277277
278278 func surfData (surfResult) = StringEntry("debug_surfResult", makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(asInt(surfResult[bFuncIdxSurf])), toString(asInt(surfResult[bFuncIdxWaves])), toString(asInt(surfResult[bFuncIdxUsdn])), toString(asInt(surfResult[bFuncIdxReserveStart])), toString(asInt(surfResult[bFuncIdxSupplyStart])), toString(asInt(surfResult[bFuncIdxBRStart])), toString(asInt(surfResult[bFuncIdxReserveEnd])), toString(asInt(surfResult[bFuncIdxSupplyEnd])), toString(asInt(surfResult[bFuncIdxBREnd])), toString(asInt(surfResult[bFuncIdxRest])), toString(asInt(surfResult[bFuncIdxWavesPrice]))], SEP))
279279
280280
281281 @Callable(i)
282282 func constructorV1 (mathContractAddress,minWavesForNsbtBuy,minNsbtSell) = if ((i.caller != this))
283283 then throw("Permission denied")
284284 else [StringEntry(MathContractKey, mathContractAddress), IntegerEntry(MinNsbtSellKey, minNsbtSell), IntegerEntry(MinWavesForNsbtBuyKey, minWavesForNsbtBuy)]
285285
286286
287287
288288 @Callable(i)
289289 func constructorV2 (minWavesForSurfBuyKey,minUsdnForSurfBuyKey,description) = if ((i.caller != this))
290290 then throw("Permission denied")
291291 else {
292292 let issue = Issue("SURF", description, 0, 6, true, unit, 0)
293293 let assetId = calculateAssetId(issue)
294294 [issue, StringEntry(SurfAssetIdKey, toBase58String(assetId)), IntegerEntry(MinWavesForSurfBuyKey, minWavesForSurfBuyKey), IntegerEntry(MinUsdnForSurfBuyKey, minUsdnForSurfBuyKey)]
295295 }
296296
297297
298298
299299 @Callable(i)
300300 func buyNsbt () = {
301301 let pmt = value(i.payments[0])
302302 let pmtAmount = pmt.amount
303303 let wavesPay = pmtAmount
304304 if (isBlocked)
305305 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
306306 else if (isDefined(pmt.assetId))
307307 then throw("can use waves only")
308308 else if ((minWavesAmountNsbtBuy > pmtAmount))
309309 then throw((("min " + toString((minWavesAmountNsbtBuy / MULT8))) + " waves expected"))
310310 else {
311311 let ownerAddress = i.caller
312312 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
313313 let currentPrice = asInt(neutrinoMetrics[0])
314314 let curveResult = asAnyList(invoke(mathContract, "curveFunctionREADONLY", [wavesPay], nil))
315315 let nsbtAmount = asInt(curveResult[0])
316316 if ((0 >= nsbtAmount))
317317 then throw("nsbtAmount <= 0")
318318 else {
319319 let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(wavesPay, nsbtAmount)
320320 let roi = 0
321321 let amountLeased = invoke(neutrinoContract, "acceptWaves", nil, i.payments)
322322 if ((amountLeased == amountLeased))
323323 then $Tuple2((orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw, currentPrice) ++ [ScriptTransfer(ownerAddress, nsbtAmount, nsbtAssetId), StringEntry("debug_curveResult", toStr("curveResult", curveResult))]), nsbtAmount)
324324 else throw("Strict value is not equal to itself.")
325325 }
326326 }
327327 }
328328
329329
330330
331331 @Callable(i)
332332 func sellNsbt () = if (isBlocked)
333333 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
334334 else {
335335 let pmt = value(i.payments[0])
336336 let pmtAmount = pmt.amount
337337 if ((pmt.assetId != nsbtAssetId))
338338 then throw("can use NSBT only")
339339 else if ((minNsbtSell > pmtAmount))
340340 then throw((("min " + toString((minNsbtSell / MULT6))) + " nsbt expected"))
341341 else {
342342 let newPrice = asInt(asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [-(pmtAmount)], nil))[0])
343343 if ((MULT6 > newPrice))
344344 then throw((("resulting nsbt price would be < 1 (" + toString(newPrice)) + " usdn)"))
345345 else {
346346 let transf = invoke(neutrinoContract, "transferUsdnToUser", [pmtAmount, toString(i.caller)], nil)
347347 if ((transf == transf))
348348 then $Tuple2(nil, newPrice)
349349 else throw("Strict value is not equal to itself.")
350350 }
351351 }
352352 }
353353
354354
355355
356356 @Callable(i)
357357 func cancelOrder (orderId) = {
358358 let owner = getOrderOwner(orderId)
359359 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
360360 let caller = toString(i.caller)
361361 let nextOrder = getNextOrder(orderId)
362362 let prevOrder = getPrevOrder(orderId)
363363 if ((getOrderStatus(orderId) != NEW))
364364 then throw("invalid order status")
365365 else [StringEntry(FirstOrderKey, if ((firstOrder == orderId))
366366 then nextOrder
367367 else firstOrder), StringEntry(getNextOrderKey(prevOrder), nextOrder), StringEntry(getPrevOrderKey(nextOrder), prevOrder), StringEntry(getOrderStatusKey(orderId), CANCELED), ScriptTransfer(i.caller, amount, unit)]
368368 }
369369
370370
371371
372372 @Callable(i)
373373 func minWavesAmountNsbtBuySYSREADONLY () = $Tuple2(nil, minWavesAmountNsbtBuy)
374374
375375
376376
377377 @Callable(i)
378378 func minNsbtAmountForSellSYSREADONLY () = $Tuple2(nil, minNsbtSell)
379379
380380
381381
382382 @Callable(i)
383383 func minWavesAmountSurfBuySYSREADONLY () = $Tuple2(nil, minWavesAmountSurfBuy)
384384
385385
386386
387387 @Callable(i)
388388 func minUsdnAmountSurfBuySYSREADONLY () = $Tuple2(nil, minUsdnAmountSurfBuy)
389389
390390
391391
392392 @Callable(i)
393393 func buySurf (averagePriceWanted,maxTolerancePerc,autoStake) = {
394394 let testAccounts = valueOrElse(getString(this, "testAccounts"), "")
395395 if (if ((testAccounts != ""))
396396 then !(contains(testAccounts, toString(i.caller)))
397397 else false)
398398 then throw("Be patient! Need to test in mainnet before launch.")
399399 else if ((size(i.payments) != 1))
400400 then throw("exactly 1 payment must be attached")
401401 else if ((0 >= averagePriceWanted))
402402 then throw("averagePriceWanted should be positive")
403403 else if ((0 >= maxTolerancePerc))
404404 then throw("maxTolerancePerc should be positive")
405405 else if (isBlocked)
406406 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
407407 else {
408408 let pmt = i.payments[0]
409409 let amt = pmt.amount
410410 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
411411 if (if ((pmtAssetId != neutrinoAssetId))
412412 then (pmtAssetId != WAVESID)
413413 else false)
414414 then throw("Unsupported payment asset")
415415 else if (if ((pmtAssetId == neutrinoAssetId))
416416 then (minUsdnAmountSurfBuy > amt)
417417 else false)
418418 then throw((("min " + toString((minUsdnAmountSurfBuy / MULT6))) + " USDN expected"))
419419 else if (if ((pmtAssetId == WAVESID))
420420 then (minWavesAmountSurfBuy > amt)
421421 else false)
422422 then throw((("min " + toString((minWavesAmountSurfBuy / MULT8))) + " WAVES expected"))
423423 else {
424424 let surfResult = asAnyList(invoke(mathContract, "surfFunctionREADONLY", [amt, pmtAssetId], nil))
425425 let spentWaves = asInt(surfResult[bFuncIdxWaves])
426426 let spentUsdn = asInt(surfResult[bFuncIdxUsdn])
427427 let surfAmount = asInt(surfResult[bFuncIdxSurf])
428428 let surfAmountX6 = toBigInt(surfAmount)
429429 let spentActualX18 = if ((pmtAssetId == WAVESID))
430430 then (toBigInt(spentWaves) * MULTX10)
431431 else (toBigInt(spentUsdn) * MULTX12)
432432 if ((spentActualX18 > ((toBigInt((maxTolerancePerc + MULT6)) * toBigInt(averagePriceWanted)) * surfAmountX6)))
433433 then throw((((((("Tolerance " + toString(maxTolerancePerc)) + " exceeded: spent ") + (if ((pmtAssetId == WAVESID))
434434 then (toString(spentWaves) + " WAVES")
435435 else (toString(spentUsdn) + " USDN"))) + " for ") + toString(surfAmount)) + " SURF"))
436436 else {
437437 let rest = asInt(surfResult[bFuncIdxRest])
438438 let transfer = if ((pmtAssetId == WAVESID))
439439 then {
440440 let wavesAmt = invoke(neutrinoContract, "acceptWaves", nil, [AttachedPayment(unit, (amt - rest))])
441441 if ((wavesAmt == wavesAmt))
442442 then if ((rest > 0))
443443 then [ScriptTransfer(i.caller, rest, unit)]
444444 else nil
445445 else throw("Strict value is not equal to itself.")
446446 }
447447 else if ((rest > 0))
448448 then [ScriptTransfer(neutrinoContract, (amt - rest), neutrinoAssetId), ScriptTransfer(i.caller, rest, neutrinoAssetId)]
449449 else [ScriptTransfer(neutrinoContract, (amt - rest), neutrinoAssetId)]
450450 let surfAssetId = asBytes(invoke(this, "issueSurf", [surfAmount, ""], nil))
451451 let surfAction = if (autoStake)
452452 then {
453453 let stakingInv = invoke(surfStakingContract, "stakeByOriginCaller", nil, [AttachedPayment(surfAssetId, surfAmount)])
454454 if ((stakingInv == stakingInv))
455455 then nil
456456 else throw("Strict value is not equal to itself.")
457457 }
458458 else [ScriptTransfer(i.caller, surfAmount, surfAssetId)]
459459 ((transfer ++ [surfData(surfResult)]) ++ surfAction)
460460 }
461461 }
462462 }
463463 }
464464
465465
466466
467467 @Callable(i)
468468 func issueSurf (surfAmount,targetAddress) = {
469469 let surfAssetId = fromBase58String(getStringValue(SurfAssetIdKey))
470470 if ((i.caller == this))
471471 then $Tuple2([Reissue(surfAssetId, surfAmount, true)], surfAssetId)
472472 else if ((i.caller == neutrinoContract))
473473 then $Tuple2([Reissue(surfAssetId, surfAmount, true), ScriptTransfer(addressFromStringValue(targetAddress), surfAmount, surfAssetId)], surfAssetId)
474474 else throw("issueSurf - permission denied")
475475 }
476476
477477
478478 @Verifier(tx)
479479 func verify () = {
480480 let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], SEP)
481481 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
482482 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
483483 then 1
484484 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
485485 then 1
486486 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
487487 then 1
488488 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
489489 then 2
490490 else 0))
491491 (count >= 3)
492492 }
493493

github/deemru/w8io/169f3d6 
71.17 ms