tx · 9yr87tJwoFVqYy1w7CyrioYbvYE1cvxSBjtWNPYEZynd

3P2K8CWUGqJU9mP147xnjWpSQn1q1zFX3GA:  -0.01400000 Waves

2022.10.06 15:58 [3325975] smart account 3P2K8CWUGqJU9mP147xnjWpSQn1q1zFX3GA > SELF 0.00000000 Waves

{ "type": 13, "id": "9yr87tJwoFVqYy1w7CyrioYbvYE1cvxSBjtWNPYEZynd", "fee": 1400000, "feeAssetId": null, "timestamp": 1665061040209, "version": 1, "sender": "3P2K8CWUGqJU9mP147xnjWpSQn1q1zFX3GA", "senderPublicKey": "DziAWik7v792pPHDeEqmkowKnGawQAGHvQVBRQx2s9gB", "proofs": [ "5hbshCqQgxxRGEYm4RZZnGgNQXfYgqy1sya7RMsYJXBGuNXbvhPhrUZptDyVcHkL5sGjbQkJ9RBwiWaKjEK8kjW" ], "script": "base64:BgIsCAISCgoICAgBAQEBAQESAwoBCBIDCgEIEgUKAwgIARIECgIICBIDCgEIEgATAANTRVACAl9fARNrZXlNYW5hZ2VyUHVibGljS2V5AAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5ARBrZXlXaXRoZHJhd0RlbGF5AgZhc3NldEEGYXNzZXRCCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICDXdpdGhkcmF3RGVsYXkJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgUDbmlsBQNTRVABFWtleURlcG9zaXRGZWVQZXJtaWxsZQIGYXNzZXRBBmFzc2V0QgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhJkZXBvc2l0RmVlUGVybWlsbGUJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgUDbmlsBQNTRVABFmtleVdpdGhkcmF3RmVlUGVybWlsbGUCBmFzc2V0QQZhc3NldEIJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgITd2l0aGRyYXdGZWVQZXJtaWxsZQkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCBQNuaWwFA1NFUAETa2V5TWluQW1vdW50RGVwb3NpdAIGYXNzZXRBBmFzc2V0QgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhBtaW5BbW91bnREZXBvc2l0CQDMCAIFBmFzc2V0QQkAzAgCBQZhc3NldEIFA25pbAUDU0VQARNrZXlBc3NldHNQYWlyU3RhdHVzAgZhc3NldEEGYXNzZXRCCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEGFzc2V0c1BhaXJTdGF0dXMJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgUDbmlsBQNTRVABFGtleU1pbkFtb3VudFdpdGhkcmF3AgZhc3NldEEGYXNzZXRCCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEW1pbkFtb3VudFdpdGhkcmF3CQDMCAIFBmFzc2V0QQkAzAgCBQZhc3NldEIFA25pbAUDU0VQAQprZXlCYWxhbmNlAwZhc3NldEEGYXNzZXRCC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIHYmFsYW5jZQkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEba2V5VG90YWxGZWVDb2xsZWN0ZWREZXBvc2l0AgZhc3NldEEGYXNzZXRCCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIRdG90YWxGZWVDb2xsZWN0ZWQJAMwIAgIHZGVwb3NpdAkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCBQNuaWwFA1NFUAEca2V5VG90YWxGZWVDb2xsZWN0ZWRXaXRoZHJhdwIGYXNzZXRBBmFzc2V0QgkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAICEXRvdGFsRmVlQ29sbGVjdGVkCQDMCAICCHdpdGhkcmF3CQDMCAIFBmFzc2V0QQkAzAgCBQZhc3NldEIFA25pbAUDU0VQARRrZXlQcm9jZXNzSW5Qcm9ncmVzcwQLdXNlckFkZHJlc3MGYXNzZXRBBmFzc2V0QgtoZWlnaHRJbktleQkAuQkCCQDMCAICDCVzJXMlcyVzJXMlZAkAzAgCAg93aXRoZHJhd1Byb2Nlc3MJAMwIAgIKaW5Qcm9ncmVzcwkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCCQDMCAIJAKQDAQULaGVpZ2h0SW5LZXkFA25pbAUDU0VQAQ5rZXlQcm9jZXNzRG9uZQQLdXNlckFkZHJlc3MGYXNzZXRBBmFzc2V0QgtoZWlnaHRJbktleQkAuQkCCQDMCAICDCVzJXMlcyVzJXMlZAkAzAgCAg93aXRoZHJhd1Byb2Nlc3MJAMwIAgIEZG9uZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCCQDMCAIJAKQDAQULaGVpZ2h0SW5LZXkFA25pbAUDU0VQARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBC211c3RNYW5hZ2VyAQFpBAJwZAkAAgECElBlcm1pc3Npb24gZGVuaWVkLgQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsGBQJwZAMJAAECBQckbWF0Y2gwAgRVbml0AwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFAnBkCQACAQILTWF0Y2ggZXJyb3IBBmZtdEVycgEDbXNnCQC5CQIJAMwIAgIUb3RjX211bHRpYXNzZXQucmlkZToJAMwIAgUDbXNnBQNuaWwCASABCHRocm93RXJyAQNtc2cJAAIBCQEGZm10RXJyAQUDbXNnBwFpAQ1yZWdpc3RlckFzc2V0CAZhc3NldEEGYXNzZXRCDXdpdGhkcmF3RGVsYXkKZGVwb3NpdEZlZQt3aXRoZHJhd0ZlZRBtaW5BbW91bnREZXBvc2l0EW1pbkFtb3VudFdpdGhkcmF3CnBhaXJTdGF0dXMEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQQd2l0aGRyYXdEZWxheUtleQkBEGtleVdpdGhkcmF3RGVsYXkCBQZhc3NldEEFBmFzc2V0QgQVZGVwb3NpdEZlZVBlcm1pbGxlS2V5CQEVa2V5RGVwb3NpdEZlZVBlcm1pbGxlAgUGYXNzZXRBBQZhc3NldEIEFndpdGhkcmF3RmVlUGVybWlsbGVLZXkJARZrZXlXaXRoZHJhd0ZlZVBlcm1pbGxlAgUGYXNzZXRBBQZhc3NldEIEE21pbkFtb3VudERlcG9zaXRLZXkJARNrZXlNaW5BbW91bnREZXBvc2l0AgUGYXNzZXRBBQZhc3NldEIEFG1pbkFtb3VudFdpdGhkcmF3S2V5CQEUa2V5TWluQW1vdW50V2l0aGRyYXcCBQZhc3NldEEFBmFzc2V0QgQNcGFpclN0YXR1c0tleQkBE2tleUFzc2V0c1BhaXJTdGF0dXMCBQZhc3NldEEFBmFzc2V0QgkAzAgCCQEMSW50ZWdlckVudHJ5AgUQd2l0aGRyYXdEZWxheUtleQUNd2l0aGRyYXdEZWxheQkAzAgCCQEMSW50ZWdlckVudHJ5AgUVZGVwb3NpdEZlZVBlcm1pbGxlS2V5BQpkZXBvc2l0RmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZ3aXRoZHJhd0ZlZVBlcm1pbGxlS2V5BQt3aXRoZHJhd0ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUTbWluQW1vdW50RGVwb3NpdEtleQUQbWluQW1vdW50RGVwb3NpdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUbWluQW1vdW50V2l0aGRyYXdLZXkFEW1pbkFtb3VudFdpdGhkcmF3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1wYWlyU3RhdHVzS2V5BQpwYWlyU3RhdHVzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOc3dhcEFzc2V0c0FUb0IBBmFzc2V0QgQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAZhc3NldEEJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQFYXNzZXQJANkEAQkBBXZhbHVlAQUGYXNzZXRCBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEEG1pbkFtb3VudERlcG9zaXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQETa2V5TWluQW1vdW50RGVwb3NpdAIFBmFzc2V0QQUGYXNzZXRCCQEGZm10RXJyAQIfVGhpcyBhc3NldCBwYWlyIGRvZXMgbm90IGV4aXN0LgQJdG9EZXBvc2l0CAUHcGF5bWVudAZhbW91bnQECmRlcG9zaXRGZWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQEVa2V5RGVwb3NpdEZlZVBlcm1pbGxlAgUGYXNzZXRBBQZhc3NldEIJAQZmbXRFcnIBAjNUaGUgZGVwb3NpdCBmZWUgZm9yIHRoaXMgcGFpciBvZiBhc3NldHMgaXMgbm90IHNldC4EA2ZlZQkAaAIJAGkCBQl0b0RlcG9zaXQA6AcFCmRlcG9zaXRGZWUEEmN1cnJlbnRVc2VyQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEKa2V5QmFsYW5jZQMFBmFzc2V0QQUGYXNzZXRCBQt1c2VyQWRkcmVzcwAABBB0b3RhbENvbW1pc3Npb25zCQELdmFsdWVPckVsc2UCCQCfCAEJARtrZXlUb3RhbEZlZUNvbGxlY3RlZERlcG9zaXQCBQZhc3NldEEFBmFzc2V0QgAABApwYWlyU3RhdHVzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBE2tleUFzc2V0c1BhaXJTdGF0dXMCBQZhc3NldEEFBmFzc2V0QgkBBmZtdEVycgECOVRoZSBhc3NldCBwYWlyIHN0YXR1cyBmb3IgdGhpcyBwYWlyIG9mIGFzc2V0cyBpcyBub3Qgc2V0LgQPY2hlY2tQYWlyU3RhdHVzAwkAAAIFCnBhaXJTdGF0dXMAAAYJAQh0aHJvd0VycgECIFRoZSBjb3VwbGUncyBkZXBvc2l0IGlzIGJsb2NrZWQuAwkAAAIFD2NoZWNrUGFpclN0YXR1cwUPY2hlY2tQYWlyU3RhdHVzBAxjaGVja1BheW1lbnQDCQBnAgUJdG9EZXBvc2l0BRBtaW5BbW91bnREZXBvc2l0BgkBCHRocm93RXJyAQIsVGhlIGRlcG9zaXQgYW1vdW50IGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bS4DCQAAAgUMY2hlY2tQYXltZW50BQxjaGVja1BheW1lbnQECm5ld0JhbGFuY2UJAGUCCQBkAgUSY3VycmVudFVzZXJCYWxhbmNlBQl0b0RlcG9zaXQFA2ZlZQQMY2hlY2tCYWxhbmNlAwkAZgIFCm5ld0JhbGFuY2UAAAYJAQh0aHJvd0VycgECLVRoZSBmaW5hbCBiYWxhbmNlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAwLgMJAAACBQxjaGVja0JhbGFuY2UFDGNoZWNrQmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUJhbGFuY2UDBQZhc3NldEEFBmFzc2V0QgULdXNlckFkZHJlc3MFCm5ld0JhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARtrZXlUb3RhbEZlZUNvbGxlY3RlZERlcG9zaXQCBQZhc3NldEEFBmFzc2V0QgkAZAIFEHRvdGFsQ29tbWlzc2lvbnMFA2ZlZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQl0b0RlcG9zaXQFA2ZlZQUFYXNzZXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARxpbml0aWFsaXphdGlvblN3YXBBc3NldHNCVG9BAQZhc3NldEEEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQKdG9XaXRoZHJhdwgFB3BheW1lbnQGYW1vdW50BAZhc3NldEIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBBFtaW5BbW91bnRXaXRoZHJhdwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJARRrZXlNaW5BbW91bnRXaXRoZHJhdwIFBmFzc2V0QQUGYXNzZXRCCQEGZm10RXJyAQJBVGhlIG1pbmltdW0gd2l0aGRyYXdhbCBhbW91bnQgZm9yIHRoaXMgcGFpciBvZiBhc3NldHMgaXMgbm90IHNldC4ED2Fzc2V0TG9ja0hlaWdodAkAZAIFBmhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJARBrZXlXaXRoZHJhd0RlbGF5AgUGYXNzZXRBBQZhc3NldEIJAQZmbXRFcnIBAjNXaXRoZHJhd2FsIGRlbGF5IGlzIG5vdCBzZXQgZm9yIHRoZSBzcGVjaWZpZWQgcGFpci4EEmN1cnJlbnRVc2VyQmFsYW5jZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAQprZXlCYWxhbmNlAwUGYXNzZXRBBQZhc3NldEIFC3VzZXJBZGRyZXNzCQEGZm10RXJyAQIhVGhpcyB1c2VyIGJhbGFuY2UgZG9lcyBub3QgZXhpc3QuBBB0b3RhbENvbW1pc3Npb25zCQELdmFsdWVPckVsc2UCCQCfCAEJARxrZXlUb3RhbEZlZUNvbGxlY3RlZFdpdGhkcmF3AgUGYXNzZXRBBQZhc3NldEIAAAQWd2l0aGRyYXdGZWVQZXJtaWxsZUtleQkBFmtleVdpdGhkcmF3RmVlUGVybWlsbGUCBQZhc3NldEEFBmFzc2V0QgQLd2l0aGRyYXdGZWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRZ3aXRoZHJhd0ZlZVBlcm1pbGxlS2V5CQEGZm10RXJyAQI2VGhlIHdpdGhkcmF3YWwgZmVlIGZvciB0aGlzIHBhaXIgb2YgYXNzZXRzIGlzIG5vdCBzZXQuBANmZWUJAGgCCQBpAgUKdG9XaXRoZHJhdwDoBwULd2l0aGRyYXdGZWUECm5ld0JhbGFuY2UJAGUCBRJjdXJyZW50VXNlckJhbGFuY2UFCnRvV2l0aGRyYXcEDGNoZWNrQmFsYW5jZQMJAGcCBQpuZXdCYWxhbmNlAAAGCQEIdGhyb3dFcnIBAiVTd2FwIGFtb3VudCBmYWlsLCBhbW91bnQgaXMgdG8gc21hbGwuAwkAAAIFDGNoZWNrQmFsYW5jZQUMY2hlY2tCYWxhbmNlBAxjaGVja1BheW1lbnQDCQBnAgUKdG9XaXRoZHJhdwURbWluQW1vdW50V2l0aGRyYXcGCQEIdGhyb3dFcnIBAi1UaGUgd2l0aGRyYXcgYW1vdW50IGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bS4DCQAAAgUMY2hlY2tQYXltZW50BQxjaGVja1BheW1lbnQEFmNoZWNrUHJvY2Vzc0luUHJvZ3Jlc3MDCQAAAgkAnwgBCQEUa2V5UHJvY2Vzc0luUHJvZ3Jlc3MEBQt1c2VyQWRkcmVzcwUGYXNzZXRBBQZhc3NldEIFD2Fzc2V0TG9ja0hlaWdodAUEdW5pdAYJAQh0aHJvd0VycgECOkF0IHRoaXMgaGVpZ2h0LCB0aGVyZSBpcyBhbHJlYWR5IGFuIGV4Y2hhbmdlIG9mIHRoaXMgcGFpci4DCQAAAgUWY2hlY2tQcm9jZXNzSW5Qcm9ncmVzcwUWY2hlY2tQcm9jZXNzSW5Qcm9ncmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUJhbGFuY2UDBQZhc3NldEEFBmFzc2V0QgULdXNlckFkZHJlc3MFCm5ld0JhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlQcm9jZXNzSW5Qcm9ncmVzcwQFC3VzZXJBZGRyZXNzBQZhc3NldEEFBmFzc2V0QgUPYXNzZXRMb2NrSGVpZ2h0CQBlAgUKdG9XaXRoZHJhdwUDZmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEca2V5VG90YWxGZWVDb2xsZWN0ZWRXaXRoZHJhdwIFBmFzc2V0QQUGYXNzZXRCCQBkAgUQdG90YWxDb21taXNzaW9ucwUDZmVlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENd2l0aGRyYXdBc3NldAMGYXNzZXRBBmFzc2V0QgtoZWlnaHRJbktleQQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAp0b1dpdGhkcmF3CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBFGtleVByb2Nlc3NJblByb2dyZXNzBAULdXNlckFkZHJlc3MFBmFzc2V0QQUGYXNzZXRCBQtoZWlnaHRJbktleQkBBmZtdEVycgECRkF0IHRoaXMgaGVpZ2h0LCB3aXRoZHJhdyB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdGhpcyBwYWlyIG9mIGFzc2V0cy4EBWFzc2V0CQDZBAEJAQV2YWx1ZQEFBmFzc2V0QQQLY2hlY2tIZWlnaHQDCQBnAgUGaGVpZ2h0BQtoZWlnaHRJbktleQYJAQh0aHJvd0VycgEJAKwCAgkArAICAh1XaXRoZHJhd2FsIGlzIHBvc3NpYmxlIGFmdGVyIAkApAMBBQtoZWlnaHRJbktleQImIGhlaWdodCBvciB5b3UgaGF2ZSBhbHJlYWR5IHdpdGhkcmF3bi4DCQAAAgULY2hlY2tIZWlnaHQFC2NoZWNrSGVpZ2h0CQDMCAIJAQtEZWxldGVFbnRyeQEJARRrZXlQcm9jZXNzSW5Qcm9ncmVzcwQFC3VzZXJBZGRyZXNzBQZhc3NldEEFBmFzc2V0QgULaGVpZ2h0SW5LZXkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlQcm9jZXNzRG9uZQQFC3VzZXJBZGRyZXNzBQZhc3NldEEFBmFzc2V0QgULaGVpZ2h0SW5LZXkFCnRvV2l0aGRyYXcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQp0b1dpdGhkcmF3BQVhc3NldAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3dpdGhkcmF3RmVlAgZhc3NldEEGYXNzZXRCBAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3RvV2l0aGRyYXdCCQELdmFsdWVPckVsc2UCCQCfCAEJARtrZXlUb3RhbEZlZUNvbGxlY3RlZERlcG9zaXQCBQZhc3NldEEFBmFzc2V0QgAABA53aXRoZHJhd0Fzc2V0QgkA2QQBCQEFdmFsdWUBBQZhc3NldEIEC3RvV2l0aGRyYXdBCQELdmFsdWVPckVsc2UCCQCfCAEJARxrZXlUb3RhbEZlZUNvbGxlY3RlZFdpdGhkcmF3AgUGYXNzZXRBBQZhc3NldEIAAAQOd2l0aGRyYXdBc3NldEEJANkEAQkBBXZhbHVlAQUGYXNzZXRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEba2V5VG90YWxGZWVDb2xsZWN0ZWREZXBvc2l0AgUGYXNzZXRBBQZhc3NldEIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC3RvV2l0aGRyYXdBBQ53aXRoZHJhd0Fzc2V0QQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHGtleVRvdGFsRmVlQ29sbGVjdGVkV2l0aGRyYXcCBQZhc3NldEEFBmFzc2V0QgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULdG9XaXRoZHJhd0IFDndpdGhkcmF3QXNzZXRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKc2V0TWFuYWdlcgEXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFFWNoZWNrTWFuYWdlclB1YmxpY0tleQUVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAJwbQkBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQFaGFzUE0DCQEJaXNEZWZpbmVkAQUCcG0GCQEIdGhyb3dFcnIBAhNObyBwZW5kaW5nIG1hbmFnZXIuAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkBCHRocm93RXJyAQIcWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyLgMJAAACBQdjaGVja1BNBQdjaGVja1BNCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlNYW5hZ2VyUHVibGljS2V5AAkA2AQBCQEFdmFsdWUBBQJwbQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXk8CZi+", "chainId": 87, "height": 3325975, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: HcBXfrEt99B793BGpsv6ThxWXZSy4gUrWVJun6tvarVZ Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEP = "__"
5+
6+func keyManagerPublicKey () = "%s__managerPublicKey"
7+
8+
9+func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
10+
11+
12+func keyWithdrawDelay (assetA,assetB) = makeString(["%s%s%s", "withdrawDelay", assetA, assetB], SEP)
13+
14+
15+func keyDepositFeePermille (assetA,assetB) = makeString(["%s%s%s", "depositFeePermille", assetA, assetB], SEP)
16+
17+
18+func keyWithdrawFeePermille (assetA,assetB) = makeString(["%s%s%s", "withdrawFeePermille", assetA, assetB], SEP)
19+
20+
21+func keyMinAmountDeposit (assetA,assetB) = makeString(["%s%s%s", "minAmountDeposit", assetA, assetB], SEP)
22+
23+
24+func keyAssetsPairStatus (assetA,assetB) = makeString(["%s%s%s", "assetsPairStatus", assetA, assetB], SEP)
25+
26+
27+func keyMinAmountWithdraw (assetA,assetB) = makeString(["%s%s%s", "minAmountWithdraw", assetA, assetB], SEP)
28+
29+
30+func keyBalance (assetA,assetB,userAddress) = makeString(["%s%s%s%s", "balance", assetA, assetB, userAddress], SEP)
31+
32+
33+func keyTotalFeeCollectedDeposit (assetA,assetB) = makeString(["%s%s%s%s", "totalFeeCollected", "deposit", assetA, assetB], SEP)
34+
35+
36+func keyTotalFeeCollectedWithdraw (assetA,assetB) = makeString(["%s%s%s%s", "totalFeeCollected", "withdraw", assetA, assetB], SEP)
37+
38+
39+func keyProcessInProgress (userAddress,assetA,assetB,heightInKey) = makeString(["%s%s%s%s%s%d", "withdrawProcess", "inProgress", userAddress, assetA, assetB, toString(heightInKey)], SEP)
40+
41+
42+func keyProcessDone (userAddress,assetA,assetB,heightInKey) = makeString(["%s%s%s%s%s%d", "withdrawProcess", "done", userAddress, assetA, assetB, toString(heightInKey)], SEP)
43+
44+
45+func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
46+ case s: String =>
47+ fromBase58String(s)
48+ case _: Unit =>
49+ unit
50+ case _ =>
51+ throw("Match error")
52+}
53+
54+
55+func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
56+ case s: String =>
57+ fromBase58String(s)
58+ case _: Unit =>
59+ unit
60+ case _ =>
61+ throw("Match error")
62+}
63+
64+
65+func mustManager (i) = {
66+ let pd = throw("Permission denied.")
67+ match managerPublicKeyOrUnit() {
68+ case pk: ByteVector =>
69+ if ((i.callerPublicKey == pk))
70+ then true
71+ else pd
72+ case _: Unit =>
73+ if ((i.caller == this))
74+ then true
75+ else pd
76+ case _ =>
77+ throw("Match error")
78+ }
79+ }
80+
81+
82+func fmtErr (msg) = makeString(["otc_multiasset.ride:", msg], " ")
83+
84+
85+func throwErr (msg) = throw(fmtErr(msg))
86+
87+
88+@Callable(i)
89+func registerAsset (assetA,assetB,withdrawDelay,depositFee,withdrawFee,minAmountDeposit,minAmountWithdraw,pairStatus) = {
90+ let checkCaller = mustManager(i)
91+ if ((checkCaller == checkCaller))
92+ then {
93+ let withdrawDelayKey = keyWithdrawDelay(assetA, assetB)
94+ let depositFeePermilleKey = keyDepositFeePermille(assetA, assetB)
95+ let withdrawFeePermilleKey = keyWithdrawFeePermille(assetA, assetB)
96+ let minAmountDepositKey = keyMinAmountDeposit(assetA, assetB)
97+ let minAmountWithdrawKey = keyMinAmountWithdraw(assetA, assetB)
98+ let pairStatusKey = keyAssetsPairStatus(assetA, assetB)
99+[IntegerEntry(withdrawDelayKey, withdrawDelay), IntegerEntry(depositFeePermilleKey, depositFee), IntegerEntry(withdrawFeePermilleKey, withdrawFee), IntegerEntry(minAmountDepositKey, minAmountDeposit), IntegerEntry(minAmountWithdrawKey, minAmountWithdraw), IntegerEntry(pairStatusKey, pairStatus)]
100+ }
101+ else throw("Strict value is not equal to itself.")
102+ }
103+
104+
105+
106+@Callable(i)
107+func swapAssetsAToB (assetB) = {
108+ let payment = value(i.payments[0])
109+ let assetA = toBase58String(value(payment.assetId))
110+ let asset = fromBase58String(value(assetB))
111+ let userAddress = toString(i.caller)
112+ let minAmountDeposit = valueOrErrorMessage(getInteger(keyMinAmountDeposit(assetA, assetB)), fmtErr("This asset pair does not exist."))
113+ let toDeposit = payment.amount
114+ let depositFee = valueOrErrorMessage(getInteger(keyDepositFeePermille(assetA, assetB)), fmtErr("The deposit fee for this pair of assets is not set."))
115+ let fee = ((toDeposit / 1000) * depositFee)
116+ let currentUserBalance = valueOrElse(getInteger(keyBalance(assetA, assetB, userAddress)), 0)
117+ let totalCommissions = valueOrElse(getInteger(keyTotalFeeCollectedDeposit(assetA, assetB)), 0)
118+ let pairStatus = valueOrErrorMessage(getInteger(keyAssetsPairStatus(assetA, assetB)), fmtErr("The asset pair status for this pair of assets is not set."))
119+ let checkPairStatus = if ((pairStatus == 0))
120+ then true
121+ else throwErr("The couple's deposit is blocked.")
122+ if ((checkPairStatus == checkPairStatus))
123+ then {
124+ let checkPayment = if ((toDeposit >= minAmountDeposit))
125+ then true
126+ else throwErr("The deposit amount is less than the minimum.")
127+ if ((checkPayment == checkPayment))
128+ then {
129+ let newBalance = ((currentUserBalance + toDeposit) - fee)
130+ let checkBalance = if ((newBalance > 0))
131+ then true
132+ else throwErr("The final balance is less than or equal to 0.")
133+ if ((checkBalance == checkBalance))
134+ then [IntegerEntry(keyBalance(assetA, assetB, userAddress), newBalance), IntegerEntry(keyTotalFeeCollectedDeposit(assetA, assetB), (totalCommissions + fee)), ScriptTransfer(i.caller, (toDeposit - fee), asset)]
135+ else throw("Strict value is not equal to itself.")
136+ }
137+ else throw("Strict value is not equal to itself.")
138+ }
139+ else throw("Strict value is not equal to itself.")
140+ }
141+
142+
143+
144+@Callable(i)
145+func initializationSwapAssetsBToA (assetA) = {
146+ let payment = value(i.payments[0])
147+ let toWithdraw = payment.amount
148+ let assetB = toBase58String(value(payment.assetId))
149+ let userAddress = toString(i.caller)
150+ let minAmountWithdraw = valueOrErrorMessage(getInteger(keyMinAmountWithdraw(assetA, assetB)), fmtErr("The minimum withdrawal amount for this pair of assets is not set."))
151+ let assetLockHeight = (height + valueOrErrorMessage(getInteger(keyWithdrawDelay(assetA, assetB)), fmtErr("Withdrawal delay is not set for the specified pair.")))
152+ let currentUserBalance = valueOrErrorMessage(getInteger(keyBalance(assetA, assetB, userAddress)), fmtErr("This user balance does not exist."))
153+ let totalCommissions = valueOrElse(getInteger(keyTotalFeeCollectedWithdraw(assetA, assetB)), 0)
154+ let withdrawFeePermilleKey = keyWithdrawFeePermille(assetA, assetB)
155+ let withdrawFee = valueOrErrorMessage(getInteger(withdrawFeePermilleKey), fmtErr("The withdrawal fee for this pair of assets is not set."))
156+ let fee = ((toWithdraw / 1000) * withdrawFee)
157+ let newBalance = (currentUserBalance - toWithdraw)
158+ let checkBalance = if ((newBalance >= 0))
159+ then true
160+ else throwErr("Swap amount fail, amount is to small.")
161+ if ((checkBalance == checkBalance))
162+ then {
163+ let checkPayment = if ((toWithdraw >= minAmountWithdraw))
164+ then true
165+ else throwErr("The withdraw amount is less than the minimum.")
166+ if ((checkPayment == checkPayment))
167+ then {
168+ let checkProcessInProgress = if ((getInteger(keyProcessInProgress(userAddress, assetA, assetB, assetLockHeight)) == unit))
169+ then true
170+ else throwErr("At this height, there is already an exchange of this pair.")
171+ if ((checkProcessInProgress == checkProcessInProgress))
172+ then [IntegerEntry(keyBalance(assetA, assetB, userAddress), newBalance), IntegerEntry(keyProcessInProgress(userAddress, assetA, assetB, assetLockHeight), (toWithdraw - fee)), IntegerEntry(keyTotalFeeCollectedWithdraw(assetA, assetB), (totalCommissions + fee))]
173+ else throw("Strict value is not equal to itself.")
174+ }
175+ else throw("Strict value is not equal to itself.")
176+ }
177+ else throw("Strict value is not equal to itself.")
178+ }
179+
180+
181+
182+@Callable(i)
183+func withdrawAsset (assetA,assetB,heightInKey) = {
184+ let userAddress = toString(i.caller)
185+ let toWithdraw = valueOrErrorMessage(getInteger(keyProcessInProgress(userAddress, assetA, assetB, heightInKey)), fmtErr("At this height, withdraw was not initialized with this pair of assets."))
186+ let asset = fromBase58String(value(assetA))
187+ let checkHeight = if ((height >= heightInKey))
188+ then true
189+ else throwErr((("Withdrawal is possible after " + toString(heightInKey)) + " height or you have already withdrawn."))
190+ if ((checkHeight == checkHeight))
191+ then [DeleteEntry(keyProcessInProgress(userAddress, assetA, assetB, heightInKey)), IntegerEntry(keyProcessDone(userAddress, assetA, assetB, heightInKey), toWithdraw), ScriptTransfer(i.caller, toWithdraw, asset)]
192+ else throw("Strict value is not equal to itself.")
193+ }
194+
195+
196+
197+@Callable(i)
198+func withdrawFee (assetA,assetB) = {
199+ let checkCaller = mustManager(i)
200+ if ((checkCaller == checkCaller))
201+ then {
202+ let toWithdrawB = valueOrElse(getInteger(keyTotalFeeCollectedDeposit(assetA, assetB)), 0)
203+ let withdrawAssetB = fromBase58String(value(assetB))
204+ let toWithdrawA = valueOrElse(getInteger(keyTotalFeeCollectedWithdraw(assetA, assetB)), 0)
205+ let withdrawAssetA = fromBase58String(value(assetA))
206+[IntegerEntry(keyTotalFeeCollectedDeposit(assetA, assetB), 0), ScriptTransfer(i.caller, toWithdrawA, withdrawAssetA), IntegerEntry(keyTotalFeeCollectedWithdraw(assetA, assetB), 0), ScriptTransfer(i.caller, toWithdrawB, withdrawAssetB)]
207+ }
208+ else throw("Strict value is not equal to itself.")
209+ }
210+
211+
212+
213+@Callable(i)
214+func setManager (pendingManagerPublicKey) = {
215+ let checkCaller = mustManager(i)
216+ if ((checkCaller == checkCaller))
217+ then {
218+ let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
219+ if ((checkManagerPublicKey == checkManagerPublicKey))
220+ then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
221+ else throw("Strict value is not equal to itself.")
222+ }
223+ else throw("Strict value is not equal to itself.")
224+ }
225+
226+
227+
228+@Callable(i)
229+func confirmManager () = {
230+ let pm = pendingManagerPublicKeyOrUnit()
231+ let hasPM = if (isDefined(pm))
232+ then true
233+ else throwErr("No pending manager.")
234+ if ((hasPM == hasPM))
235+ then {
236+ let checkPM = if ((i.callerPublicKey == value(pm)))
237+ then true
238+ else throwErr("You are not pending manager.")
239+ if ((checkPM == checkPM))
240+ then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
241+ else throw("Strict value is not equal to itself.")
242+ }
243+ else throw("Strict value is not equal to itself.")
244+ }
245+
246+
247+@Verifier(tx)
248+func verify () = {
249+ let targetPublicKey = match managerPublicKeyOrUnit() {
250+ case pk: ByteVector =>
251+ pk
252+ case _: Unit =>
253+ tx.senderPublicKey
254+ case _ =>
255+ throw("Match error")
256+ }
257+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
258+ }
259+

github/deemru/w8io/3ef1775 
26.11 ms