tx · CtTHQp6sU4V41BKz7F6wTwNPUnRDPqMu21ybf9aumc6o

3MuS6qVvhBR6wSynFRdcE3fVqmGBjoc7Hhx:  -0.01300000 Waves

2023.07.06 12:28 [2653865] smart account 3MuS6qVvhBR6wSynFRdcE3fVqmGBjoc7Hhx > SELF 0.00000000 Waves

{ "type": 13, "id": "CtTHQp6sU4V41BKz7F6wTwNPUnRDPqMu21ybf9aumc6o", "fee": 1300000, "feeAssetId": null, "timestamp": 1688635827955, "version": 1, "sender": "3MuS6qVvhBR6wSynFRdcE3fVqmGBjoc7Hhx", "senderPublicKey": "62CHk4MqTdq3LqeUycy7TPnpvwrjgerSa2FqAY2EafXn", "proofs": [ "4vwHsyqgyhbtmMujgRtoDZeLTJ7YwA7KUhbUFa529fByT4G85qoifwQL3BhYEUyLNcAcGRC9UQsCb6pXSLPeACpQ" ], "script": "base64:BwJhCAISBAoCCAgSBAoCCAESBAoCCAQSBAoCCAISAwoBCBIDCgEBEgMKAQESBQoDAgECEgQKAgIBEgQKAgIBEgUKAwEBARIFCgMBAQESABIDCgEIEgASABIDCgEIEgASAwoBCC8AA1NFUAICX18AEGNvbnRyYWN0RmlsZW5hbWUCDGZhY3RvcnkucmlkZQEHd3JhcEVycgEBcwkArAICCQCsAgIFEGNvbnRyYWN0RmlsZW5hbWUCAjogBQFzAQh0aHJvd0VycgEBcwkAAgEJAQd3cmFwRXJyAQUBcwAPQURNSU5fTElTVF9TSVpFAAUABlFVT1JVTQADABFUWElEX0JZVEVTX0xFTkdUSAAgARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIJYWxsb3dUeElkCQDMCAIFBHR4SWQFA25pbAUDU0VQARBrZXlGdWxsQWRtaW5Wb3RlAgZwcmVmaXgMYWRtaW5BZGRyZXNzCQC5CQIJAMwIAgUGcHJlZml4CQDMCAIFDGFkbWluQWRkcmVzcwUDbmlsBQNTRVABE2tleUFkbWluQWRkcmVzc0xpc3QACQC5CQIJAMwIAgICJXMJAMwIAgIQYWRtaW5BZGRyZXNzTGlzdAUDbmlsBQNTRVABDmtleUFsbG93ZWRUeElkAAkAuQkCCQDMCAICAiVzCQDMCAICBHR4SWQFA25pbAUDU0VQAQxnZXRBZG1pblZvdGUCBnByZWZpeAVhZG1pbgQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFBWFkbWluCQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAENZ2V0QWRtaW5zTGlzdAAEByRtYXRjaDAJAJ0IAgUEdGhpcwkBE2tleUFkbWluQWRkcmVzc0xpc3QAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkAtQkCBQFzBQNTRVAFA25pbAENaXNJbkFkbWluTGlzdAEHYWRkcmVzcwkBD2NvbnRhaW5zRWxlbWVudAIJAQ1nZXRBZG1pbnNMaXN0AAUHYWRkcmVzcwESZ2VuVm90ZXNLZXlzSGVscGVyAgFhDGFkbWluQWRkcmVzcwQLJHQwMTI2MjEyODYFAWEEBnJlc3VsdAgFCyR0MDEyNjIxMjg2Al8xBAZwcmVmaXgIBQskdDAxMjYyMTI4NgJfMgkAlAoCCQDNCAIFBnJlc3VsdAkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFDGFkbWluQWRkcmVzcwUGcHJlZml4AQxnZW5Wb3Rlc0tleXMBCWtleVByZWZpeAQJYWRtaW5MaXN0CQETa2V5QWRtaW5BZGRyZXNzTGlzdAAECyR0MDE0MzMxNTE3CgACJGwJAQ1nZXRBZG1pbnNMaXN0AAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQlrZXlQcmVmaXgKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEmdlblZvdGVzS2V5c0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEBnJlc3VsdAgFCyR0MDE0MzMxNTE3Al8xBAZwcmVmaXgIBQskdDAxNDMzMTUxNwJfMgUGcmVzdWx0ARBjb3VudFZvdGVzSGVscGVyAgZyZXN1bHQHdm90ZUtleQkAZAIFBnJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABCmNvdW50Vm90ZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNvdW50Vm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFARBjbGVhclZvdGVzSGVscGVyAgZyZXN1bHQDa2V5CQDNCAIFBnJlc3VsdAkBC0RlbGV0ZUVudHJ5AQUDa2V5ARNnZXRDbGVhclZvdGVFbnRyaWVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjbGVhclZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEMdm90ZUlOVEVSTkFMBBNjYWxsZXJBZGRyZXNzU3RyaW5nCWtleVByZWZpeAhtaW5Wb3Rlcwp2b3RlUmVzdWx0BAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQQYWRtaW5DdXJyZW50Vm90ZQkBDGdldEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQDZXJyAwkBASEBCQENaXNJbkFkbWluTGlzdAEFE2NhbGxlckFkZHJlc3NTdHJpbmcJAQh0aHJvd0VycgEJAKwCAgkArAICAglBZGRyZXNzOiAFE2NhbGxlckFkZHJlc3NTdHJpbmcCEiBub3QgaW4gQWRtaW4gbGlzdAMJAAACBRBhZG1pbkN1cnJlbnRWb3RlAAEJAQh0aHJvd0VycgEJAKwCAgUHdm90ZUtleQISIHlvdSBhbHJlYWR5IHZvdGVkBQR1bml0AwkAAAIFA2VycgUDZXJyBAV2b3RlcwkBCmNvdW50Vm90ZXMBBQlrZXlQcmVmaXgDCQBnAgkAZAIFBXZvdGVzAAEFCG1pblZvdGVzBBBjbGVhclZvdGVFbnRyaWVzCQETZ2V0Q2xlYXJWb3RlRW50cmllcwEFCWtleVByZWZpeAkAzggCBRBjbGVhclZvdGVFbnRyaWVzBQp2b3RlUmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd2b3RlS2V5AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEUa2V5Q2FsY3VsYXRvckFkZHJlc3MAAg4lc19fY2FsY3VsYXRvcgEXa2V5UHJveHlUcmVhc3VyeUFkZHJlc3MAAhElc19fcHJveHlUcmVhc3VyeQEPa2V5Q2hpbGRBZGRyZXNzAAIJJXNfX2NoaWxkARhrZXlCbG9ja1Byb2Nlc3NpbmdSZXdhcmQAAhklc19fYmxvY2tQcm9jZXNzaW5nUmV3YXJkARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MAAhYlc19fbmV4dEJsb2NrVG9Qcm9jZXNzAQxrZXlMcEFzc2V0SWQAAg0lc19fbHBBc3NldElkABdjYWxjdWxhdG9yQWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQR0aGlzCQEUa2V5Q2FsY3VsYXRvckFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAXY2FsY3VsYXRvckFkZHJlc3NPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUXY2FsY3VsYXRvckFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIaaW52YWxpZCBjYWxjdWxhdG9yIGFkZHJlc3MAGnByb3h5VHJlYXN1cnlBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFBHRoaXMJARdrZXlQcm94eVRyZWFzdXJ5QWRkcmVzcwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABpwcm94eVRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRpwcm94eVRyZWFzdXJ5QWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAh5pbnZhbGlkIHByb3h5IHRyZWFzdXJ5IGFkZHJlc3MBEGtleUNvbmZpZ0FkZHJlc3MAAgolc19fY29uZmlnARJrZXlDaGlsZHJlbkFkZHJlc3MAAhFjb250cmFjdF9jaGlsZHJlbgEWa2V5Vm90aW5nUmVzdWx0QWRkcmVzcwACFmNvbnRyYWN0X3ZvdGluZ19yZXN1bHQBGWtleVByb3Bvc2FsQWxsb3dCcm9hZGNhc3QCB2FkZHJlc3MEdHhJZAkArAICCQCsAgIJAKwCAgIZcHJvcG9zYWxfYWxsb3dfYnJvYWRjYXN0XwkApQgBBQdhZGRyZXNzAgFfCQDYBAEFBHR4SWQBEWtleUludmVzdGVkQnlVc2VyAgxjaGlsZEFkZHJlc3MLdXNlckFkZHJlc3MJALkJAgkAzAgCAghpbnZlc3RvcgkAzAgCCQClCAEFDGNoaWxkQWRkcmVzcwkAzAgCCQClCAEFC3VzZXJBZGRyZXNzBQNuaWwCAV8AE2NvbmZpZ0FkZHJlc3NPcHRpb24EByRtYXRjaDAJAJ0IAgUEdGhpcwkBEGtleUNvbmZpZ0FkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgATY29uZmlnQWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRNjb25maWdBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECFmludmFsaWQgY29uZmlnIGFkZHJlc3MAGXZvdGluZ1Jlc3VsdEFkZHJlc3NPcHRpb24EByRtYXRjaDAFE2NvbmZpZ0FkZHJlc3NPcHRpb24DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQFhCQEWa2V5Vm90aW5nUmVzdWx0QWRkcmVzcwADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQCmCAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAZdm90aW5nUmVzdWx0QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRl2b3RpbmdSZXN1bHRBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECHWludmFsaWQgdm90aW5nIHJlc3VsdCBhZGRyZXNzABVjaGlsZHJlbkFkZHJlc3NPcHRpb24EByRtYXRjaDAFE2NvbmZpZ0FkZHJlc3NPcHRpb24DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQFhCQESa2V5Q2hpbGRyZW5BZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABVjaGlsZHJlbkFkZHJlc3NPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUVY2hpbGRyZW5BZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECGGludmFsaWQgY2hpbGRyZW4gYWRkcmVzcwAPbHBBc3NldElkT3B0aW9uBAckbWF0Y2gwCQCdCAIFBHRoaXMJAQxrZXlMcEFzc2V0SWQAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAPbHBBc3NldElkT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFD2xwQXNzZXRJZE9wdGlvbgkBB3dyYXBFcnIBAhFpbnZhbGlkIGxwQXNzZXRJZAELb25seUFkZHJlc3MCAWkHYWRkcmVzcwMJAAACCAUBaQZjYWxsZXIFB2FkZHJlc3MGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAEIb25seVRoaXMBAWkJAQtvbmx5QWRkcmVzcwIFAWkFBHRoaXMBDm9ubHlDYWxjdWxhdG9yAQFpCQELb25seUFkZHJlc3MCBQFpBRdjYWxjdWxhdG9yQWRkcmVzc09yRmFpbBMBaQELc3RyaW5nRW50cnkCA2tleQN2YWwDCQEOb25seUNhbGN1bGF0b3IBBQFpCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQN2YWwFA25pbAUDa2V5CQCUCgIFA25pbAUEdW5pdAFpAQxpbnRlZ2VyRW50cnkCA2tleQN2YWwDCQEOb25seUNhbGN1bGF0b3IBBQFpCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkAlAoCBQNuaWwFBHVuaXQBaQEMYm9vbGVhbkVudHJ5AgNrZXkDdmFsAwkBDm9ubHlDYWxjdWxhdG9yAQUBaQkAlAoCCQDMCAIJAQxCb29sZWFuRW50cnkCBQNrZXkFA3ZhbAUDbmlsBQNrZXkJAJQKAgUDbmlsBQR1bml0AWkBC2JpbmFyeUVudHJ5AgNrZXkDdmFsAwkBDm9ubHlDYWxjdWxhdG9yAQUBaQkAlAoCCQDMCAIJAQtCaW5hcnlFbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkAlAoCBQNuaWwFBHVuaXQBaQELZGVsZXRlRW50cnkBA2tleQMJAQ5vbmx5Q2FsY3VsYXRvcgEFAWkJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBBQNrZXkFA25pbAUDa2V5CQCUCgIFA25pbAUEdW5pdAFpAQdyZWlzc3VlAQZhbW91bnQDCQEOb25seUNhbGN1bGF0b3IBBQFpCQCUCgIJAMwIAgkBB1JlaXNzdWUDBQ9scEFzc2V0SWRPckZhaWwFBmFtb3VudAYFA25pbAUGYW1vdW50CQCUCgIFA25pbAUEdW5pdAFpAQRidXJuAQZhbW91bnQDCQEOb25seUNhbGN1bGF0b3IBBQFpCQCUCgIJAMwIAgkBBEJ1cm4CBQ9scEFzc2V0SWRPckZhaWwFBmFtb3VudAUDbmlsBQZhbW91bnQJAJQKAgUDbmlsBQR1bml0AWkBDXRyYW5zZmVyQXNzZXQDDnJlY2VwaWVudEJ5dGVzBmFtb3VudAdhc3NldElkAwkBDm9ubHlDYWxjdWxhdG9yAQUBaQkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUOcmVjZXBpZW50Qnl0ZXMFBmFtb3VudAUHYXNzZXRJZAUDbmlsBQZhbW91bnQJAJQKAgUDbmlsBQR1bml0AWkBDXRyYW5zZmVyV2F2ZXMCDnJlY2VwaWVudEJ5dGVzBmFtb3VudAMJAQ5vbmx5Q2FsY3VsYXRvcgEFAWkJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFDnJlY2VwaWVudEJ5dGVzBQZhbW91bnQFBHVuaXQFA25pbAUGYW1vdW50CQCUCgIFA25pbAUEdW5pdAFpARl0cmFuc2ZlckZyb21Qcm94eVRyZWFzdXJ5Ag5yZWNpcGllbnRCeXRlcw1yZXdhcmRzQW1vdW50AwkBDm9ubHlDYWxjdWxhdG9yAQUBaQkAlAoCBQNuaWwJAPwHBAUacHJveHlUcmVhc3VyeUFkZHJlc3NPckZhaWwCDXRyYW5zZmVyV2F2ZXMJAMwIAgUOcmVjaXBpZW50Qnl0ZXMJAMwIAgUNcmV3YXJkc0Ftb3VudAUDbmlsBQNuaWwJAJQKAgUDbmlsBQR1bml0AWkBCGZpbmFsaXplAxhuZXdUcmVhc3VyeVZvbHVtZUluV2F2ZXMXcHdyTWFuYWdlcnNCb251c0luV2F2ZXMgdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWYJAJQKAgUDbmlsCQD9BwQFF2NhbGN1bGF0b3JBZGRyZXNzT3JGYWlsAghmaW5hbGl6ZQkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIFGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcwkAzAgCBRdwd3JNYW5hZ2Vyc0JvbnVzSW5XYXZlcwkAzAgCBSB0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZgUDbmlsCAUBaQhwYXltZW50cwFpARBmaW5hbGl6ZVJFQURPTkxZAxhuZXdUcmVhc3VyeVZvbHVtZUluV2F2ZXMXcHdyTWFuYWdlcnNCb251c0luV2F2ZXMgdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWYJAJQKAgUDbmlsCQD9BwQFF2NhbGN1bGF0b3JBZGRyZXNzT3JGYWlsAhBmaW5hbGl6ZVJFQURPTkxZCQDMCAIFGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcwkAzAgCBRdwd3JNYW5hZ2Vyc0JvbnVzSW5XYXZlcwkAzAgCBSB0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZgUDbmlsBQNuaWwBaQEHY2xhaW1MUAAJAJQKAgUDbmlsCQD9BwQFF2NhbGN1bGF0b3JBZGRyZXNzT3JGYWlsAgdjbGFpbUxQCQDMCAIICAUBaQZjYWxsZXIFYnl0ZXMFA25pbAgFAWkIcGF5bWVudHMBaQEKY2xhaW1XYXZlcwEHdHhJZFN0cgkAlAoCBQNuaWwJAP0HBAUXY2FsY3VsYXRvckFkZHJlc3NPckZhaWwCCmNsYWltV2F2ZXMJAMwIAggIBQFpBmNhbGxlcgVieXRlcwkAzAgCCQDZBAEFB3R4SWRTdHIFA25pbAgFAWkIcGF5bWVudHMBaQEGaW52ZXN0AAkAlAoCBQNuaWwJAP0HBAUXY2FsY3VsYXRvckFkZHJlc3NPckZhaWwCBmludmVzdAkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwIBQFpCHBheW1lbnRzAWkBCHdpdGhkcmF3AAkAlAoCBQNuaWwJAP0HBAUXY2FsY3VsYXRvckFkZHJlc3NPckZhaWwCCHdpdGhkcmF3CQDMCAIICAUBaQZjYWxsZXIFYnl0ZXMFA25pbAgFAWkIcGF5bWVudHMBaQEOY2FuY2VsV2l0aGRyYXcBB3R4SWRTdHIJAJQKAgUDbmlsCQD9BwQFF2NhbGN1bGF0b3JBZGRyZXNzT3JGYWlsAg5jYW5jZWxXaXRoZHJhdwkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIJANkEAQUHdHhJZFN0cgUDbmlsCAUBaQhwYXltZW50cwFpAQ1wcm9jZXNzQmxvY2tzAAkAlAoCBQNuaWwJAP0HBAUXY2FsY3VsYXRvckFkZHJlc3NPckZhaWwCDXByb2Nlc3NCbG9ja3MJAMwIAggIBQFpBmNhbGxlcgVieXRlcwUDbmlsCAUBaQhwYXltZW50cwFpAQt2b3RlRm9yVHhJZAEEdHhJZAQTY2FsbGVyQWRkcmVzc1N0cmluZwkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBAlrZXlQcmVmaXgJARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBQR0eElkBAZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUFsbG93ZWRUeElkAAUEdHhJZAUDbmlsBBFhbGxvd2VkVHhJZE9wdGlvbgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQABANlcnIJAMwIAgMJAAACCQDIAQEJANkEAQUEdHhJZAURVFhJRF9CWVRFU19MRU5HVEgGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEiBpcyBub3QgdmFsaWQgdHhJZAkAzAgCAwMJAAACBRFhbGxvd2VkVHhJZE9wdGlvbgUEdW5pdAYJAQIhPQIJAQV2YWx1ZQEFEWFsbG93ZWRUeElkT3B0aW9uBQR0eElkBgkBCHRocm93RXJyAQkArAICBQR0eElkAhMgaXMgYWxyZWFkeSBhbGxvd2VkBQNuaWwDCQAAAgUDZXJyBQNlcnIJAQx2b3RlSU5URVJOQUwEBRNjYWxsZXJBZGRyZXNzU3RyaW5nBQlrZXlQcmVmaXgFBlFVT1JVTQUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQKYnlQcm9wb3NhbAQHJG1hdGNoMAUZdm90aW5nUmVzdWx0QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBA9wcm9wb3NhbEFkZHJlc3MFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPcHJvcG9zYWxBZGRyZXNzCQEZa2V5UHJvcG9zYWxBbGxvd0Jyb2FkY2FzdAIFBHRoaXMIBQJ0eAJpZAcHBAhieUFkbWlucwkAAAIIBQJ0eAJpZAkA2QQBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAACAAQHYnlPd25lcgMJAGcCCQCQAwEJAQ1nZXRBZG1pbnNMaXN0AAUGUVVPUlVNBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQMDBQpieVByb3Bvc2FsBgUIYnlBZG1pbnMGBQdieU93bmVyFSs2sQ==", "chainId": 84, "height": 2653865, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HKTE68oavY7L6zq5obn9VT2M2nJfeRK41Xcq2hUx9h5S Next: 4ey9kFvkF3YadfYHJ9QfATr3LvnvKiRUxjhrd3tcswrH Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let contractFilename = "factory.ride"
77
88 func wrapErr (s) = ((contractFilename + ": ") + s)
99
1010
1111 func throwErr (s) = throw(wrapErr(s))
1212
1313
1414 let ADMIN_LIST_SIZE = 5
1515
1616 let QUORUM = 3
1717
1818 let TXID_BYTES_LENGTH = 32
1919
2020 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
2121
2222
2323 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
2424
2525
2626 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
2727
2828
2929 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
3030
3131
3232 func getAdminVote (prefix,admin) = {
3333 let voteKey = keyFullAdminVote(prefix, admin)
3434 valueOrElse(getInteger(voteKey), 0)
3535 }
3636
3737
3838 func getAdminsList () = match getString(this, keyAdminAddressList()) {
3939 case s: String =>
4040 split(s, SEP)
4141 case _ =>
4242 nil
4343 }
4444
4545
4646 func isInAdminList (address) = containsElement(getAdminsList(), address)
4747
4848
4949 func genVotesKeysHelper (a,adminAddress) = {
5050 let $t012621286 = a
5151 let result = $t012621286._1
5252 let prefix = $t012621286._2
5353 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
5454 }
5555
5656
5757 func genVotesKeys (keyPrefix) = {
5858 let adminList = keyAdminAddressList()
5959 let $t014331517 = {
6060 let $l = getAdminsList()
6161 let $s = size($l)
6262 let $acc0 = $Tuple2(nil, keyPrefix)
6363 func $f0_1 ($a,$i) = if (($i >= $s))
6464 then $a
6565 else genVotesKeysHelper($a, $l[$i])
6666
6767 func $f0_2 ($a,$i) = if (($i >= $s))
6868 then $a
6969 else throw("List size exceeds 5")
7070
7171 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
7272 }
7373 let result = $t014331517._1
7474 let prefix = $t014331517._2
7575 result
7676 }
7777
7878
7979 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
8080
8181
8282 func countVotes (prefix) = {
8383 let votes = genVotesKeys(prefix)
8484 let $l = votes
8585 let $s = size($l)
8686 let $acc0 = 0
8787 func $f0_1 ($a,$i) = if (($i >= $s))
8888 then $a
8989 else countVotesHelper($a, $l[$i])
9090
9191 func $f0_2 ($a,$i) = if (($i >= $s))
9292 then $a
9393 else throw("List size exceeds 5")
9494
9595 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
9696 }
9797
9898
9999 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
100100
101101
102102 func getClearVoteEntries (prefix) = {
103103 let votes = genVotesKeys(prefix)
104104 let $l = votes
105105 let $s = size($l)
106106 let $acc0 = nil
107107 func $f0_1 ($a,$i) = if (($i >= $s))
108108 then $a
109109 else clearVotesHelper($a, $l[$i])
110110
111111 func $f0_2 ($a,$i) = if (($i >= $s))
112112 then $a
113113 else throw("List size exceeds 5")
114114
115115 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
116116 }
117117
118118
119119 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
120120 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
121121 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
122122 let err = if (!(isInAdminList(callerAddressString)))
123123 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
124124 else if ((adminCurrentVote == 1))
125125 then throwErr((voteKey + " you already voted"))
126126 else unit
127127 if ((err == err))
128128 then {
129129 let votes = countVotes(keyPrefix)
130130 if (((votes + 1) >= minVotes))
131131 then {
132132 let clearVoteEntries = getClearVoteEntries(keyPrefix)
133133 (clearVoteEntries ++ voteResult)
134134 }
135135 else [IntegerEntry(voteKey, 1)]
136136 }
137137 else throw("Strict value is not equal to itself.")
138138 }
139139
140140
141141 func keyCalculatorAddress () = "%s__calculator"
142142
143143
144144 func keyProxyTreasuryAddress () = "%s__proxyTreasury"
145145
146146
147147 func keyChildAddress () = "%s__child"
148148
149149
150150 func keyBlockProcessingReward () = "%s__blockProcessingReward"
151151
152152
153153 func keyNextBlockToProcess () = "%s__nextBlockToProcess"
154154
155155
156156 func keyLpAssetId () = "%s__lpAssetId"
157157
158158
159159 let calculatorAddressOption = match getString(this, keyCalculatorAddress()) {
160160 case s: String =>
161161 addressFromString(s)
162162 case _: Unit =>
163163 unit
164164 case _ =>
165165 throw("Match error")
166166 }
167167
168168 let calculatorAddressOrFail = valueOrErrorMessage(calculatorAddressOption, wrapErr("invalid calculator address"))
169169
170170 let proxyTreasuryAddressOption = match getString(this, keyProxyTreasuryAddress()) {
171171 case s: String =>
172172 addressFromString(s)
173173 case _: Unit =>
174174 unit
175175 case _ =>
176176 throw("Match error")
177177 }
178178
179179 let proxyTreasuryAddressOrFail = valueOrErrorMessage(proxyTreasuryAddressOption, wrapErr("invalid proxy treasury address"))
180180
181181 func keyConfigAddress () = "%s__config"
182182
183183
184184 func keyChildrenAddress () = "contract_children"
185185
186186
187187 func keyVotingResultAddress () = "contract_voting_result"
188188
189189
190190 func keyProposalAllowBroadcast (address,txId) = ((("proposal_allow_broadcast_" + toString(address)) + "_") + toBase58String(txId))
191191
192192
193193 func keyInvestedByUser (childAddress,userAddress) = makeString(["investor", toString(childAddress), toString(userAddress)], "_")
194194
195195
196196 let configAddressOption = match getString(this, keyConfigAddress()) {
197197 case s: String =>
198198 addressFromString(s)
199199 case _: Unit =>
200200 unit
201201 case _ =>
202202 throw("Match error")
203203 }
204204
205205 let configAddressOrFail = valueOrErrorMessage(configAddressOption, wrapErr("invalid config address"))
206206
207207 let votingResultAddressOption = match configAddressOption {
208208 case a: Address =>
209209 match getString(a, keyVotingResultAddress()) {
210210 case s: String =>
211211 addressFromString(s)
212212 case _: Unit =>
213213 unit
214214 case _ =>
215215 throw("Match error")
216216 }
217217 case _: Unit =>
218218 unit
219219 case _ =>
220220 throw("Match error")
221221 }
222222
223223 let votingResultAddressOrFail = valueOrErrorMessage(votingResultAddressOption, wrapErr("invalid voting result address"))
224224
225225 let childrenAddressOption = match configAddressOption {
226226 case a: Address =>
227227 match getString(a, keyChildrenAddress()) {
228228 case s: String =>
229229 addressFromString(s)
230230 case _: Unit =>
231231 unit
232232 case _ =>
233233 throw("Match error")
234234 }
235235 case _: Unit =>
236236 unit
237237 case _ =>
238238 throw("Match error")
239239 }
240240
241241 let childrenAddressOrFail = valueOrErrorMessage(childrenAddressOption, wrapErr("invalid children address"))
242242
243243 let lpAssetIdOption = match getString(this, keyLpAssetId()) {
244244 case s: String =>
245245 fromBase58String(s)
246246 case _: Unit =>
247247 unit
248248 case _ =>
249249 throw("Match error")
250250 }
251251
252252 let lpAssetIdOrFail = valueOrErrorMessage(lpAssetIdOption, wrapErr("invalid lpAssetId"))
253253
254254 func onlyAddress (i,address) = if ((i.caller == address))
255255 then true
256256 else throwErr("permission denied")
257257
258258
259259 func onlyThis (i) = onlyAddress(i, this)
260260
261261
262262 func onlyCalculator (i) = onlyAddress(i, calculatorAddressOrFail)
263263
264264
265265 @Callable(i)
266266 func stringEntry (key,val) = if (onlyCalculator(i))
267267 then $Tuple2([StringEntry(key, val)], key)
268268 else $Tuple2(nil, unit)
269269
270270
271271
272272 @Callable(i)
273273 func integerEntry (key,val) = if (onlyCalculator(i))
274274 then $Tuple2([IntegerEntry(key, val)], key)
275275 else $Tuple2(nil, unit)
276276
277277
278278
279279 @Callable(i)
280280 func booleanEntry (key,val) = if (onlyCalculator(i))
281281 then $Tuple2([BooleanEntry(key, val)], key)
282282 else $Tuple2(nil, unit)
283283
284284
285285
286286 @Callable(i)
287287 func binaryEntry (key,val) = if (onlyCalculator(i))
288288 then $Tuple2([BinaryEntry(key, val)], key)
289289 else $Tuple2(nil, unit)
290290
291291
292292
293293 @Callable(i)
294294 func deleteEntry (key) = if (onlyCalculator(i))
295295 then $Tuple2([DeleteEntry(key)], key)
296296 else $Tuple2(nil, unit)
297297
298298
299299
300300 @Callable(i)
301301 func reissue (amount) = if (onlyCalculator(i))
302302 then $Tuple2([Reissue(lpAssetIdOrFail, amount, true)], amount)
303303 else $Tuple2(nil, unit)
304304
305305
306306
307307 @Callable(i)
308308 func burn (amount) = if (onlyCalculator(i))
309309 then $Tuple2([Burn(lpAssetIdOrFail, amount)], amount)
310310 else $Tuple2(nil, unit)
311311
312312
313313
314314 @Callable(i)
315315 func transferAsset (recepientBytes,amount,assetId) = if (onlyCalculator(i))
316316 then $Tuple2([ScriptTransfer(Address(recepientBytes), amount, assetId)], amount)
317317 else $Tuple2(nil, unit)
318318
319319
320320
321321 @Callable(i)
322322 func transferWaves (recepientBytes,amount) = if (onlyCalculator(i))
323323 then $Tuple2([ScriptTransfer(Address(recepientBytes), amount, unit)], amount)
324324 else $Tuple2(nil, unit)
325325
326326
327327
328328 @Callable(i)
329329 func transferFromProxyTreasury (recipientBytes,rewardsAmount) = if (onlyCalculator(i))
330330 then $Tuple2(nil, invoke(proxyTreasuryAddressOrFail, "transferWaves", [recipientBytes, rewardsAmount], nil))
331331 else $Tuple2(nil, unit)
332332
333333
334334
335335 @Callable(i)
336336 func finalize (newTreasuryVolumeInWaves,pwrManagersBonusInWaves,treasuryVolumeDiffAllocationCoef) = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "finalize", [i.caller.bytes, newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef], i.payments))
337337
338338
339339
340340 @Callable(i)
341341 func finalizeREADONLY (newTreasuryVolumeInWaves,pwrManagersBonusInWaves,treasuryVolumeDiffAllocationCoef) = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "finalizeREADONLY", [newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef], nil))
342342
343343
344344
345345 @Callable(i)
346346 func claimLP () = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "claimLP", [i.caller.bytes], i.payments))
347347
348348
349349
350350 @Callable(i)
351351 func claimWaves (txIdStr) = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "claimWaves", [i.caller.bytes, fromBase58String(txIdStr)], i.payments))
352352
353353
354354
355355 @Callable(i)
356356 func invest () = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "invest", [i.caller.bytes], i.payments))
357357
358358
359359
360360 @Callable(i)
361361 func withdraw () = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "withdraw", [i.caller.bytes], i.payments))
362362
363363
364364
365365 @Callable(i)
366366 func cancelWithdraw (txIdStr) = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "cancelWithdraw", [i.caller.bytes, fromBase58String(txIdStr)], i.payments))
367367
368368
369369
370370 @Callable(i)
371371 func processBlocks () = $Tuple2(nil, reentrantInvoke(calculatorAddressOrFail, "processBlocks", [i.caller.bytes], i.payments))
372372
373373
374374
375375 @Callable(i)
376376 func voteForTxId (txId) = {
377377 let callerAddressString = toBase58String(i.caller.bytes)
378378 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
379379 let result = [StringEntry(keyAllowedTxId(), txId)]
380380 let allowedTxIdOption = getString(this, keyAllowedTxId())
381381 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
382382 then true
383383 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
384384 then true
385385 else (value(allowedTxIdOption) != txId))
386386 then true
387387 else throwErr((txId + " is already allowed"))]
388388 if ((err == err))
389389 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
390390 else throw("Strict value is not equal to itself.")
391391 }
392392
393393
394394 @Verifier(tx)
395395 func verify () = {
396396 let byProposal = match votingResultAddressOption {
397397 case proposalAddress: Address =>
398398 valueOrElse(getBoolean(proposalAddress, keyProposalAllowBroadcast(this, tx.id)), false)
399399 case _ =>
400400 false
401401 }
402402 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
403403 let byOwner = if ((size(getAdminsList()) >= QUORUM))
404404 then false
405405 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
406406 if (if (byProposal)
407407 then true
408408 else byAdmins)
409409 then true
410410 else byOwner
411411 }
412412

github/deemru/w8io/026f985 
49.85 ms