tx · DGecdSHjdG1GaWE3gzw87i9fhzp2LrhjbqZdoSuECG7r

3MvXnAcEtL9x3i499UcvTQZPufrT5ZZUEd5:  -0.01400000 Waves

2022.09.19 11:05 [2235748] smart account 3MvXnAcEtL9x3i499UcvTQZPufrT5ZZUEd5 > SELF 0.00000000 Waves

{ "type": 13, "id": "DGecdSHjdG1GaWE3gzw87i9fhzp2LrhjbqZdoSuECG7r", "fee": 1400000, "feeAssetId": null, "timestamp": 1663574734928, "version": 1, "sender": "3MvXnAcEtL9x3i499UcvTQZPufrT5ZZUEd5", "senderPublicKey": "GSAhb4fdky75LiCZ4p4DDK4rmWpmsgGBg1ZVdtPfmRES", "proofs": [ "28GCage8E1MCRnc9DBxFTStgbczor57RTx3LQmwkacEP7RvpnCnqxLQpAhen9hgkKQSpSVNtLNUatnA9zDsV3gjs" ], "script": "base64:BgIsCAISCgoICAgBAQEBAQESAwoBCBIDCgEIEgUKAwgIARIECgIICBIDCgEIEgAUAANTRVACAl9fARNrZXlNYW5hZ2VyUHVibGljS2V5AAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5ARBrZXlXaXRoZHJhd0RlbGF5AgZhc3NldEEGYXNzZXRCCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICDXdpdGhkcmF3RGVsYXkJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgUDbmlsBQNTRVABFWtleURlcG9zaXRGZWVQZXJtaWxsZQIGYXNzZXRBBmFzc2V0QgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhJkZXBvc2l0RmVlUGVybWlsbGUJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgUDbmlsBQNTRVABFmtleVdpdGhkcmF3RmVlUGVybWlsbGUCBmFzc2V0QQZhc3NldEIJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgITd2l0aGRyYXdGZWVQZXJtaWxsZQkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCBQNuaWwFA1NFUAETa2V5TWluQW1vdW50RGVwb3NpdAIGYXNzZXRBBmFzc2V0QgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhBtaW5BbW91bnREZXBvc2l0CQDMCAIFBmFzc2V0QQkAzAgCBQZhc3NldEIFA25pbAUDU0VQARNrZXlBc3NldHNQYWlyU3RhdHVzAgZhc3NldEEGYXNzZXRCCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEGFzc2V0c1BhaXJTdGF0dXMJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgUDbmlsBQNTRVABFGtleU1pbkFtb3VudFdpdGhkcmF3AgZhc3NldEEGYXNzZXRCCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEW1pbkFtb3VudFdpdGhkcmF3CQDMCAIFBmFzc2V0QQkAzAgCBQZhc3NldEIFA25pbAUDU0VQAQprZXlCYWxhbmNlAwZhc3NldEEGYXNzZXRCC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIHYmFsYW5jZQkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEba2V5VG90YWxGZWVDb2xsZWN0ZWREZXBvc2l0AgZhc3NldEEGYXNzZXRCCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIRdG90YWxGZWVDb2xsZWN0ZWQJAMwIAgIHZGVwb3NpdAkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCBQNuaWwFA1NFUAEca2V5VG90YWxGZWVDb2xsZWN0ZWRXaXRoZHJhdwIGYXNzZXRBBmFzc2V0QgkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAICEXRvdGFsRmVlQ29sbGVjdGVkCQDMCAICCHdpdGhkcmF3CQDMCAIFBmFzc2V0QQkAzAgCBQZhc3NldEIFA25pbAUDU0VQARBrZXlBc3NldExvY2tUaW1lAwZhc3NldEEGYXNzZXRCC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgINYXNzZXRMb2NrVGltZQkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEUa2V5UHJvY2Vzc0luUHJvZ3Jlc3MEC3VzZXJBZGRyZXNzBmFzc2V0QQZhc3NldEILaGVpZ2h0SW5LZXkJALkJAgkAzAgCAgwlcyVzJXMlcyVzJWQJAMwIAgIPd2l0aGRyYXdQcm9jZXNzCQDMCAICCmluUHJvZ3Jlc3MJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgkAzAgCCQCkAwEFC2hlaWdodEluS2V5BQNuaWwFA1NFUAEOa2V5UHJvY2Vzc0RvbmUEC3VzZXJBZGRyZXNzBmFzc2V0QQZhc3NldEILaGVpZ2h0SW5LZXkJALkJAgkAzAgCAgwlcyVzJXMlcyVzJWQJAMwIAgIPd2l0aGRyYXdQcm9jZXNzCQDMCAICBGRvbmUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgkAzAgCCQCkAwEFC2hlaWdodEluS2V5BQNuaWwFA1NFUAEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQttdXN0TWFuYWdlcgEBaQQCcGQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsGBQJwZAMJAAECBQckbWF0Y2gwAgRVbml0AwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFAnBkCQACAQILTWF0Y2ggZXJyb3IBBmZtdEVycgEDbXNnCQC5CQIJAMwIAgIUb3RjX211bHRpYXNzZXQucmlkZToJAMwIAgUDbXNnBQNuaWwCASABCHRocm93RXJyAQNtc2cJAAIBCQEGZm10RXJyAQUDbXNnBwFpAQ1yZWdpc3RlckFzc2V0CAZhc3NldEEGYXNzZXRCDXdpdGhkcmF3RGVsYXkKZGVwb3NpdEZlZQt3aXRoZHJhd0ZlZRBtaW5BbW91bnREZXBvc2l0EW1pbkFtb3VudFdpdGhkcmF3CnBhaXJTdGF0dXMEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQQd2l0aGRyYXdEZWxheUtleQkBEGtleVdpdGhkcmF3RGVsYXkCBQZhc3NldEEFBmFzc2V0QgQVZGVwb3NpdEZlZVBlcm1pbGxlS2V5CQEVa2V5RGVwb3NpdEZlZVBlcm1pbGxlAgUGYXNzZXRBBQZhc3NldEIEFndpdGhkcmF3RmVlUGVybWlsbGVLZXkJARZrZXlXaXRoZHJhd0ZlZVBlcm1pbGxlAgUGYXNzZXRBBQZhc3NldEIEE21pbkFtb3VudERlcG9zaXRLZXkJARNrZXlNaW5BbW91bnREZXBvc2l0AgUGYXNzZXRBBQZhc3NldEIEFG1pbkFtb3VudFdpdGhkcmF3S2V5CQEUa2V5TWluQW1vdW50V2l0aGRyYXcCBQZhc3NldEEFBmFzc2V0QgQNcGFpclN0YXR1c0tleQkBE2tleUFzc2V0c1BhaXJTdGF0dXMCBQZhc3NldEEFBmFzc2V0QgkAzAgCCQEMSW50ZWdlckVudHJ5AgUQd2l0aGRyYXdEZWxheUtleQUNd2l0aGRyYXdEZWxheQkAzAgCCQEMSW50ZWdlckVudHJ5AgUVZGVwb3NpdEZlZVBlcm1pbGxlS2V5BQpkZXBvc2l0RmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZ3aXRoZHJhd0ZlZVBlcm1pbGxlS2V5BQt3aXRoZHJhd0ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUTbWluQW1vdW50RGVwb3NpdEtleQUQbWluQW1vdW50RGVwb3NpdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUbWluQW1vdW50V2l0aGRyYXdLZXkFEW1pbkFtb3VudFdpdGhkcmF3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1wYWlyU3RhdHVzS2V5BQpwYWlyU3RhdHVzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOc3dhcEFzc2V0c0FUb0IBBmFzc2V0QgQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAZhc3NldEEJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQFYXNzZXQJANkEAQkBBXZhbHVlAQUGYXNzZXRCBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEEG1pbkFtb3VudERlcG9zaXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQETa2V5TWluQW1vdW50RGVwb3NpdAIFBmFzc2V0QQUGYXNzZXRCCQEGZm10RXJyAQIfVGhpcyBhc3NldCBwYWlyIGRvZXMgbm90IGV4aXN0LgQJdG9EZXBvc2l0CAUHcGF5bWVudAZhbW91bnQECmRlcG9zaXRGZWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQEVa2V5RGVwb3NpdEZlZVBlcm1pbGxlAgUGYXNzZXRBBQZhc3NldEIJAQZmbXRFcnIBAjNUaGUgZGVwb3NpdCBmZWUgZm9yIHRoaXMgcGFpciBvZiBhc3NldHMgaXMgbm90IHNldC4EA2ZlZQkAaAIJAGkCBQl0b0RlcG9zaXQA6AcFCmRlcG9zaXRGZWUEEmN1cnJlbnRVc2VyQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEKa2V5QmFsYW5jZQMFBmFzc2V0QQUGYXNzZXRCBQt1c2VyQWRkcmVzcwAABBB0b3RhbENvbW1pc3Npb25zCQELdmFsdWVPckVsc2UCCQCfCAEJARtrZXlUb3RhbEZlZUNvbGxlY3RlZERlcG9zaXQCBQZhc3NldEEFBmFzc2V0QgAABAlwYWlyU3RhdXMJAQV2YWx1ZQEJAJ8IAQkBE2tleUFzc2V0c1BhaXJTdGF0dXMCBQZhc3NldEEFBmFzc2V0QgQPY2hlY2tQYWlyU3RhdHVzAwkAAAIFCXBhaXJTdGF1cwAABgkBCHRocm93RXJyAQIgVGhlIGNvdXBsZSdzIGRlcG9zaXQgaXMgYmxvY2tlZC4DCQAAAgUPY2hlY2tQYWlyU3RhdHVzBQ9jaGVja1BhaXJTdGF0dXMEDGNoZWNrUGF5bWVudAMJAGcCBQl0b0RlcG9zaXQFEG1pbkFtb3VudERlcG9zaXQGCQEIdGhyb3dFcnIBAixUaGUgZGVwb3NpdCBhbW91bnQgaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtLgMJAAACBQxjaGVja1BheW1lbnQFDGNoZWNrUGF5bWVudAQKbmV3QmFsYW5jZQkAZQIJAGQCBRJjdXJyZW50VXNlckJhbGFuY2UFCXRvRGVwb3NpdAUDZmVlBAxjaGVja0JhbGFuY2UDCQBmAgUKbmV3QmFsYW5jZQAABgkBCHRocm93RXJyAQItVGhlIGZpbmFsIGJhbGFuY2UgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDAuAwkAAAIFDGNoZWNrQmFsYW5jZQUMY2hlY2tCYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5QmFsYW5jZQMFBmFzc2V0QQUGYXNzZXRCBQt1c2VyQWRkcmVzcwUKbmV3QmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBG2tleVRvdGFsRmVlQ29sbGVjdGVkRGVwb3NpdAIFBmFzc2V0QQUGYXNzZXRCCQBkAgUQdG90YWxDb21taXNzaW9ucwUDZmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFCXRvRGVwb3NpdAUDZmVlBQVhc3NldAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHGluaXRpYWxpemF0aW9uU3dhcEFzc2V0c0JUb0EBBmFzc2V0QQQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAp0b1dpdGhkcmF3CAUHcGF5bWVudAZhbW91bnQEBmFzc2V0QgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEEW1pbkFtb3VudFdpdGhkcmF3CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBFGtleU1pbkFtb3VudFdpdGhkcmF3AgUGYXNzZXRBBQZhc3NldEIJAQZmbXRFcnIBAkFUaGUgbWluaW11bSB3aXRoZHJhd2FsIGFtb3VudCBmb3IgdGhpcyBwYWlyIG9mIGFzc2V0cyBpcyBub3Qgc2V0LgQPYXNzZXRMb2NrSGVpZ2h0CQBkAgUGaGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBEGtleVdpdGhkcmF3RGVsYXkCBQZhc3NldEEFBmFzc2V0QgkBBmZtdEVycgECM1dpdGhkcmF3YWwgZGVsYXkgaXMgbm90IHNldCBmb3IgdGhlIHNwZWNpZmllZCBwYWlyLgQSY3VycmVudFVzZXJCYWxhbmNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBCmtleUJhbGFuY2UDBQZhc3NldEEFBmFzc2V0QgULdXNlckFkZHJlc3MJAQZmbXRFcnIBAiFUaGlzIHVzZXIgYmFsYW5jZSBkb2VzIG5vdCBleGlzdC4EEHRvdGFsQ29tbWlzc2lvbnMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBG2tleVRvdGFsRmVlQ29sbGVjdGVkRGVwb3NpdAIFBmFzc2V0QQUGYXNzZXRCAAAEFndpdGhkcmF3RmVlUGVybWlsbGVLZXkJARZrZXlXaXRoZHJhd0ZlZVBlcm1pbGxlAgUGYXNzZXRBBQZhc3NldEIEC3dpdGhkcmF3RmVlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUWd2l0aGRyYXdGZWVQZXJtaWxsZUtleQkBBmZtdEVycgECNlRoZSB3aXRoZHJhd2FsIGZlZSBmb3IgdGhpcyBwYWlyIG9mIGFzc2V0cyBpcyBub3Qgc2V0LgQDZmVlCQBoAgkAaQIFCnRvV2l0aGRyYXcA6AcFC3dpdGhkcmF3RmVlBApuZXdCYWxhbmNlCQBlAgUSY3VycmVudFVzZXJCYWxhbmNlBQp0b1dpdGhkcmF3BAxjaGVja0JhbGFuY2UDCQBnAgUKbmV3QmFsYW5jZQAABgkBCHRocm93RXJyAQIlU3dhcCBhbW91bnQgZmFpbCwgYW1vdW50IGlzIHRvIHNtYWxsLgMJAAACBQxjaGVja0JhbGFuY2UFDGNoZWNrQmFsYW5jZQQMY2hlY2tQYXltZW50AwkAZwIFCnRvV2l0aGRyYXcFEW1pbkFtb3VudFdpdGhkcmF3BgkBCHRocm93RXJyAQItVGhlIHdpdGhkcmF3IGFtb3VudCBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0uAwkAAAIFDGNoZWNrUGF5bWVudAUMY2hlY2tQYXltZW50BBRjaGVja0Fzc2V0TG9ja0hlaWdodAMJAQIhPQIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEGtleUFzc2V0TG9ja1RpbWUDBQZhc3NldEEFBmFzc2V0QgULdXNlckFkZHJlc3MAAAUPYXNzZXRMb2NrSGVpZ2h0BgkBCHRocm93RXJyAQI6QXQgdGhpcyBoZWlnaHQsIHRoZXJlIGlzIGFscmVhZHkgYW4gZXhjaGFuZ2Ugb2YgdGhpcyBwYWlyLgMJAAACBRRjaGVja0Fzc2V0TG9ja0hlaWdodAUUY2hlY2tBc3NldExvY2tIZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlBc3NldExvY2tUaW1lAwUGYXNzZXRBBQZhc3NldEIFC3VzZXJBZGRyZXNzBQ9hc3NldExvY2tIZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlCYWxhbmNlAwUGYXNzZXRBBQZhc3NldEIFC3VzZXJBZGRyZXNzBQpuZXdCYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5UHJvY2Vzc0luUHJvZ3Jlc3MEBQt1c2VyQWRkcmVzcwUGYXNzZXRBBQZhc3NldEIFD2Fzc2V0TG9ja0hlaWdodAkAZQIFCnRvV2l0aGRyYXcFA2ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHGtleVRvdGFsRmVlQ29sbGVjdGVkV2l0aGRyYXcCBQZhc3NldEEFBmFzc2V0QgkAZAIFEHRvdGFsQ29tbWlzc2lvbnMFA2ZlZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXdpdGhkcmF3QXNzZXQDBmFzc2V0QQZhc3NldEILaGVpZ2h0SW5LZXkEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQPYXNzZXRMb2NrSGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBEGtleUFzc2V0TG9ja1RpbWUDBQZhc3NldEEFBmFzc2V0QgULdXNlckFkZHJlc3MJAQZmbXRFcnIBAjFBbiBhc3NldCBwYWlyIG9yIGhlaWdodCBpcyBzcGVjaWZpZWQgaW5jb3JyZWN0bHkuBAp0b1dpdGhkcmF3CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBFGtleVByb2Nlc3NJblByb2dyZXNzBAULdXNlckFkZHJlc3MFBmFzc2V0QQUGYXNzZXRCBQtoZWlnaHRJbktleQkBBmZtdEVycgECRkF0IHRoaXMgaGVpZ2h0LCB3aXRoZHJhdyB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdGhpcyBwYWlyIG9mIGFzc2V0cy4EBWFzc2V0CQDZBAEJAQV2YWx1ZQEFBmFzc2V0QQQLY2hlY2tIZWlnaHQDCQBnAgUGaGVpZ2h0BQ9hc3NldExvY2tIZWlnaHQGCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIdV2l0aGRyYXdhbCBpcyBwb3NzaWJsZSBhZnRlciAJAKQDAQULaGVpZ2h0SW5LZXkCJiBoZWlnaHQgb3IgeW91IGhhdmUgYWxyZWFkeSB3aXRoZHJhd24uAwkAAAIFC2NoZWNrSGVpZ2h0BQtjaGVja0hlaWdodAkAzAgCCQELRGVsZXRlRW50cnkBCQEUa2V5UHJvY2Vzc0luUHJvZ3Jlc3MEBQt1c2VyQWRkcmVzcwUGYXNzZXRBBQZhc3NldEIFC2hlaWdodEluS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa2V5UHJvY2Vzc0RvbmUEBQt1c2VyQWRkcmVzcwUGYXNzZXRBBQZhc3NldEIFC2hlaWdodEluS2V5BQp0b1dpdGhkcmF3CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKdG9XaXRoZHJhdwUFYXNzZXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt3aXRoZHJhd0ZlZQIGYXNzZXRBBmFzc2V0QgQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt0b1dpdGhkcmF3QQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEba2V5VG90YWxGZWVDb2xsZWN0ZWREZXBvc2l0AgUGYXNzZXRBBQZhc3NldEIAAAQOd2l0aGRyYXdBc3NldEEJANkEAQkBBXZhbHVlAQUGYXNzZXRBBAt0b1dpdGhkcmF3QgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEca2V5VG90YWxGZWVDb2xsZWN0ZWRXaXRoZHJhdwIFBmFzc2V0QQUGYXNzZXRCAAAEDndpdGhkcmF3QXNzZXRCCQDZBAEJAQV2YWx1ZQEFBmFzc2V0QgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBG2tleVRvdGFsRmVlQ29sbGVjdGVkRGVwb3NpdAIFBmFzc2V0QQUGYXNzZXRCAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQt0b1dpdGhkcmF3QQUOd2l0aGRyYXdBc3NldEEJAMwIAgkBDEludGVnZXJFbnRyeQIJARxrZXlUb3RhbEZlZUNvbGxlY3RlZFdpdGhkcmF3AgUGYXNzZXRBBQZhc3NldEIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC3RvV2l0aGRyYXdCBQ53aXRoZHJhd0Fzc2V0QgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnNldE1hbmFnZXIBF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEFWNoZWNrTWFuYWdlclB1YmxpY0tleQkA2QQBBRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQMJAAACBRVjaGVja01hbmFnZXJQdWJsaWNLZXkFFWNoZWNrTWFuYWdlclB1YmxpY0tleQkAzAgCCQELU3RyaW5nRW50cnkCCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNvbmZpcm1NYW5hZ2VyAAQCcG0JAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEBWhhc1BNAwkBCWlzRGVmaW5lZAEFAnBtBgkBCHRocm93RXJyAQISbm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkBCHRocm93RXJyAQIbeW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFB2NoZWNrUE0FB2NoZWNrUE0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2tleU1hbmFnZXJQdWJsaWNLZXkACQDYBAEJAQV2YWx1ZQEFAnBtCQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleeq8j/E=", "chainId": 84, "height": 2235748, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7bXPjVxo5UJkRzws11vR8Bc4rQNnx6Emo7JLHGRmnUK3 Next: 663UfavYENmNrk38YSPcYHgJ7qctRZJYztRuhWYN2b1N Diff:
OldNewDifferences
192192 then true
193193 else throwErr((("Withdrawal is possible after " + toString(heightInKey)) + " height or you have already withdrawn."))
194194 if ((checkHeight == checkHeight))
195- then [DeleteEntry(keyProcessInProgress(userAddress, assetA, assetB, heightInKey)), IntegerEntry(keyProcessDone(userAddress, assetA, assetB, heightInKey), toWithdraw), IntegerEntry(keyBalance(assetA, assetB, userAddress), toWithdraw), ScriptTransfer(i.caller, toWithdraw, asset)]
195+ then [DeleteEntry(keyProcessInProgress(userAddress, assetA, assetB, heightInKey)), IntegerEntry(keyProcessDone(userAddress, assetA, assetB, heightInKey), toWithdraw), ScriptTransfer(i.caller, toWithdraw, asset)]
196196 else throw("Strict value is not equal to itself.")
197197 }
198198
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 func keyManagerPublicKey () = "%s__managerPublicKey"
77
88
99 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
1010
1111
1212 func keyWithdrawDelay (assetA,assetB) = makeString(["%s%s%s", "withdrawDelay", assetA, assetB], SEP)
1313
1414
1515 func keyDepositFeePermille (assetA,assetB) = makeString(["%s%s%s", "depositFeePermille", assetA, assetB], SEP)
1616
1717
1818 func keyWithdrawFeePermille (assetA,assetB) = makeString(["%s%s%s", "withdrawFeePermille", assetA, assetB], SEP)
1919
2020
2121 func keyMinAmountDeposit (assetA,assetB) = makeString(["%s%s%s", "minAmountDeposit", assetA, assetB], SEP)
2222
2323
2424 func keyAssetsPairStatus (assetA,assetB) = makeString(["%s%s%s", "assetsPairStatus", assetA, assetB], SEP)
2525
2626
2727 func keyMinAmountWithdraw (assetA,assetB) = makeString(["%s%s%s", "minAmountWithdraw", assetA, assetB], SEP)
2828
2929
3030 func keyBalance (assetA,assetB,userAddress) = makeString(["%s%s%s%s", "balance", assetA, assetB, userAddress], SEP)
3131
3232
3333 func keyTotalFeeCollectedDeposit (assetA,assetB) = makeString(["%s%s%s%s", "totalFeeCollected", "deposit", assetA, assetB], SEP)
3434
3535
3636 func keyTotalFeeCollectedWithdraw (assetA,assetB) = makeString(["%s%s%s%s", "totalFeeCollected", "withdraw", assetA, assetB], SEP)
3737
3838
3939 func keyAssetLockTime (assetA,assetB,userAddress) = makeString(["%s%s%s%s", "assetLockTime", assetA, assetB, userAddress], SEP)
4040
4141
4242 func keyProcessInProgress (userAddress,assetA,assetB,heightInKey) = makeString(["%s%s%s%s%s%d", "withdrawProcess", "inProgress", userAddress, assetA, assetB, toString(heightInKey)], SEP)
4343
4444
4545 func keyProcessDone (userAddress,assetA,assetB,heightInKey) = makeString(["%s%s%s%s%s%d", "withdrawProcess", "done", userAddress, assetA, assetB, toString(heightInKey)], SEP)
4646
4747
4848 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
4949 case s: String =>
5050 fromBase58String(s)
5151 case _: Unit =>
5252 unit
5353 case _ =>
5454 throw("Match error")
5555 }
5656
5757
5858 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
5959 case s: String =>
6060 fromBase58String(s)
6161 case _: Unit =>
6262 unit
6363 case _ =>
6464 throw("Match error")
6565 }
6666
6767
6868 func mustManager (i) = {
6969 let pd = throw("Permission denied")
7070 match managerPublicKeyOrUnit() {
7171 case pk: ByteVector =>
7272 if ((i.callerPublicKey == pk))
7373 then true
7474 else pd
7575 case _: Unit =>
7676 if ((i.caller == this))
7777 then true
7878 else pd
7979 case _ =>
8080 throw("Match error")
8181 }
8282 }
8383
8484
8585 func fmtErr (msg) = makeString(["otc_multiasset.ride:", msg], " ")
8686
8787
8888 func throwErr (msg) = throw(fmtErr(msg))
8989
9090
9191 @Callable(i)
9292 func registerAsset (assetA,assetB,withdrawDelay,depositFee,withdrawFee,minAmountDeposit,minAmountWithdraw,pairStatus) = {
9393 let checkCaller = mustManager(i)
9494 if ((checkCaller == checkCaller))
9595 then {
9696 let withdrawDelayKey = keyWithdrawDelay(assetA, assetB)
9797 let depositFeePermilleKey = keyDepositFeePermille(assetA, assetB)
9898 let withdrawFeePermilleKey = keyWithdrawFeePermille(assetA, assetB)
9999 let minAmountDepositKey = keyMinAmountDeposit(assetA, assetB)
100100 let minAmountWithdrawKey = keyMinAmountWithdraw(assetA, assetB)
101101 let pairStatusKey = keyAssetsPairStatus(assetA, assetB)
102102 [IntegerEntry(withdrawDelayKey, withdrawDelay), IntegerEntry(depositFeePermilleKey, depositFee), IntegerEntry(withdrawFeePermilleKey, withdrawFee), IntegerEntry(minAmountDepositKey, minAmountDeposit), IntegerEntry(minAmountWithdrawKey, minAmountWithdraw), IntegerEntry(pairStatusKey, pairStatus)]
103103 }
104104 else throw("Strict value is not equal to itself.")
105105 }
106106
107107
108108
109109 @Callable(i)
110110 func swapAssetsAToB (assetB) = {
111111 let payment = value(i.payments[0])
112112 let assetA = toBase58String(value(payment.assetId))
113113 let asset = fromBase58String(value(assetB))
114114 let userAddress = toString(i.caller)
115115 let minAmountDeposit = valueOrErrorMessage(getInteger(keyMinAmountDeposit(assetA, assetB)), fmtErr("This asset pair does not exist."))
116116 let toDeposit = payment.amount
117117 let depositFee = valueOrErrorMessage(getInteger(keyDepositFeePermille(assetA, assetB)), fmtErr("The deposit fee for this pair of assets is not set."))
118118 let fee = ((toDeposit / 1000) * depositFee)
119119 let currentUserBalance = valueOrElse(getInteger(keyBalance(assetA, assetB, userAddress)), 0)
120120 let totalCommissions = valueOrElse(getInteger(keyTotalFeeCollectedDeposit(assetA, assetB)), 0)
121121 let pairStaus = value(getInteger(keyAssetsPairStatus(assetA, assetB)))
122122 let checkPairStatus = if ((pairStaus == 0))
123123 then true
124124 else throwErr("The couple's deposit is blocked.")
125125 if ((checkPairStatus == checkPairStatus))
126126 then {
127127 let checkPayment = if ((toDeposit >= minAmountDeposit))
128128 then true
129129 else throwErr("The deposit amount is less than the minimum.")
130130 if ((checkPayment == checkPayment))
131131 then {
132132 let newBalance = ((currentUserBalance + toDeposit) - fee)
133133 let checkBalance = if ((newBalance > 0))
134134 then true
135135 else throwErr("The final balance is less than or equal to 0.")
136136 if ((checkBalance == checkBalance))
137137 then [IntegerEntry(keyBalance(assetA, assetB, userAddress), newBalance), IntegerEntry(keyTotalFeeCollectedDeposit(assetA, assetB), (totalCommissions + fee)), ScriptTransfer(i.caller, (toDeposit - fee), asset)]
138138 else throw("Strict value is not equal to itself.")
139139 }
140140 else throw("Strict value is not equal to itself.")
141141 }
142142 else throw("Strict value is not equal to itself.")
143143 }
144144
145145
146146
147147 @Callable(i)
148148 func initializationSwapAssetsBToA (assetA) = {
149149 let payment = value(i.payments[0])
150150 let toWithdraw = payment.amount
151151 let assetB = toBase58String(value(payment.assetId))
152152 let userAddress = toString(i.caller)
153153 let minAmountWithdraw = valueOrErrorMessage(getInteger(keyMinAmountWithdraw(assetA, assetB)), fmtErr("The minimum withdrawal amount for this pair of assets is not set."))
154154 let assetLockHeight = (height + valueOrErrorMessage(getInteger(keyWithdrawDelay(assetA, assetB)), fmtErr("Withdrawal delay is not set for the specified pair.")))
155155 let currentUserBalance = valueOrErrorMessage(getInteger(keyBalance(assetA, assetB, userAddress)), fmtErr("This user balance does not exist."))
156156 let totalCommissions = valueOrElse(getInteger(keyTotalFeeCollectedDeposit(assetA, assetB)), 0)
157157 let withdrawFeePermilleKey = keyWithdrawFeePermille(assetA, assetB)
158158 let withdrawFee = valueOrErrorMessage(getInteger(withdrawFeePermilleKey), fmtErr("The withdrawal fee for this pair of assets is not set."))
159159 let fee = ((toWithdraw / 1000) * withdrawFee)
160160 let newBalance = (currentUserBalance - toWithdraw)
161161 let checkBalance = if ((newBalance >= 0))
162162 then true
163163 else throwErr("Swap amount fail, amount is to small.")
164164 if ((checkBalance == checkBalance))
165165 then {
166166 let checkPayment = if ((toWithdraw >= minAmountWithdraw))
167167 then true
168168 else throwErr("The withdraw amount is less than the minimum.")
169169 if ((checkPayment == checkPayment))
170170 then {
171171 let checkAssetLockHeight = if ((valueOrElse(getInteger(keyAssetLockTime(assetA, assetB, userAddress)), 0) != assetLockHeight))
172172 then true
173173 else throwErr("At this height, there is already an exchange of this pair.")
174174 if ((checkAssetLockHeight == checkAssetLockHeight))
175175 then [IntegerEntry(keyAssetLockTime(assetA, assetB, userAddress), assetLockHeight), IntegerEntry(keyBalance(assetA, assetB, userAddress), newBalance), IntegerEntry(keyProcessInProgress(userAddress, assetA, assetB, assetLockHeight), (toWithdraw - fee)), IntegerEntry(keyTotalFeeCollectedWithdraw(assetA, assetB), (totalCommissions + fee))]
176176 else throw("Strict value is not equal to itself.")
177177 }
178178 else throw("Strict value is not equal to itself.")
179179 }
180180 else throw("Strict value is not equal to itself.")
181181 }
182182
183183
184184
185185 @Callable(i)
186186 func withdrawAsset (assetA,assetB,heightInKey) = {
187187 let userAddress = toString(i.caller)
188188 let assetLockHeight = valueOrErrorMessage(getInteger(keyAssetLockTime(assetA, assetB, userAddress)), fmtErr("An asset pair or height is specified incorrectly."))
189189 let toWithdraw = valueOrErrorMessage(getInteger(keyProcessInProgress(userAddress, assetA, assetB, heightInKey)), fmtErr("At this height, withdraw was not initialized with this pair of assets."))
190190 let asset = fromBase58String(value(assetA))
191191 let checkHeight = if ((height >= assetLockHeight))
192192 then true
193193 else throwErr((("Withdrawal is possible after " + toString(heightInKey)) + " height or you have already withdrawn."))
194194 if ((checkHeight == checkHeight))
195- then [DeleteEntry(keyProcessInProgress(userAddress, assetA, assetB, heightInKey)), IntegerEntry(keyProcessDone(userAddress, assetA, assetB, heightInKey), toWithdraw), IntegerEntry(keyBalance(assetA, assetB, userAddress), toWithdraw), ScriptTransfer(i.caller, toWithdraw, asset)]
195+ then [DeleteEntry(keyProcessInProgress(userAddress, assetA, assetB, heightInKey)), IntegerEntry(keyProcessDone(userAddress, assetA, assetB, heightInKey), toWithdraw), ScriptTransfer(i.caller, toWithdraw, asset)]
196196 else throw("Strict value is not equal to itself.")
197197 }
198198
199199
200200
201201 @Callable(i)
202202 func withdrawFee (assetA,assetB) = {
203203 let checkCaller = mustManager(i)
204204 if ((checkCaller == checkCaller))
205205 then {
206206 let toWithdrawA = valueOrElse(getInteger(keyTotalFeeCollectedDeposit(assetA, assetB)), 0)
207207 let withdrawAssetA = fromBase58String(value(assetA))
208208 let toWithdrawB = valueOrElse(getInteger(keyTotalFeeCollectedWithdraw(assetA, assetB)), 0)
209209 let withdrawAssetB = fromBase58String(value(assetB))
210210 [IntegerEntry(keyTotalFeeCollectedDeposit(assetA, assetB), 0), ScriptTransfer(i.caller, toWithdrawA, withdrawAssetA), IntegerEntry(keyTotalFeeCollectedWithdraw(assetA, assetB), 0), ScriptTransfer(i.caller, toWithdrawB, withdrawAssetB)]
211211 }
212212 else throw("Strict value is not equal to itself.")
213213 }
214214
215215
216216
217217 @Callable(i)
218218 func setManager (pendingManagerPublicKey) = {
219219 let checkCaller = mustManager(i)
220220 if ((checkCaller == checkCaller))
221221 then {
222222 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
223223 if ((checkManagerPublicKey == checkManagerPublicKey))
224224 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
225225 else throw("Strict value is not equal to itself.")
226226 }
227227 else throw("Strict value is not equal to itself.")
228228 }
229229
230230
231231
232232 @Callable(i)
233233 func confirmManager () = {
234234 let pm = pendingManagerPublicKeyOrUnit()
235235 let hasPM = if (isDefined(pm))
236236 then true
237237 else throwErr("no pending manager")
238238 if ((hasPM == hasPM))
239239 then {
240240 let checkPM = if ((i.callerPublicKey == value(pm)))
241241 then true
242242 else throwErr("you are not pending manager")
243243 if ((checkPM == checkPM))
244244 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
245245 else throw("Strict value is not equal to itself.")
246246 }
247247 else throw("Strict value is not equal to itself.")
248248 }
249249
250250
251251 @Verifier(tx)
252252 func verify () = {
253253 let targetPublicKey = match managerPublicKeyOrUnit() {
254254 case pk: ByteVector =>
255255 pk
256256 case _: Unit =>
257257 tx.senderPublicKey
258258 case _ =>
259259 throw("Match error")
260260 }
261261 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
262262 }
263263

github/deemru/w8io/873ac7e 
38.40 ms