tx · 9zF62RogrsCuw3HfDSfgVmivap1tsTdnqU4XK8gDDJjX

3ND9S6XnQh4Nb1ND5GCWyKPFH1hgJPJQu5Q:  -0.01000000 Waves

2022.09.01 14:44 [2210024] smart account 3ND9S6XnQh4Nb1ND5GCWyKPFH1hgJPJQu5Q > SELF 0.00000000 Waves

{ "type": 13, "id": "9zF62RogrsCuw3HfDSfgVmivap1tsTdnqU4XK8gDDJjX", "fee": 1000000, "feeAssetId": null, "timestamp": 1662032726898, "version": 2, "chainId": 84, "sender": "3ND9S6XnQh4Nb1ND5GCWyKPFH1hgJPJQu5Q", "senderPublicKey": "CVMZJUnyh9oW1DePibtCUhbpXfe3xHa38A5K1SZqT4Wi", "proofs": [ "4FonzrgxiMvS38mE7JbrwxiDUqp2Ko15XUECXAaHS8JK9baZTwPnohpRjfizBVi7JkHndyxWapmNthNKhPkYm5QN" ], "script": "base64:BgIjCAISABIAEgASAwoBBBIAEgASBAoCAQQSAwoBBBIDCgEIEgAmAAtrZXlNQWNjUEtleQIJbWFzdGVyX3BrAQxnZXRDRkFkZHJlc3MACQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwIKQ0ZfQUREUkVTUwIUQ0ZfQUREUkVTUyBub3QgZm91bmQACG1BY2NQS2V5CQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEMZ2V0Q0ZBZGRyZXNzAAULa2V5TUFjY1BLZXkJAKwCAgULa2V5TUFjY1BLZXkCCiBub3QgZm91bmQACG1BY2NBZGRyCQCnCAEFCG1BY2NQS2V5ARFnZXRDb3Vwb25zQWRkcmVzcwAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFCG1BY2NBZGRyAg9DT1VQT05TX0FERFJFU1MAEGtleVRvdGFsQ29tcG91bmQCDnRvdGFsX2NvbXBvdW5kABFrZXlTdGFrZWRDb21wb3VuZAIPc3Rha2VkX2NvbXBvdW5kAAlrZXlMYXN0VlACEmxhc3RfdmlydHVhbF9wcmljZQAHVlBTY2FsZQCAwtcvARVrZXlTdGFrZWRDb21wb3VuZFVzZXIBBHVzZXIJAKwCAgkArAICCQClCAEFBHVzZXICAV8FEWtleVN0YWtlZENvbXBvdW5kARBjYWxjVmlydHVhbFByaWNlAgt0b3RhbFN0YWtlZAV0b3RhbAMJAAACBQV0b3RhbAAAAAEDCQAAAgULdG90YWxTdGFrZWQAAAABCQBrAwUFdG90YWwFB1ZQU2NhbGUFC3RvdGFsU3Rha2VkAAVTY2FsZQCAwtcvAQ9rZXlTdGFrZWRBbW91bnQBB2FkZHJlc3MJAKwCAgkApQgBBQdhZGRyZXNzAgxfZmFybV9zdGFrZWQBFGtleUxhc3RDaGVja0ludGVyZXN0AQdhZGRyZXNzCQCsAgIJAKUIAQUHYWRkcmVzcwITX2xhc3RDaGVja19pbnRlcmVzdAENa2V5RWdnQ2xhaW1lZAEHYWRkcmVzcwkArAICCQClCAEFB2FkZHJlc3MCCF9jbGFpbWVkABVrZXlHbG9iYWxMYXN0SW50ZXJlc3QCGWdsb2JhbF9sYXN0Q2hlY2tfaW50ZXJlc3QAD2tleUdsb2JhbFN0YWtlZAINZ2xvYmFsX3N0YWtlZAASa2V5R2xvYmFsRWdnRWFybmVkAg9nbG9iYWxfZWFybmluZ3MAEmtMb2NrZWRJbnZlc3RtZW50cwISbG9ja2VkX2ludmVzdG1lbnRzARZpc0NvbGxlY3RpdmVGYXJtTG9ja2VkAAQHJG1hdGNoMAkAmwgCCQEMZ2V0Q0ZBZGRyZXNzAAUSa0xvY2tlZEludmVzdG1lbnRzAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHAQhnZXRFZ2dJZAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUIbUFjY0FkZHICDEVHR19BU1NFVF9JRAEXc2V0Q0ZBZGRyZXNzQW5kSW5pdGlhdGUBB2FkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgIKQ0ZfQUREUkVTUwUHYWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5R2xvYmFsTGFzdEludGVyZXN0AAEFA25pbAEPZ2V0U2hhcmVBc3NldElkAAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQEMZ2V0Q0ZBZGRyZXNzAAIOU0hBUkVfQVNTRVRfSUQBFXRyeUdldEludGVnZXJFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJoIAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQ10cnlHZXRJbnRlZ2VyAQNrZXkJARV0cnlHZXRJbnRlZ2VyRXh0ZXJuYWwCBQR0aGlzBQNrZXkBDHRyeUdldFN0cmluZwEDa2V5BAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEQZ2V0Vm90ZUhlaWdodEtleQACEVZPVEVfSEVJR0hUX1NUQVJUAQtnZXREdXJhdGlvbgADCQAAAgkBFXRyeUdldEludGVnZXJFeHRlcm5hbAIFCG1BY2NBZGRyAg1WT1RFX0RVUkFUSU9OAAAAkE4JARV0cnlHZXRJbnRlZ2VyRXh0ZXJuYWwCBQhtQWNjQWRkcgINVk9URV9EVVJBVElPTgEQZ2V0Vm90ZUJ5VXNlcktleQIEdXNlcgZoZWlnaHQJAKwCAgkArAICCQCsAgICBVZPVEVfBQR1c2VyAgFfBQZoZWlnaHQBFWdldFRvdGFsVm90ZUJ5VHlwZUtleQIEdHlwZQZoZWlnaHQJAKwCAgkArAICCQCsAgICC1ZPVEVfVE9UQUxfBQR0eXBlAgFfBQZoZWlnaHQBD2dldFRvdGFsVm90ZUtleQEGaGVpZ2h0CQCsAgICC1ZPVEVfVE9UQUxfBQZoZWlnaHQBDXJlc3VsdFZvdGVLZXkBBmhlaWdodAkArAICAgtMSVFVSURBVEVEXwUGaGVpZ2h0AQ1xdW9ydW1Wb3RlS2V5AQZoZWlnaHQJAKwCAgIHUVVPUlVNXwUGaGVpZ2h0ARJjbGFpbVN0YWtpbmdSZXN1bHQBB2FkZHJlc3MED2N1cnJlbnRJbnRlcmVzdAkBDXRyeUdldEludGVnZXIBBRVrZXlHbG9iYWxMYXN0SW50ZXJlc3QEEWxhc3RDaGVja0ludGVyZXN0CQENdHJ5R2V0SW50ZWdlcgEJARRrZXlMYXN0Q2hlY2tJbnRlcmVzdAEFB2FkZHJlc3MEDHN0YWtlZEFtb3VudAkBDXRyeUdldEludGVnZXIBCQEPa2V5U3Rha2VkQW1vdW50AQUHYWRkcmVzcwQGcmV3YXJkAwkAZgIFEWxhc3RDaGVja0ludGVyZXN0AAAJAGsDCQBlAgUPY3VycmVudEludGVyZXN0BRFsYXN0Q2hlY2tJbnRlcmVzdAUMc3Rha2VkQW1vdW50BQVTY2FsZQAABAh0cmFuc2ZlcgMJAGYCBQZyZXdhcmQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzBQZyZXdhcmQJAQhnZXRFZ2dJZAAFA25pbAUDbmlsCQDOCAIFCHRyYW5zZmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TGFzdENoZWNrSW50ZXJlc3QBBQdhZGRyZXNzBQ9jdXJyZW50SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlFZ2dDbGFpbWVkAQUHYWRkcmVzcwkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkBDWtleUVnZ0NsYWltZWQBBQdhZGRyZXNzBQZyZXdhcmQFA25pbAESaGFuZGxlU3Rha2luZ1RvcFVwAQZhbW91bnQED2N1cnJlbnRJbnRlcmVzdAkBDXRyeUdldEludGVnZXIBBRVrZXlHbG9iYWxMYXN0SW50ZXJlc3QEEXRvdGFsU3Rha2VkQW1vdW50CQENdHJ5R2V0SW50ZWdlcgEFD2tleUdsb2JhbFN0YWtlZAQNaW50ZXJlc3REZWx0YQMJAGYCBRF0b3RhbFN0YWtlZEFtb3VudAAACQBrAwUGYW1vdW50BQVTY2FsZQURdG90YWxTdGFrZWRBbW91bnQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa2V5R2xvYmFsRWdnRWFybmVkCQBkAgkBDXRyeUdldEludGVnZXIBBRJrZXlHbG9iYWxFZ2dFYXJuZWQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5R2xvYmFsTGFzdEludGVyZXN0CQBkAgUPY3VycmVudEludGVyZXN0BQ1pbnRlcmVzdERlbHRhBQNuaWwBDGFkZFZvdGVQb3dlcgQGY2FsbGVyAWgEdm90ZQl2b3RlUG93ZXIDAwkAAAIFAWgAAAYJAAACBQR2b3RlAgAFA25pbAMJAGYCBQZoZWlnaHQJAGQCBQFoCQELZ2V0RHVyYXRpb24ACQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICM0NBVlA6IFZvdGluZyBpcyBmaW5pc2hlZCwgcGxlYXNlIGZpbmFsaXplIHRoZSB2b3RlOwIMIEFyZ3VtZW50czogBQZjYWxsZXICAiwgCQCkAwEFAWgCAiwgBQR2b3RlAgIsIAkApAMBBQl2b3RlUG93ZXIED3ZvdGVUb3RhbEJ5VHlwZQkBDXRyeUdldEludGVnZXIBCQEVZ2V0VG90YWxWb3RlQnlUeXBlS2V5AgUEdm90ZQkApAMBBQFoBAl0b3RhbFZvdGUJAQ10cnlHZXRJbnRlZ2VyAQkBD2dldFRvdGFsVm90ZUtleQEJAKQDAQUBaAkAzAgCCQELU3RyaW5nRW50cnkCCQEQZ2V0Vm90ZUJ5VXNlcktleQIFBmNhbGxlcgkApAMBBQFoBQR2b3RlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVZ2V0VG90YWxWb3RlQnlUeXBlS2V5AgUEdm90ZQkApAMBBQFoCQBkAgUPdm90ZVRvdGFsQnlUeXBlBQl2b3RlUG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9nZXRUb3RhbFZvdGVLZXkBCQCkAwEFAWgJAGQCBQl0b3RhbFZvdGUFCXZvdGVQb3dlcgUDbmlsARNhZGFwdFZvdGVQb3dlclN0YWtlAgZjYWxsZXIJdm90ZVBvd2VyBAp2b3RlSGVpZ2h0CQENdHJ5R2V0SW50ZWdlcgEJARBnZXRWb3RlSGVpZ2h0S2V5AAQQdm90ZUJ5VXNlclN0cmluZwkBDHRyeUdldFN0cmluZwEJARBnZXRWb3RlQnlVc2VyS2V5AgUGY2FsbGVyCQCkAwEFCnZvdGVIZWlnaHQJAQxhZGRWb3RlUG93ZXIEBQZjYWxsZXIFCnZvdGVIZWlnaHQFEHZvdGVCeVVzZXJTdHJpbmcFCXZvdGVQb3dlcgEMaXNMaXF1aWRhdGVkAAQKdm90ZUhlaWdodAkBDXRyeUdldEludGVnZXIBCQEQZ2V0Vm90ZUhlaWdodEtleQADCQAAAgUKdm90ZUhlaWdodAAABwkBEUBleHRyTmF0aXZlKDEwNTYpAQkBDXJlc3VsdFZvdGVLZXkBCQCkAwEFCnZvdGVIZWlnaHQKAWkBEWNsYWltUmVmdW5kU3Rha2VkAAQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEDHN0YWtlZEFtb3VudAkBDXRyeUdldEludGVnZXIBCQEPa2V5U3Rha2VkQW1vdW50AQgFAWkGY2FsbGVyBAp2b3RlSGVpZ2h0CQENdHJ5R2V0SW50ZWdlcgEJARBnZXRWb3RlSGVpZ2h0S2V5AAQQdm90ZUJ5VXNlclN0cmluZwkBDHRyeUdldFN0cmluZwEJARBnZXRWb3RlQnlVc2VyS2V5AgUKYWRkcmVzc1N0cgkApAMBBQp2b3RlSGVpZ2h0BAptdWx0aXBsaWVyAwkAAAIFEHZvdGVCeVVzZXJTdHJpbmcCAAAHAAoEBnJlZnVuZAkAaAIJAGkCBQxzdGFrZWRBbW91bnQACgUKbXVsdGlwbGllcgQLY291cG9uc0NhbGwJAPwHBAkBEWdldENvdXBvbnNBZGRyZXNzAAIIQ0ZSZWZ1bmQJAMwIAgUKYWRkcmVzc1N0cgkAzAgCBQZyZWZ1bmQFA25pbAUDbmlsAwkAAAIFC2NvdXBvbnNDYWxsBQtjb3Vwb25zQ2FsbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVN0YWtlZEFtb3VudAEIBQFpBmNhbGxlcgAACQDMCAIJAQRCdXJuAgkBD2dldFNoYXJlQXNzZXRJZAAFDHN0YWtlZEFtb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2NsYWltUmVmdW5kVW5zdGFrZWQABAxzaGFyZVRva2VuSWQJAQ9nZXRTaGFyZUFzc2V0SWQAAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHENTRlQ6IFRvIG1hbnkgcGF5bWVudHMgYWRkZWQDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDHNoYXJlVG9rZW5JZAkAAgECE0NTRlQ6IFdyb25nIGFzc2V0SWQEBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDCQAAAgUGYW1vdW50AAAJAAIBAipDU0ZUOiBQbGVhc2UgYXR0YWNoIHBvc2l0aXZlIGFzc2V0IGFtb3VudCEECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAptdWx0aXBsaWVyAAcEBnJlZnVuZAkAaAIJAGkCBQZhbW91bnQACgUKbXVsdGlwbGllcgQLY291cG9uc0NhbGwJAPwHBAkBEWdldENvdXBvbnNBZGRyZXNzAAIIQ0ZSZWZ1bmQJAMwIAgUKYWRkcmVzc1N0cgkAzAgCBQZyZWZ1bmQFA25pbAUDbmlsAwkAAAIFC2NvdXBvbnNDYWxsBQtjb3Vwb25zQ2FsbAkAzAgCCQEEQnVybgIJAQ9nZXRTaGFyZUFzc2V0SWQABQZhbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlzdGFydFZvdGUAAwkBAiE9AggFAWkGY2FsbGVyBQhtQWNjQWRkcgkAAgECOUNTVjogT25seSB0aGUgYWRtaW4gY2FuIHN0YXJ0IGEgbGlxdWlkYXRpb24gdm90ZSBmb3Igbm93IQMJAQIhPQIJAQ10cnlHZXRJbnRlZ2VyAQkBEGdldFZvdGVIZWlnaHRLZXkAAAAJAAIBAiVDU1Y6IFRoZXJlIGlzIGFscmVhZHkgYSB2b3RlIHJ1bm5pbmchCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhFWT1RFX0hFSUdIVF9TVEFSVAUGaGVpZ2h0BQNuaWwBaQEPdm90ZVRvTGlxdWlkYXRlAQR2b3RlBAl2b3RlUG93ZXIJAQ10cnlHZXRJbnRlZ2VyAQkBD2tleVN0YWtlZEFtb3VudAEIBQFpBmNhbGxlcgMJAAACBQl2b3RlUG93ZXIAAAkAAgECM0NWVEw6IFBsZWFzZSBzdGFrZSBzb21lIHRva2VucyBiZWZvcmUgeW91IGNhbiB2b3RlIQQMdm90ZUFzU3RyaW5nCQClAwEFBHZvdGUECnZvdGVIZWlnaHQJAQ10cnlHZXRJbnRlZ2VyAQkBEGdldFZvdGVIZWlnaHRLZXkAAwkAZgIFBmhlaWdodAkAZAIFCnZvdGVIZWlnaHQJAQtnZXREdXJhdGlvbgAJAAIBAjFDVjogVm90aW5nIGlzIGZpbmlzaGVkLCBwbGVhc2UgZmluYWxpemUgdGhlIHZvdGUhBBB2b3RlQnlVc2VyU3RyaW5nCQEMdHJ5R2V0U3RyaW5nAQkBEGdldFZvdGVCeVVzZXJLZXkCCQClCAEIBQFpBmNhbGxlcgkApAMBBQp2b3RlSGVpZ2h0AwkBAiE9AgUQdm90ZUJ5VXNlclN0cmluZwIACQACAQIhQ1Y6IFlvdSBjYW4gbm90IGNoYW5nZSB5b3VyIHZvdGUhCQEMYWRkVm90ZVBvd2VyBAkApQgBCAUBaQZjYWxsZXIFCnZvdGVIZWlnaHQFDHZvdGVBc1N0cmluZwUJdm90ZVBvd2VyAWkBDGZpbmFsaXplVm90ZQAECnZvdGVIZWlnaHQJAQ10cnlHZXRJbnRlZ2VyAQkBEGdldFZvdGVIZWlnaHRLZXkAAwkAZgIJAGQCBQp2b3RlSGVpZ2h0CQELZ2V0RHVyYXRpb24ABQZoZWlnaHQJAAIBAhxDRlY6IFZvdGluZyBpcyBub3QgZmluaXNoZWQhBBF0b3RhbFN0YWtlZEFtb3VudAkBDXRyeUdldEludGVnZXIBBQ9rZXlHbG9iYWxTdGFrZWQECXRvdGFsVm90ZQkBDXRyeUdldEludGVnZXIBCQEPZ2V0VG90YWxWb3RlS2V5AQkApAMBBQp2b3RlSGVpZ2h0BAZxdW9ydW0JAGgCCQBpAgUJdG90YWxWb3RlBRF0b3RhbFN0YWtlZEFtb3VudABkBA52b3RlVG90YWxCeVllcwkBDXRyeUdldEludGVnZXIBCQEVZ2V0VG90YWxWb3RlQnlUeXBlS2V5AgIEdHJ1ZQkApAMBBQp2b3RlSGVpZ2h0BA12b3RlVG90YWxCeU5vCQENdHJ5R2V0SW50ZWdlcgEJARVnZXRUb3RhbFZvdGVCeVR5cGVLZXkCAgVmYWxzZQkApAMBBQp2b3RlSGVpZ2h0BApsaXF1aWRhdGVkAwkAZgIAFAUGcXVvcnVtBgMJAGYCBQ52b3RlVG90YWxCeVllcwUNdm90ZVRvdGFsQnlObwYHBAhyZXNldEtleQMFCmxpcXVpZGF0ZWQFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGdldFZvdGVIZWlnaHRLZXkAAAAFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENcXVvcnVtVm90ZUtleQEJAKQDAQUKdm90ZUhlaWdodAUGcXVvcnVtCQDMCAIJAQxCb29sZWFuRW50cnkCCQENcmVzdWx0Vm90ZUtleQEJAKQDAQUKdm90ZUhlaWdodAUKbGlxdWlkYXRlZAUDbmlsBQhyZXNldEtleQFpAQt0b3BVcFJld2FyZAADCQEMaXNMaXF1aWRhdGVkAAkAAgECF0NUVVI6IENGIGlzIGxpcXVpZGF0ZWQhBAplZ2dBc3NldElkCQEIZ2V0RWdnSWQAAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQplZ2dBc3NldElkCQACAQIqQ1RVUDogV3JvbmcgYXNzZXRJZCwgcGF5bWVudCBzaG91bGQgYmUgRUdHBBByZXNIYW5kbGVTdGFraW5nCQESaGFuZGxlU3Rha2luZ1RvcFVwAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAJQKAgUQcmVzSGFuZGxlU3Rha2luZwYBaQESd2l0aGRyYXdGYXJtVG9rZW5zAgZhbW91bnQIY29tcG91bmQDCQEMaXNMaXF1aWRhdGVkAAkAAgECF0NUVVI6IENGIGlzIGxpcXVpZGF0ZWQhAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECH0NXRlQ6IFBsZWFzZSBkb24ndCBhZGQgcGF5bWVudHMEDHNoYXJlVG9rZW5JZAkBD2dldFNoYXJlQXNzZXRJZAADBQhjb21wb3VuZAQGc3Rha2VkCQENdHJ5R2V0SW50ZWdlcgEFEWtleVN0YWtlZENvbXBvdW5kBAV0b3RhbAkBDXRyeUdldEludGVnZXIBBRBrZXlUb3RhbENvbXBvdW5kBAJ2cAkBEGNhbGNWaXJ0dWFsUHJpY2UCBQZzdGFrZWQFBXRvdGFsBBJrZXlTdGFrZWRDb21wb3VuZFUJARVrZXlTdGFrZWRDb21wb3VuZFVzZXIBCAUBaQZjYWxsZXIEDnBlcnNvbmFsU3Rha2VkCQENdHJ5R2V0SW50ZWdlcgEFEmtleVN0YWtlZENvbXBvdW5kVQQJdmlydHVhbFdkAwkAAAIFBmFtb3VudAD///////////8BBQ5wZXJzb25hbFN0YWtlZAkAawMFBmFtb3VudAUHVlBTY2FsZQUCdnAECGFtb3VudFdkAwkAAAIFBmFtb3VudAD///////////8BCQBrAwUJdmlydHVhbFdkBQJ2cAUHVlBTY2FsZQUGYW1vdW50AwkAZgIFCXZpcnR1YWxXZAUOcGVyc29uYWxTdGFrZWQJAAIBAi5DV0ZUOiBZb3UgZG9uJ3QgaGF2ZSBzbyBtdWNoIGZ1bmRzIHRvIHdpdGhkcmF3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrZXlTdGFrZWRDb21wb3VuZFUJAGUCBQ5wZXJzb25hbFN0YWtlZAUJdmlydHVhbFdkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrZXlTdGFrZWRDb21wb3VuZAkAZQIFBnN0YWtlZAUJdmlydHVhbFdkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlUb3RhbENvbXBvdW5kCQBlAgUFdG90YWwFCGFtb3VudFdkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUIYW1vdW50V2QFDHNoYXJlVG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa2V5TGFzdFZQBQJ2cAkAzAgCCQEMSW50ZWdlckVudHJ5AgIVbGFzdF92aXJ0X2NvbXBvdW5kX3dkBQl2aXJ0dWFsV2QJAMwIAgkBDEludGVnZXJFbnRyeQICF2xhc3RfYW1vdW50X2NvbXBvdW5kX3dkBQhhbW91bnRXZAUDbmlsBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQMc3Rha2VkQW1vdW50CQENdHJ5R2V0SW50ZWdlcgEJAQ9rZXlTdGFrZWRBbW91bnQBCAUBaQZjYWxsZXIECHdkQW1vdW50AwkAAAIFBmFtb3VudAD///////////8BBQxzdGFrZWRBbW91bnQFBmFtb3VudAMJAGYCBQh3ZEFtb3VudAUMc3Rha2VkQW1vdW50CQACAQIlQ1dGVDogeW91IGRvbid0IGhhdmUgdG9rZW5zIGF2YWlsYWJsZQQJdm90ZVBvd2VyCQETYWRhcHRWb3RlUG93ZXJTdGFrZQIJAKUIAQgFAWkGY2FsbGVyCQEBLQEFCHdkQW1vdW50CQDOCAIJAM4IAgkBEmNsYWltU3Rha2luZ1Jlc3VsdAEIBQFpBmNhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVN0YWtlZEFtb3VudAEIBQFpBmNhbGxlcgkAZQIFDHN0YWtlZEFtb3VudAUId2RBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tleUdsb2JhbFN0YWtlZAkAZQIJAQ10cnlHZXRJbnRlZ2VyAQUPa2V5R2xvYmFsU3Rha2VkBQh3ZEFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCHdkQW1vdW50BQxzaGFyZVRva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQICD2xhc3Rfc3Rha2luZ193ZAUId2RBbW91bnQFA25pbAUJdm90ZVBvd2VyAWkBD3N0YWtlRmFybVRva2VucwEIY29tcG91bmQDCQEMaXNMaXF1aWRhdGVkAAkAAgECF0NTRlQ6IENGIGlzIGxpcXVpZGF0ZWQhBAxzaGFyZVRva2VuSWQJAQ9nZXRTaGFyZUFzc2V0SWQAAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHENTRlQ6IFRvIG1hbnkgcGF5bWVudHMgYWRkZWQDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDHNoYXJlVG9rZW5JZAkAAgECE0NTRlQ6IFdyb25nIGFzc2V0SWQEBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDCQAAAgUGYW1vdW50AAAJAAIBAipDU0ZUOiBQbGVhc2UgYXR0YWNoIHBvc2l0aXZlIGFzc2V0IGFtb3VudCEDBQhjb21wb3VuZAkAAgECHENTRlQ6IENvbXBvdW5kIHdhcyBkaXNhYmxlZCEECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBBF0b3RhbFN0YWtlZEFtb3VudAkBDXRyeUdldEludGVnZXIBBQ9rZXlHbG9iYWxTdGFrZWQDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDHNoYXJlVG9rZW5JZAkAAgECGkNTRlQ6IHdyb25nIGFzc2V0IGF0dGFjaGVkBAl2b3RlUG93ZXIJARNhZGFwdFZvdGVQb3dlclN0YWtlAgkApQgBCAUBaQZjYWxsZXIFBmFtb3VudAkAzggCCQDOCAIJARJjbGFpbVN0YWtpbmdSZXN1bHQBCAUBaQZjYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tleUdsb2JhbFN0YWtlZAkAZAIFEXRvdGFsU3Rha2VkQW1vdW50BQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlTdGFrZWRBbW91bnQBCAUBaQZjYWxsZXIJAGQCCQENdHJ5R2V0SW50ZWdlcgEJAQ9rZXlTdGFrZWRBbW91bnQBCAUBaQZjYWxsZXIFBmFtb3VudAUDbmlsBQl2b3RlUG93ZXIBaQEMaW5pdGlhdGVEYXBwAQdhZGRyZXNzAwkBDGlzTGlxdWlkYXRlZAAJAAIBAhZDSUQ6IENGIGlzIGxpcXVpZGF0ZWQhAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIrQ0lEOiBDYW4gYmUgY2FsbGVkIG9ubHkgYnkgdGhlIGRhcHAtYWNjb3VudAkBF3NldENGQWRkcmVzc0FuZEluaXRpYXRlAQUHYWRkcmVzcwFpAQtjbGFpbVJld2FyZAADCQEMaXNMaXF1aWRhdGVkAAkAAgECFkNDUjogQ0YgaXMgbGlxdWlkYXRlZCEDCQBmAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIeQ0NSOiBQbGVhc2UgZG9uJ3QgYWRkIHBheW1lbnRzCQESY2xhaW1TdGFraW5nUmVzdWx0AQgFAWkGY2FsbGVyAIIx91Q=", "height": 2210024, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let keyMAccPKey = "master_pk"
5+
6+func getCFAddress () = addressFromStringValue(valueOrErrorMessage(getString(this, "CF_ADDRESS"), "CF_ADDRESS not found"))
7+
8+
9+let mAccPKey = fromBase58String(valueOrErrorMessage(getString(getCFAddress(), keyMAccPKey), (keyMAccPKey + " not found")))
10+
11+let mAccAddr = addressFromPublicKey(mAccPKey)
12+
13+func getCouponsAddress () = addressFromStringValue(getStringValue(mAccAddr, "COUPONS_ADDRESS"))
14+
15+
16+let keyTotalCompound = "total_compound"
17+
18+let keyStakedCompound = "staked_compound"
19+
20+let keyLastVP = "last_virtual_price"
21+
22+let VPScale = 100000000
23+
24+func keyStakedCompoundUser (user) = ((toString(user) + "_") + keyStakedCompound)
25+
26+
27+func calcVirtualPrice (totalStaked,total) = if ((total == 0))
28+ then 1
29+ else if ((totalStaked == 0))
30+ then 1
31+ else fraction(total, VPScale, totalStaked)
32+
33+
34+let Scale = 100000000
35+
36+func keyStakedAmount (address) = (toString(address) + "_farm_staked")
37+
38+
39+func keyLastCheckInterest (address) = (toString(address) + "_lastCheck_interest")
40+
41+
42+func keyEggClaimed (address) = (toString(address) + "_claimed")
43+
44+
45+let keyGlobalLastInterest = "global_lastCheck_interest"
46+
47+let keyGlobalStaked = "global_staked"
48+
49+let keyGlobalEggEarned = "global_earnings"
50+
51+let kLockedInvestments = "locked_investments"
52+
53+func isCollectiveFarmLocked () = match getBoolean(getCFAddress(), kLockedInvestments) {
54+ case b: Boolean =>
55+ b
56+ case _ =>
57+ false
58+}
59+
60+
61+func getEggId () = fromBase58String(getStringValue(mAccAddr, "EGG_ASSET_ID"))
62+
63+
64+func setCFAddressAndInitiate (address) = [StringEntry("CF_ADDRESS", address), IntegerEntry(keyGlobalLastInterest, 1)]
65+
66+
67+func getShareAssetId () = fromBase58String(getStringValue(getCFAddress(), "SHARE_ASSET_ID"))
68+
69+
70+func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
71+ case b: Int =>
72+ b
73+ case _ =>
74+ 0
75+}
76+
77+
78+func tryGetInteger (key) = tryGetIntegerExternal(this, key)
79+
80+
81+func tryGetString (key) = match getString(this, key) {
82+ case a: String =>
83+ a
84+ case _ =>
85+ ""
86+}
87+
88+
89+func getVoteHeightKey () = "VOTE_HEIGHT_START"
90+
91+
92+func getDuration () = if ((tryGetIntegerExternal(mAccAddr, "VOTE_DURATION") == 0))
93+ then 10000
94+ else tryGetIntegerExternal(mAccAddr, "VOTE_DURATION")
95+
96+
97+func getVoteByUserKey (user,height) = ((("VOTE_" + user) + "_") + height)
98+
99+
100+func getTotalVoteByTypeKey (type,height) = ((("VOTE_TOTAL_" + type) + "_") + height)
101+
102+
103+func getTotalVoteKey (height) = ("VOTE_TOTAL_" + height)
104+
105+
106+func resultVoteKey (height) = ("LIQUIDATED_" + height)
107+
108+
109+func quorumVoteKey (height) = ("QUORUM_" + height)
110+
111+
112+func claimStakingResult (address) = {
113+ let currentInterest = tryGetInteger(keyGlobalLastInterest)
114+ let lastCheckInterest = tryGetInteger(keyLastCheckInterest(address))
115+ let stakedAmount = tryGetInteger(keyStakedAmount(address))
116+ let reward = if ((lastCheckInterest > 0))
117+ then fraction((currentInterest - lastCheckInterest), stakedAmount, Scale)
118+ else 0
119+ let transfer = if ((reward > 0))
120+ then [ScriptTransfer(address, reward, getEggId())]
121+ else nil
122+ (transfer ++ [IntegerEntry(keyLastCheckInterest(address), currentInterest), IntegerEntry(keyEggClaimed(address), (tryGetInteger(keyEggClaimed(address)) + reward))])
123+ }
124+
125+
126+func handleStakingTopUp (amount) = {
127+ let currentInterest = tryGetInteger(keyGlobalLastInterest)
128+ let totalStakedAmount = tryGetInteger(keyGlobalStaked)
129+ let interestDelta = if ((totalStakedAmount > 0))
130+ then fraction(amount, Scale, totalStakedAmount)
131+ else 0
132+[IntegerEntry(keyGlobalEggEarned, (tryGetInteger(keyGlobalEggEarned) + amount)), IntegerEntry(keyGlobalLastInterest, (currentInterest + interestDelta))]
133+ }
134+
135+
136+func addVotePower (caller,h,vote,votePower) = if (if ((h == 0))
137+ then true
138+ else (vote == ""))
139+ then nil
140+ else if ((height > (h + getDuration())))
141+ then throw((((((((("CAVP: Voting is finished, please finalize the vote;" + " Arguments: ") + caller) + ", ") + toString(h)) + ", ") + vote) + ", ") + toString(votePower)))
142+ else {
143+ let voteTotalByType = tryGetInteger(getTotalVoteByTypeKey(vote, toString(h)))
144+ let totalVote = tryGetInteger(getTotalVoteKey(toString(h)))
145+[StringEntry(getVoteByUserKey(caller, toString(h)), vote), IntegerEntry(getTotalVoteByTypeKey(vote, toString(h)), (voteTotalByType + votePower)), IntegerEntry(getTotalVoteKey(toString(h)), (totalVote + votePower))]
146+ }
147+
148+
149+func adaptVotePowerStake (caller,votePower) = {
150+ let voteHeight = tryGetInteger(getVoteHeightKey())
151+ let voteByUserString = tryGetString(getVoteByUserKey(caller, toString(voteHeight)))
152+ addVotePower(caller, voteHeight, voteByUserString, votePower)
153+ }
154+
155+
156+func isLiquidated () = {
157+ let voteHeight = tryGetInteger(getVoteHeightKey())
158+ if ((voteHeight == 0))
159+ then false
160+ else getBooleanValue(resultVoteKey(toString(voteHeight)))
161+ }
162+
163+
164+@Callable(i)
165+func claimRefundStaked () = {
166+ let addressStr = toString(i.caller)
167+ let stakedAmount = tryGetInteger(keyStakedAmount(i.caller))
168+ let voteHeight = tryGetInteger(getVoteHeightKey())
169+ let voteByUserString = tryGetString(getVoteByUserKey(addressStr, toString(voteHeight)))
170+ let multiplier = if ((voteByUserString == ""))
171+ then 7
172+ else 10
173+ let refund = ((stakedAmount / 10) * multiplier)
174+ let couponsCall = invoke(getCouponsAddress(), "CFRefund", [addressStr, refund], nil)
175+ if ((couponsCall == couponsCall))
176+ then [IntegerEntry(keyStakedAmount(i.caller), 0), Burn(getShareAssetId(), stakedAmount)]
177+ else throw("Strict value is not equal to itself.")
178+ }
179+
180+
181+
182+@Callable(i)
183+func claimRefundUnstaked () = {
184+ let shareTokenId = getShareAssetId()
185+ if ((size(i.payments) > 1))
186+ then throw("CSFT: To many payments added")
187+ else if ((i.payments[0].assetId != shareTokenId))
188+ then throw("CSFT: Wrong assetId")
189+ else {
190+ let amount = i.payments[0].amount
191+ if ((amount == 0))
192+ then throw("CSFT: Please attach positive asset amount!")
193+ else {
194+ let addressStr = toString(i.caller)
195+ let multiplier = 7
196+ let refund = ((amount / 10) * multiplier)
197+ let couponsCall = invoke(getCouponsAddress(), "CFRefund", [addressStr, refund], nil)
198+ if ((couponsCall == couponsCall))
199+ then [Burn(getShareAssetId(), amount)]
200+ else throw("Strict value is not equal to itself.")
201+ }
202+ }
203+ }
204+
205+
206+
207+@Callable(i)
208+func startVote () = if ((i.caller != mAccAddr))
209+ then throw("CSV: Only the admin can start a liquidation vote for now!")
210+ else if ((tryGetInteger(getVoteHeightKey()) != 0))
211+ then throw("CSV: There is already a vote running!")
212+ else [IntegerEntry("VOTE_HEIGHT_START", height)]
213+
214+
215+
216+@Callable(i)
217+func voteToLiquidate (vote) = {
218+ let votePower = tryGetInteger(keyStakedAmount(i.caller))
219+ if ((votePower == 0))
220+ then throw("CVTL: Please stake some tokens before you can vote!")
221+ else {
222+ let voteAsString = toString(vote)
223+ let voteHeight = tryGetInteger(getVoteHeightKey())
224+ if ((height > (voteHeight + getDuration())))
225+ then throw("CV: Voting is finished, please finalize the vote!")
226+ else {
227+ let voteByUserString = tryGetString(getVoteByUserKey(toString(i.caller), toString(voteHeight)))
228+ if ((voteByUserString != ""))
229+ then throw("CV: You can not change your vote!")
230+ else addVotePower(toString(i.caller), voteHeight, voteAsString, votePower)
231+ }
232+ }
233+ }
234+
235+
236+
237+@Callable(i)
238+func finalizeVote () = {
239+ let voteHeight = tryGetInteger(getVoteHeightKey())
240+ if (((voteHeight + getDuration()) > height))
241+ then throw("CFV: Voting is not finished!")
242+ else {
243+ let totalStakedAmount = tryGetInteger(keyGlobalStaked)
244+ let totalVote = tryGetInteger(getTotalVoteKey(toString(voteHeight)))
245+ let quorum = ((totalVote / totalStakedAmount) * 100)
246+ let voteTotalByYes = tryGetInteger(getTotalVoteByTypeKey("true", toString(voteHeight)))
247+ let voteTotalByNo = tryGetInteger(getTotalVoteByTypeKey("false", toString(voteHeight)))
248+ let liquidated = if ((20 > quorum))
249+ then true
250+ else if ((voteTotalByYes > voteTotalByNo))
251+ then true
252+ else false
253+ let resetKey = if (liquidated)
254+ then nil
255+ else [IntegerEntry(getVoteHeightKey(), 0)]
256+ ([IntegerEntry(quorumVoteKey(toString(voteHeight)), quorum), BooleanEntry(resultVoteKey(toString(voteHeight)), liquidated)] ++ resetKey)
257+ }
258+ }
259+
260+
261+
262+@Callable(i)
263+func topUpReward () = if (isLiquidated())
264+ then throw("CTUR: CF is liquidated!")
265+ else {
266+ let eggAssetId = getEggId()
267+ if ((i.payments[0].assetId != eggAssetId))
268+ then throw("CTUP: Wrong assetId, payment should be EGG")
269+ else {
270+ let resHandleStaking = handleStakingTopUp(i.payments[0].amount)
271+ $Tuple2(resHandleStaking, true)
272+ }
273+ }
274+
275+
276+
277+@Callable(i)
278+func withdrawFarmTokens (amount,compound) = if (isLiquidated())
279+ then throw("CTUR: CF is liquidated!")
280+ else if ((size(i.payments) > 0))
281+ then throw("CWFT: Please don't add payments")
282+ else {
283+ let shareTokenId = getShareAssetId()
284+ if (compound)
285+ then {
286+ let staked = tryGetInteger(keyStakedCompound)
287+ let total = tryGetInteger(keyTotalCompound)
288+ let vp = calcVirtualPrice(staked, total)
289+ let keyStakedCompoundU = keyStakedCompoundUser(i.caller)
290+ let personalStaked = tryGetInteger(keyStakedCompoundU)
291+ let virtualWd = if ((amount == -1))
292+ then personalStaked
293+ else fraction(amount, VPScale, vp)
294+ let amountWd = if ((amount == -1))
295+ then fraction(virtualWd, vp, VPScale)
296+ else amount
297+ if ((virtualWd > personalStaked))
298+ then throw("CWFT: You don't have so much funds to withdraw")
299+ else [IntegerEntry(keyStakedCompoundU, (personalStaked - virtualWd)), IntegerEntry(keyStakedCompound, (staked - virtualWd)), IntegerEntry(keyTotalCompound, (total - amountWd)), ScriptTransfer(i.caller, amountWd, shareTokenId), IntegerEntry(keyLastVP, vp), IntegerEntry("last_virt_compound_wd", virtualWd), IntegerEntry("last_amount_compound_wd", amountWd)]
300+ }
301+ else {
302+ let addressStr = toString(i.caller)
303+ let stakedAmount = tryGetInteger(keyStakedAmount(i.caller))
304+ let wdAmount = if ((amount == -1))
305+ then stakedAmount
306+ else amount
307+ if ((wdAmount > stakedAmount))
308+ then throw("CWFT: you don't have tokens available")
309+ else {
310+ let votePower = adaptVotePowerStake(toString(i.caller), -(wdAmount))
311+ ((claimStakingResult(i.caller) ++ [IntegerEntry(keyStakedAmount(i.caller), (stakedAmount - wdAmount)), IntegerEntry(keyGlobalStaked, (tryGetInteger(keyGlobalStaked) - wdAmount)), ScriptTransfer(i.caller, wdAmount, shareTokenId), IntegerEntry("last_staking_wd", wdAmount)]) ++ votePower)
312+ }
313+ }
314+ }
315+
316+
317+
318+@Callable(i)
319+func stakeFarmTokens (compound) = if (isLiquidated())
320+ then throw("CSFT: CF is liquidated!")
321+ else {
322+ let shareTokenId = getShareAssetId()
323+ if ((size(i.payments) > 1))
324+ then throw("CSFT: To many payments added")
325+ else if ((i.payments[0].assetId != shareTokenId))
326+ then throw("CSFT: Wrong assetId")
327+ else {
328+ let amount = i.payments[0].amount
329+ if ((amount == 0))
330+ then throw("CSFT: Please attach positive asset amount!")
331+ else if (compound)
332+ then throw("CSFT: Compound was disabled!")
333+ else {
334+ let addressStr = toString(i.caller)
335+ let totalStakedAmount = tryGetInteger(keyGlobalStaked)
336+ if ((i.payments[0].assetId != shareTokenId))
337+ then throw("CSFT: wrong asset attached")
338+ else {
339+ let votePower = adaptVotePowerStake(toString(i.caller), amount)
340+ ((claimStakingResult(i.caller) ++ [IntegerEntry(keyGlobalStaked, (totalStakedAmount + amount)), IntegerEntry(keyStakedAmount(i.caller), (tryGetInteger(keyStakedAmount(i.caller)) + amount))]) ++ votePower)
341+ }
342+ }
343+ }
344+ }
345+
346+
347+
348+@Callable(i)
349+func initiateDapp (address) = if (isLiquidated())
350+ then throw("CID: CF is liquidated!")
351+ else if ((i.caller != this))
352+ then throw("CID: Can be called only by the dapp-account")
353+ else setCFAddressAndInitiate(address)
354+
355+
356+
357+@Callable(i)
358+func claimReward () = if (isLiquidated())
359+ then throw("CCR: CF is liquidated!")
360+ else if ((size(i.payments) > 0))
361+ then throw("CCR: Please don't add payments")
362+ else claimStakingResult(i.caller)
363+
364+

github/deemru/w8io/873ac7e 
25.16 ms