tx · 39yN9B3cFNUELJvo8AnR4a76UkmazLK9xYofXQndrUZG

3N4kXZHGke6yRq3Z57q7BTgCrT2SCvQCYER:  -0.01400000 Waves

2022.12.20 19:34 [2368843] smart account 3N4kXZHGke6yRq3Z57q7BTgCrT2SCvQCYER > SELF 0.00000000 Waves

{ "type": 13, "id": "39yN9B3cFNUELJvo8AnR4a76UkmazLK9xYofXQndrUZG", "fee": 1400000, "feeAssetId": null, "timestamp": 1671553950358, "version": 2, "chainId": 84, "sender": "3N4kXZHGke6yRq3Z57q7BTgCrT2SCvQCYER", "senderPublicKey": "6sxdMr2xYPPACEJccwmgS7nWC2ez1c38Y1kDX49ne42b", "proofs": [ "b1Yiw3Jqtd7pz8T9SJ3NKvNcqNkPBx68V37HuyK43xun5oVBcHPzTivwq9j6VxSWgc5A4HGa1otJZAi1RVDyS7p" ], "script": "base64:BgIoCAISBgoECAgICBIAEgASABIECgIBARIAEgMKAQgSAwoBCBIECgIBASIACVNFUEFSQVRPUgICX18ABVdBVkVTAgVXQVZFUwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAA5LRVlfQkFTRV9BU1NFVAIKQkFTRV9BU1NFVAAJS0VZX0FTU0VUAgVBU1NFVAATS0VZX1NUQUtJTkdfQURBUFRFUgIPU1RBS0lOR19BREFQVEVSABJLRVlfU1RBS0lOR19BTU9VTlQCDlNUQUtJTkdfQU1PVU5UAA1LRVlfTEFTVF9SQVRFAglMQVNUX1JBVEUAEEtFWV9DVVJSRU5UX1JBVEUCDENVUlJFTlRfUkFURQAPS0VZX0xBU1RfSEVJR0hUAgtMQVNUX0hFSUdIVAARS0VZX1RBUkdFVF9IRUlHSFQCDVRBUkdFVF9IRUlHSFQAF0tFWV9TUE9OU09SU0hJUF9NQU5BR0VSAhNTUE9OU09SU0hJUF9NQU5BR0VSAApGVU5DX1NUQUtFAgVzdGFrZQAMRlVOQ19VTlNUQUtFAgd1bnN0YWtlABFGVU5DX0NMQUlNX1JFV0FSRAILY2xhaW1SZXdhcmQADlBFUkNFTlRfRkFDVE9SCQC2AgEAgKCUpY0dAAtaRVJPX0JJR0lOVAkAtgIBAAAACk9ORV9CSUdJTlQJALYCAQABAAtJTklUX0FNT1VOVACAwtcvARBfdmFsaWRhdGVBZGRyZXNzAQhhZGRyZXNzXwQHJG1hdGNoMAkApggBBQhhZGRyZXNzXwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgcBDl92YWxpZGF0ZUFzc2V0AQZhc3NldF8DCQAAAgUGYXNzZXRfBQVXQVZFUwYEByRtYXRjaDAJAOwHAQkA2QQBBQZhc3NldF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGBwEOX3RvQXNzZXRWZWN0b3IBBmFzc2V0XwMJAAACBQZhc3NldF8FBVdBVkVTBQR1bml0CQDZBAEFBmFzc2V0XwERX2dldEFzc2V0RGVjaW1hbHMBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAEByRtYXRjaDEJAOwHAQUBYQMJAAECBQckbWF0Y2gxAgVBc3NldAQFYXNzZXQFByRtYXRjaDEIBQVhc3NldAhkZWNpbWFscwkAAgECIF9nZXRBc3NldERlY2ltYWxzOiBubyBzdWNoIGFzc2V0AAgBEV9nZXRBc3NldFF1YW50aXR5AQZhc3NldF8EByRtYXRjaDAJAOwHAQUGYXNzZXRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwCAUBYQhxdWFudGl0eQkAAgECIF9nZXRBc3NldFF1YW50aXR5OiBubyBzdWNoIGFzc2V0ARBfZ2V0QXNzZXRCYWxhbmNlAgZhc3NldF8HYWRkcmVzcwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJAPAHAgUHYWRkcmVzcwUBYQgJAO8HAQUHYWRkcmVzcwdyZWd1bGFyAQ5fbG9hZEJhc2VBc3NldAAEByRtYXRjaDAJAKIIAQUOS0VZX0JBU0VfQVNTRVQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAAAIFAWEFBVdBVkVTBQR1bml0CQDZBAEFAWEJAAIBAh1fbG9hZEJhc2VBc3NldDogbm8gYmFzZSBhc3NldAETX2xvYWRTdGFraW5nQWRhcHRlcgAEByRtYXRjaDAJAKIIAQUTS0VZX1NUQUtJTkdfQURBUFRFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAAIBAidfbG9hZFN0YWtpbmdBZGFwdGVyOiBubyBzdGFraW5nIGFkYXB0ZXIBF19sb2FkU3BvbnNvcnNoaXBNYW5hZ2VyAAQHJG1hdGNoMAkAoggBBRdLRVlfU1BPTlNPUlNISVBfTUFOQUdFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAAIBAi9fbG9hZFNwb25zb3JzaGlwTWFuYWdlcjogbm8gc3BvbnNvcnNoaXAgbWFuYWdlcgEIX2xvYWRJbnQCBGtleV8IZGVmYXVsdF8EByRtYXRjaDAJAJ8IAQUEa2V5XwMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEFCGRlZmF1bHRfAQtfbG9hZEJpZ0ludAIEa2V5XwhkZWZhdWx0XwQHJG1hdGNoMAkAoQgBBQRrZXlfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJAJ4DAQUBYQUIZGVmYXVsdF8BCl9sb2FkQXNzZXQABAckbWF0Y2gwCQCiCAEFCUtFWV9BU1NFVAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJANkEAQUBYQEAAQ5fdXBkYXRlU3Rha2luZwMGYXNzZXRfB2Ftb3VudF8IYWRhcHRlcl8EDXN0YWtpbmdBbW91bnQJAQhfbG9hZEludAIFEktFWV9TVEFLSU5HX0FNT1VOVAAABBBuZXdTdGFraW5nQW1vdW50CQBkAgUNc3Rha2luZ0Ftb3VudAUHYW1vdW50XwQKaW52b2NhdGlvbgMJAGYCBQdhbW91bnRfAAAJAPwHBAUIYWRhcHRlcl8FCkZVTkNfU1RBS0UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUGYXNzZXRfBQdhbW91bnRfBQNuaWwJAPwHBAUIYWRhcHRlcl8FDEZVTkNfVU5TVEFLRQkAzAgCCQBoAgD///////////8BBQdhbW91bnRfBQNuaWwFA25pbAMJAAACBQppbnZvY2F0aW9uBQppbnZvY2F0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJLRVlfU1RBS0lOR19BTU9VTlQFEG5ld1N0YWtpbmdBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELX2NoZWNrcG9pbnQBDGNvbXBlbnNhdGlvbgQKaW52b2NhdGlvbgkA/AcECQETX2xvYWRTdGFraW5nQWRhcHRlcgAFEUZVTkNfQ0xBSU1fUkVXQVJEBQNuaWwFA25pbAMJAAACBQppbnZvY2F0aW9uBQppbnZvY2F0aW9uBAckbWF0Y2gwBQppbnZvY2F0aW9uAwkAAQIFByRtYXRjaDACDyhJbnQsIEludCwgSW50KQQGcmV3YXJkBQckbWF0Y2gwAwUMY29tcGVuc2F0aW9uBAVzdGFrZQkA/AcEBQR0aGlzBQpGVU5DX1NUQUtFCQDMCAIIBQZyZXdhcmQCXzEJAMwIAggFBnJld2FyZAJfMwUDbmlsBQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlCQCUCgIGCAUGcmV3YXJkAl8yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAVzdGFrZQkA/AcEBQR0aGlzBQpGVU5DX1NUQUtFCQDMCAIJAGQCCAUGcmV3YXJkAl8xCAUGcmV3YXJkAl8yCQDMCAIIBQZyZXdhcmQCXzMFA25pbAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQkAlAoCBgAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIHAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAWkBBGluaXQECnRva2VuTmFtZV8LdG9rZW5EZXNjcl8KYmFzZUFzc2V0Xw9zdGFraW5nQWRhcHRlcl8ECG11bHRpc2lnCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUMS0VZX01VTFRJU0lHAhVpbml0OiBubyBtdWx0aXNpZyBzZXQDCQAAAgUIbXVsdGlzaWcFCG11bHRpc2lnBAVhc3NldAkBCl9sb2FkQXNzZXQABAliYXNlQXNzZXQJAQ5fdG9Bc3NldFZlY3RvcgEFCmJhc2VBc3NldF8EA2VycgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECF2luaXQ6IHBlcm1pc3Npb24gZGVuaWVkAwkBAiE9AgUFYXNzZXQBAAkAAgECGWluaXQ6IGFscmVhZHkgaW5pdGlhbGl6ZWQDAwkAZgIABAkAsQIBBQp0b2tlbk5hbWVfBgkAZgIJALECAQUKdG9rZW5OYW1lXwAQCQACAQIYaW5pdDogaW52YWxpZCB0b2tlbiBuYW1lAwkAZgIJALECAQULdG9rZW5EZXNjcl8A6AcJAAIBAh9pbml0OiBpbnZhbGlkIHRva2VuIGRlc2NyaXB0aW9uAwkBASEBCQEOX3ZhbGlkYXRlQXNzZXQBBQpiYXNlQXNzZXRfCQACAQIYaW5pdDogaW52YWxpZCBiYXNlIGFzc2V0AwkBASEBCQEQX3ZhbGlkYXRlQWRkcmVzcwEFD3N0YWtpbmdBZGFwdGVyXwkAAgECHWluaXQ6IGludmFsaWQgc3Rha2luZyBhZGFwdGVyBQR1bml0AwkAAAIFA2VycgUDZXJyBA10b2tlbkRlY2ltYWxzCQERX2dldEFzc2V0RGVjaW1hbHMBBQliYXNlQXNzZXQEBWlzc3VlCQDCCAUFCnRva2VuTmFtZV8FC3Rva2VuRGVzY3JfBQtJTklUX0FNT1VOVAUNdG9rZW5EZWNpbWFscwYEB2Fzc2V0SWQJALgIAQUFaXNzdWUEDHN0YWtlQWN0aW9ucwkBDl91cGRhdGVTdGFraW5nAwUJYmFzZUFzc2V0BQtJTklUX0FNT1VOVAkBEUBleHRyTmF0aXZlKDEwNjIpAQUPc3Rha2luZ0FkYXB0ZXJfCQCUCgIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQ5LRVlfQkFTRV9BU1NFVAUKYmFzZUFzc2V0XwkAzAgCCQELU3RyaW5nRW50cnkCBRNLRVlfU1RBS0lOR19BREFQVEVSBQ9zdGFraW5nQWRhcHRlcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUJS0VZX0FTU0VUCQDYBAEFB2Fzc2V0SWQJAMwIAgUFaXNzdWUFA25pbAUMc3Rha2VBY3Rpb25zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2dldFJhdGUABAhsYXN0UmF0ZQkBC19sb2FkQmlnSW50AgUNS0VZX0xBU1RfUkFURQUOUEVSQ0VOVF9GQUNUT1IEC2N1cnJlbnRSYXRlCQELX2xvYWRCaWdJbnQCBRBLRVlfQ1VSUkVOVF9SQVRFBQtaRVJPX0JJR0lOVAQKbGFzdEhlaWdodAkBCF9sb2FkSW50AgUPS0VZX0xBU1RfSEVJR0hUAAAEDHRhcmdldEhlaWdodAkAlwMBCQDMCAIJAQhfbG9hZEludAIFEUtFWV9UQVJHRVRfSEVJR0hUAAAJAMwIAgUGaGVpZ2h0BQNuaWwEBHJhdGUJALcCAgUIbGFzdFJhdGUJALkCAgULY3VycmVudFJhdGUJALYCAQkAZQIFDHRhcmdldEhlaWdodAUKbGFzdEhlaWdodAkAlAoCBQNuaWwJAKYDAQUEcmF0ZQFpAQpjaGVja3BvaW50AAQKY2hlY2twb2ludAkBC19jaGVja3BvaW50AQYDCQAAAgUKY2hlY2twb2ludAUKY2hlY2twb2ludAMJAQEhAQgFCmNoZWNrcG9pbnQCXzEJAAIBAhVjaGVja3BvaW50OiBubyByZXdhcmQDCQBmAggFCmNoZWNrcG9pbnQCXzIAAAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpDG9yaWdpbkNhbGxlcggFCmNoZWNrcG9pbnQCXzIJAQ5fbG9hZEJhc2VBc3NldAAFA25pbAUEdW5pdAkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAAEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIECWJhc2VBc3NldAkBDl9sb2FkQmFzZUFzc2V0AAQFYXNzZXQJAQpfbG9hZEFzc2V0AAQNYXNzZXRRdWFudGl0eQkAtgIBCQERX2dldEFzc2V0UXVhbnRpdHkBBQVhc3NldAQDZXJyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIUZGVwb3NpdDogbm8gcGF5bWVudHMDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFCWJhc2VBc3NldAkAAgECJWRlcG9zaXQ6IHBheW1lbnQgaXMgbm90IGluIGJhc2UgYXNzZXQDCQBnAgAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAAgECH2RlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhbW91bnQFBHVuaXQDCQAAAgUDZXJyBQNlcnIECmNoZWNrcG9pbnQJAQtfY2hlY2twb2ludAEHAwkAAAIFCmNoZWNrcG9pbnQFCmNoZWNrcG9pbnQECGxhc3RSYXRlCQELX2xvYWRCaWdJbnQCBQ1LRVlfTEFTVF9SQVRFBQ5QRVJDRU5UX0ZBQ1RPUgQLY3VycmVudFJhdGUJAQtfbG9hZEJpZ0ludAIFEEtFWV9DVVJSRU5UX1JBVEUFC1pFUk9fQklHSU5UBApsYXN0SGVpZ2h0CQEIX2xvYWRJbnQCBQ9LRVlfTEFTVF9IRUlHSFQAAAQMdGFyZ2V0SGVpZ2h0CQCXAwEJAMwIAgkBCF9sb2FkSW50AgURS0VZX1RBUkdFVF9IRUlHSFQAAAkAzAgCBQZoZWlnaHQFA25pbAQPbGFzdFJhdGVVcGRhdGVkCQC3AgIFCGxhc3RSYXRlCQC5AgIFC2N1cnJlbnRSYXRlCQC2AgEJAGUCBQx0YXJnZXRIZWlnaHQFCmxhc3RIZWlnaHQEC2lzc3VlQW1vdW50CQCgAwEJAL0CBAkAtgIBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUOUEVSQ0VOVF9GQUNUT1IFD2xhc3RSYXRlVXBkYXRlZAUFRkxPT1IEEmN1cnJlbnRSYXRlVXBkYXRlZAkAvQIEBQtjdXJyZW50UmF0ZQUNYXNzZXRRdWFudGl0eQkAtwICBQ1hc3NldFF1YW50aXR5CQC2AgEFC2lzc3VlQW1vdW50BQVGTE9PUgQRbGFzdEhlaWdodFVwZGF0ZWQFDHRhcmdldEhlaWdodAQMc3Rha2VBY3Rpb25zCQEOX3VwZGF0ZVN0YWtpbmcDBQliYXNlQXNzZXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQETX2xvYWRTdGFraW5nQWRhcHRlcgAJAJQKAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUFYXNzZXQFC2lzc3VlQW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2lzc3VlQW1vdW50BQVhc3NldAkAzAgCCQELQmluYXJ5RW50cnkCBQ1LRVlfTEFTVF9SQVRFCQCdAwEFD2xhc3RSYXRlVXBkYXRlZAkAzAgCCQELQmluYXJ5RW50cnkCBRBLRVlfQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPS0VZX0xBU1RfSEVJR0hUBRFsYXN0SGVpZ2h0VXBkYXRlZAUDbmlsBQxzdGFrZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFc3Rha2UCB2Ftb3VudF8Nc3ByZWFkQmxvY2tzXwQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgQJYmFzZUFzc2V0CQEOX2xvYWRCYXNlQXNzZXQABAVhc3NldAkBCl9sb2FkQXNzZXQABA1hc3NldFF1YW50aXR5CQC2AgEJARFfZ2V0QXNzZXRRdWFudGl0eQEFBWFzc2V0BANlcnIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhlzdGFrZTogb25seSB0aGlzIGNvbnRyYWN0AwkAZwIAAAUHYW1vdW50XwkAAgECG3N0YWtlOiBpbnZhbGlkIHN0YWtlIGFtb3VudAMJAGYCBQdhbW91bnRfCQEQX2dldEFzc2V0QmFsYW5jZQIFCWJhc2VBc3NldAUEdGhpcwkAAgECIHN0YWtlOiBpbnN1ZmZpY2llbnQgc3Rha2UgYW1vdW50AwkAAAIFDWFzc2V0UXVhbnRpdHkFC1pFUk9fQklHSU5UCQACAQIfc3Rha2U6IG5vIGRlcG9zaXRzIHRvIHN0YWtlIGZvcgUEdW5pdAMJAAACBQNlcnIFA2VycgQIbGFzdFJhdGUJAQtfbG9hZEJpZ0ludAIFDUtFWV9MQVNUX1JBVEUFDlBFUkNFTlRfRkFDVE9SBAtjdXJyZW50UmF0ZQkBC19sb2FkQmlnSW50AgUQS0VZX0NVUlJFTlRfUkFURQULWkVST19CSUdJTlQECmxhc3RIZWlnaHQJAQhfbG9hZEludAIFD0tFWV9MQVNUX0hFSUdIVAAABAx0YXJnZXRIZWlnaHQJAQhfbG9hZEludAIFEUtFWV9UQVJHRVRfSEVJR0hUAAAED21pblRhcmdldEhlaWdodAkAlwMBCQDMCAIFDHRhcmdldEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAQHYWN0aW9ucwMJAAACBQ9taW5UYXJnZXRIZWlnaHQFBmhlaWdodAQPbGFzdFJhdGVVcGRhdGVkCQC3AgIFCGxhc3RSYXRlCQC5AgIJALYCAQkAZQIFD21pblRhcmdldEhlaWdodAUKbGFzdEhlaWdodAULY3VycmVudFJhdGUED3JlbWFpbmluZ1Jld2FyZAkAuQICBQtjdXJyZW50UmF0ZQkAtgIBCQBlAgUMdGFyZ2V0SGVpZ2h0BQ9taW5UYXJnZXRIZWlnaHQEEmN1cnJlbnRSYXRlVXBkYXRlZAkAvAIDCQC3AgIJALkCAgkAtgIBBQdhbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgUPcmVtYWluaW5nUmV3YXJkBQpPTkVfQklHSU5UCQC5AgIFDWFzc2V0UXVhbnRpdHkJALYCAQUNc3ByZWFkQmxvY2tzXwQRbGFzdEhlaWdodFVwZGF0ZWQFBmhlaWdodAQTdGFyZ2V0SGVpZ2h0VXBkYXRlZAkAZAIFEWxhc3RIZWlnaHRVcGRhdGVkBQ1zcHJlYWRCbG9ja3NfCQDMCAIJAQtCaW5hcnlFbnRyeQIFDUtFWV9MQVNUX1JBVEUJAJ0DAQUPbGFzdFJhdGVVcGRhdGVkCQDMCAIJAQtCaW5hcnlFbnRyeQIFEEtFWV9DVVJSRU5UX1JBVEUJAJ0DAQUSY3VycmVudFJhdGVVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9LRVlfTEFTVF9IRUlHSFQFEWxhc3RIZWlnaHRVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFLRVlfVEFSR0VUX0hFSUdIVAUTdGFyZ2V0SGVpZ2h0VXBkYXRlZAUDbmlsAwkAZgIFDHRhcmdldEhlaWdodAUKbGFzdEhlaWdodAQPbGFzdFJhdGVVcGRhdGVkCQC3AgIFCGxhc3RSYXRlCQC5AgIJALYCAQkAZQIFDHRhcmdldEhlaWdodAUKbGFzdEhlaWdodAULY3VycmVudFJhdGUEEmN1cnJlbnRSYXRlVXBkYXRlZAkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC5AgIFDWFzc2V0UXVhbnRpdHkJALYCAQUNc3ByZWFkQmxvY2tzXwQRbGFzdEhlaWdodFVwZGF0ZWQFBmhlaWdodAQTdGFyZ2V0SGVpZ2h0VXBkYXRlZAkAZAIFEWxhc3RIZWlnaHRVcGRhdGVkBQ1zcHJlYWRCbG9ja3NfCQDMCAIJAQtCaW5hcnlFbnRyeQIFDUtFWV9MQVNUX1JBVEUJAJ0DAQUPbGFzdFJhdGVVcGRhdGVkCQDMCAIJAQtCaW5hcnlFbnRyeQIFEEtFWV9DVVJSRU5UX1JBVEUJAJ0DAQUSY3VycmVudFJhdGVVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9LRVlfTEFTVF9IRUlHSFQFEWxhc3RIZWlnaHRVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFLRVlfVEFSR0VUX0hFSUdIVAUTdGFyZ2V0SGVpZ2h0VXBkYXRlZAUDbmlsBBJjdXJyZW50UmF0ZVVwZGF0ZWQJALwCAwkAtgIBBQdhbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAuQICBQ1hc3NldFF1YW50aXR5CQC2AgEFDXNwcmVhZEJsb2Nrc18EEWxhc3RIZWlnaHRVcGRhdGVkBQZoZWlnaHQEE3RhcmdldEhlaWdodFVwZGF0ZWQJAGQCBRFsYXN0SGVpZ2h0VXBkYXRlZAUNc3ByZWFkQmxvY2tzXwkAzAgCCQELQmluYXJ5RW50cnkCBRBLRVlfQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPS0VZX0xBU1RfSEVJR0hUBRFsYXN0SGVpZ2h0VXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURS0VZX1RBUkdFVF9IRUlHSFQFE3RhcmdldEhlaWdodFVwZGF0ZWQFA25pbAQMc3Rha2VBY3Rpb25zCQEOX3VwZGF0ZVN0YWtpbmcDBQliYXNlQXNzZXQFB2Ftb3VudF8JARNfbG9hZFN0YWtpbmdBZGFwdGVyAAkAlAoCCQDOCAIFB2FjdGlvbnMFDHN0YWtlQWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwAEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIECWJhc2VBc3NldAkBDl9sb2FkQmFzZUFzc2V0AAQFYXNzZXQJAQpfbG9hZEFzc2V0AAQNYXNzZXRRdWFudGl0eQkAtgIBCQERX2dldEFzc2V0UXVhbnRpdHkBBQVhc3NldAQDZXJyAwkAZgIAAQkAkAMBCAUBaQhwYXltZW50cwkAAgECFXdpdGhkcmF3OiBubyBwYXltZW50cwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUFYXNzZXQJAAIBAil3aXRoZHJhdzogcGF5bWVudCBpcyBub3QgaW4gY29ycmVjdCBhc3NldAMJAGcCAAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQACAQIgd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudCBhbW91bnQFBHVuaXQDCQAAAgUDZXJyBQNlcnIECmNoZWNrcG9pbnQJAQtfY2hlY2twb2ludAEHAwkAAAIFCmNoZWNrcG9pbnQFCmNoZWNrcG9pbnQECGxhc3RSYXRlCQELX2xvYWRCaWdJbnQCBQ1LRVlfTEFTVF9SQVRFBQ5QRVJDRU5UX0ZBQ1RPUgQLY3VycmVudFJhdGUJAQtfbG9hZEJpZ0ludAIFEEtFWV9DVVJSRU5UX1JBVEUFC1pFUk9fQklHSU5UBApsYXN0SGVpZ2h0CQEIX2xvYWRJbnQCBQ9LRVlfTEFTVF9IRUlHSFQAAAQMdGFyZ2V0SGVpZ2h0CQCXAwEJAMwIAgkBCF9sb2FkSW50AgURS0VZX1RBUkdFVF9IRUlHSFQAAAkAzAgCBQZoZWlnaHQFA25pbAQPbGFzdFJhdGVVcGRhdGVkCQC3AgIFCGxhc3RSYXRlCQC5AgIFC2N1cnJlbnRSYXRlCQC2AgEJAGUCBQx0YXJnZXRIZWlnaHQFCmxhc3RIZWlnaHQECmJhc2VBbW91bnQJAKADAQkAvQIECQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ9sYXN0UmF0ZVVwZGF0ZWQFDlBFUkNFTlRfRkFDVE9SBQVGTE9PUgQSY3VycmVudFJhdGVVcGRhdGVkCQC9AgQFC2N1cnJlbnRSYXRlBQ1hc3NldFF1YW50aXR5CQC4AgIFDWFzc2V0UXVhbnRpdHkJALYCAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBUZMT09SBBFsYXN0SGVpZ2h0VXBkYXRlZAUMdGFyZ2V0SGVpZ2h0BAxzdGFrZUFjdGlvbnMJAQ5fdXBkYXRlU3Rha2luZwMFCWJhc2VBc3NldAkAaAIA////////////AQUKYmFzZUFtb3VudAkBE19sb2FkU3Rha2luZ0FkYXB0ZXIACQCUCgIJAM4IAgUMc3Rha2VBY3Rpb25zCQDMCAIJAQRCdXJuAgUFYXNzZXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKYmFzZUFtb3VudAUEdW5pdAkAzAgCCQELQmluYXJ5RW50cnkCBQ1LRVlfTEFTVF9SQVRFCQCdAwEFD2xhc3RSYXRlVXBkYXRlZAkAzAgCCQELQmluYXJ5RW50cnkCBRBLRVlfQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPS0VZX0xBU1RfSEVJR0hUBRFsYXN0SGVpZ2h0VXBkYXRlZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHnNldE11bHRpc2lnOiBwZXJtaXNzaW9uIGRlbmllZAMJAQEhAQkBEF92YWxpZGF0ZUFkZHJlc3MBBQltdWx0aXNpZ18JAAIBAiVzZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZyBhZGRyZXNzBQR1bml0AwkAAAIFA2VycgUDZXJyCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX01VTFRJU0lHBQltdWx0aXNpZ18FA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVzZXRTcG9uc29yc2hpcE1hbmFnZXIBCG1hbmFnZXJfBANlcnIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAihzZXRTcG9uc29yc2hpcE1hbmFnZXI6IHBlcm1pc3Npb24gZGVuaWVkAwkBASEBCQEQX3ZhbGlkYXRlQWRkcmVzcwEFCG1hbmFnZXJfCQACAQIuc2V0U3BvbnNvcnNoaXBNYW5hZ2VyOiBpbnZhbGlkIG1hbmFnZXIgYWRkcmVzcwUEdW5pdAMJAAACBQNlcnIFA2VycgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFF0tFWV9TUE9OU09SU0hJUF9NQU5BR0VSBQhtYW5hZ2VyXwUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXVwZGF0ZVNwb25zb3JzaGlwAhVtaW5TcG9uc29yZWRBc3NldEZlZV8Ud2F2ZXNSZXF1aXJlZEFtb3VudF8EA2VycgMJAQIhPQIIBQFpBmNhbGxlcgkBF19sb2FkU3BvbnNvcnNoaXBNYW5hZ2VyAAkAAgECJHVwZGF0ZVNwb25zb3JzaGlwOiBwZXJtaXNzaW9uIGRlbmllZAMJAGYCAAAFFW1pblNwb25zb3JlZEFzc2V0RmVlXwkAAgECKnVwZGF0ZVNwb25zb3JzaGlwOiBpbnZhbGlkIHNwb25zb3JzaGlwIGZlZQMJAGYCAAAFFHdhdmVzUmVxdWlyZWRBbW91bnRfCQACAQIwdXBkYXRlU3BvbnNvcnNoaXA6IGludmFsaWQgd2F2ZXMgcmVxdWlyZWQgYW1vdW50BQR1bml0AwkAAAIFA2VycgUDZXJyBAxzcG9uc29yQXNzZXQJAQpfbG9hZEFzc2V0AAQNc3BvbnNvckFtb3VudAkA8AcCBQR0aGlzBQxzcG9uc29yQXNzZXQEFG1pblNwb25zb3JlZEFzc2V0RmVlAwkAAAIFFW1pblNwb25zb3JlZEFzc2V0RmVlXwAABQR1bml0BRVtaW5TcG9uc29yZWRBc3NldEZlZV8EB2FjdGlvbnMDCQBmAggJAO8HAQUEdGhpcwdyZWd1bGFyBRR3YXZlc1JlcXVpcmVkQW1vdW50XwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCCAkA7wcBBQR0aGlzB3JlZ3VsYXIFFHdhdmVzUmVxdWlyZWRBbW91bnRfBQR1bml0BQNuaWwFA25pbAkAlAoCCQDOCAIFB2FjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ1zcG9uc29yQW1vdW50BQxzcG9uc29yQXNzZXQJAMwIAgkBClNwb25zb3JGZWUCBQxzcG9uc29yQXNzZXQFFG1pblNwb25zb3JlZEFzc2V0RmVlBQNuaWwFDXNwb25zb3JBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcECG11bHRpc2lnBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG11bHRpc2lnCQC5CQIJAMwIAgUKS0VZX1NUQVRVUwkAzAgCCQClCAEFBHRoaXMJAMwIAgkA2AQBCAUCdHgCaWQFA25pbAUJU0VQQVJBVE9SBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleTPH3qY=", "height": 2368843, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ESTcvu8S9pTZiz2248A3tUjFUKUHsdjdtZPLT5nb8ZAL Next: none Diff:
OldNewDifferences
183183 @Callable(i)
184184 func init (tokenName_,tokenDescr_,baseAsset_,stakingAdapter_) = {
185185 let multisig = valueOrErrorMessage(getString(KEY_MULTISIG), "init: no multisig set")
186- let asset = _loadAsset()
187- let baseAsset = _toAssetVector(baseAsset_)
188- let err = if ((i.caller != this))
189- then throw("init: permission denied")
190- else if ((asset != base58''))
191- then throw("init: already initialized")
192- else if (if ((4 > size(tokenName_)))
193- then true
194- else (size(tokenName_) > 16))
195- then throw("init: invalid token name")
196- else if ((size(tokenDescr_) > 1000))
197- then throw("init: invalid token description")
198- else if (!(_validateAsset(baseAsset_)))
199- then throw("init: invalid base asset")
200- else if (!(_validateAddress(stakingAdapter_)))
201- then throw("init: invalid staking adapter")
202- else unit
203- if ((err == err))
186+ if ((multisig == multisig))
204187 then {
205- let tokenDecimals = _getAssetDecimals(baseAsset)
206- let issue = Issue(tokenName_, tokenDescr_, INIT_AMOUNT, tokenDecimals, true)
207- let assetId = calculateAssetId(issue)
208- let stakeActions = _updateStaking(baseAsset, INIT_AMOUNT, addressFromStringValue(stakingAdapter_))
209- $Tuple2(([StringEntry(KEY_BASE_ASSET, baseAsset_), StringEntry(KEY_STAKING_ADAPTER, stakingAdapter_), StringEntry(KEY_ASSET, toBase58String(assetId)), issue] ++ stakeActions), unit)
188+ let asset = _loadAsset()
189+ let baseAsset = _toAssetVector(baseAsset_)
190+ let err = if ((i.caller != this))
191+ then throw("init: permission denied")
192+ else if ((asset != base58''))
193+ then throw("init: already initialized")
194+ else if (if ((4 > size(tokenName_)))
195+ then true
196+ else (size(tokenName_) > 16))
197+ then throw("init: invalid token name")
198+ else if ((size(tokenDescr_) > 1000))
199+ then throw("init: invalid token description")
200+ else if (!(_validateAsset(baseAsset_)))
201+ then throw("init: invalid base asset")
202+ else if (!(_validateAddress(stakingAdapter_)))
203+ then throw("init: invalid staking adapter")
204+ else unit
205+ if ((err == err))
206+ then {
207+ let tokenDecimals = _getAssetDecimals(baseAsset)
208+ let issue = Issue(tokenName_, tokenDescr_, INIT_AMOUNT, tokenDecimals, true)
209+ let assetId = calculateAssetId(issue)
210+ let stakeActions = _updateStaking(baseAsset, INIT_AMOUNT, addressFromStringValue(stakingAdapter_))
211+ $Tuple2(([StringEntry(KEY_BASE_ASSET, baseAsset_), StringEntry(KEY_STAKING_ADAPTER, stakingAdapter_), StringEntry(KEY_ASSET, toBase58String(assetId)), issue] ++ stakeActions), unit)
212+ }
213+ else throw("Strict value is not equal to itself.")
210214 }
211215 else throw("Strict value is not equal to itself.")
212216 }
404408 if ((err == err))
405409 then {
406410 let sponsorAsset = _loadAsset()
411+ let sponsorAmount = assetBalance(this, sponsorAsset)
407412 let minSponsoredAssetFee = if ((minSponsoredAssetFee_ == 0))
408413 then unit
409414 else minSponsoredAssetFee_
410415 let actions = if ((wavesBalance(this).regular > wavesRequiredAmount_))
411416 then [ScriptTransfer(i.caller, (wavesBalance(this).regular - wavesRequiredAmount_), unit)]
412417 else nil
413- $Tuple2((actions ++ [ScriptTransfer(i.caller, assetBalance(this, sponsorAsset), sponsorAsset), SponsorFee(sponsorAsset, minSponsoredAssetFee)]), unit)
414- }
415- else throw("Strict value is not equal to itself.")
416- }
417-
418-
419-
420-@Callable(i)
421-func wxVotingSuggest (votingAddress_,wxAsset_,wxAmount_,assetImage_) = {
422- let err = if ((i.caller != this))
423- then throw("wxVotingSuggest: permission denied")
424- else if (!(_validateAddress(votingAddress_)))
425- then throw("wxVotingSuggest: invalid voting address")
426- else if ((0 > wxAmount_))
427- then throw("wxVotingSuggest: invalid wx amount")
428- else unit
429- if ((err == err))
430- then {
431- let sponsorAssetStr = toBase58String(_loadAsset())
432- let invocation = invoke(addressFromStringValue(votingAddress_), "suggest", [sponsorAssetStr, assetImage_], [AttachedPayment(_toAssetVector(wxAsset_), wxAmount_)])
433- if ((invocation == invocation))
434- then $Tuple2(nil, unit)
435- else throw("Strict value is not equal to itself.")
418+ $Tuple2((actions ++ [ScriptTransfer(i.caller, sponsorAmount, sponsorAsset), SponsorFee(sponsorAsset, minSponsoredAssetFee)]), sponsorAmount)
436419 }
437420 else throw("Strict value is not equal to itself.")
438421 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEPARATOR = "__"
55
66 let WAVES = "WAVES"
77
88 let KEY_MULTISIG = "MULTISIG"
99
1010 let KEY_STATUS = "STATUS"
1111
1212 let KEY_BASE_ASSET = "BASE_ASSET"
1313
1414 let KEY_ASSET = "ASSET"
1515
1616 let KEY_STAKING_ADAPTER = "STAKING_ADAPTER"
1717
1818 let KEY_STAKING_AMOUNT = "STAKING_AMOUNT"
1919
2020 let KEY_LAST_RATE = "LAST_RATE"
2121
2222 let KEY_CURRENT_RATE = "CURRENT_RATE"
2323
2424 let KEY_LAST_HEIGHT = "LAST_HEIGHT"
2525
2626 let KEY_TARGET_HEIGHT = "TARGET_HEIGHT"
2727
2828 let KEY_SPONSORSHIP_MANAGER = "SPONSORSHIP_MANAGER"
2929
3030 let FUNC_STAKE = "stake"
3131
3232 let FUNC_UNSTAKE = "unstake"
3333
3434 let FUNC_CLAIM_REWARD = "claimReward"
3535
3636 let PERCENT_FACTOR = toBigInt(1000000000000)
3737
3838 let ZERO_BIGINT = toBigInt(0)
3939
4040 let ONE_BIGINT = toBigInt(1)
4141
4242 let INIT_AMOUNT = 100000000
4343
4444 func _validateAddress (address_) = match addressFromString(address_) {
4545 case a: Address =>
4646 true
4747 case _ =>
4848 false
4949 }
5050
5151
5252 func _validateAsset (asset_) = if ((asset_ == WAVES))
5353 then true
5454 else match assetInfo(fromBase58String(asset_)) {
5555 case a: Asset =>
5656 true
5757 case _ =>
5858 false
5959 }
6060
6161
6262 func _toAssetVector (asset_) = if ((asset_ == WAVES))
6363 then unit
6464 else fromBase58String(asset_)
6565
6666
6767 func _getAssetDecimals (asset_) = match asset_ {
6868 case a: ByteVector =>
6969 match assetInfo(a) {
7070 case asset: Asset =>
7171 asset.decimals
7272 case _ =>
7373 throw("_getAssetDecimals: no such asset")
7474 }
7575 case _ =>
7676 8
7777 }
7878
7979
8080 func _getAssetQuantity (asset_) = match assetInfo(asset_) {
8181 case a: Asset =>
8282 a.quantity
8383 case _ =>
8484 throw("_getAssetQuantity: no such asset")
8585 }
8686
8787
8888 func _getAssetBalance (asset_,address) = match asset_ {
8989 case a: ByteVector =>
9090 assetBalance(address, a)
9191 case _ =>
9292 wavesBalance(address).regular
9393 }
9494
9595
9696 func _loadBaseAsset () = match getString(KEY_BASE_ASSET) {
9797 case a: String =>
9898 if ((a == WAVES))
9999 then unit
100100 else fromBase58String(a)
101101 case _ =>
102102 throw("_loadBaseAsset: no base asset")
103103 }
104104
105105
106106 func _loadStakingAdapter () = match getString(KEY_STAKING_ADAPTER) {
107107 case a: String =>
108108 addressFromStringValue(a)
109109 case _ =>
110110 throw("_loadStakingAdapter: no staking adapter")
111111 }
112112
113113
114114 func _loadSponsorshipManager () = match getString(KEY_SPONSORSHIP_MANAGER) {
115115 case a: String =>
116116 addressFromStringValue(a)
117117 case _ =>
118118 throw("_loadSponsorshipManager: no sponsorship manager")
119119 }
120120
121121
122122 func _loadInt (key_,default_) = match getInteger(key_) {
123123 case a: Int =>
124124 a
125125 case _ =>
126126 default_
127127 }
128128
129129
130130 func _loadBigInt (key_,default_) = match getBinary(key_) {
131131 case a: ByteVector =>
132132 toBigInt(a)
133133 case _ =>
134134 default_
135135 }
136136
137137
138138 func _loadAsset () = match getString(KEY_ASSET) {
139139 case a: String =>
140140 fromBase58String(a)
141141 case _ =>
142142 base58''
143143 }
144144
145145
146146 func _updateStaking (asset_,amount_,adapter_) = {
147147 let stakingAmount = _loadInt(KEY_STAKING_AMOUNT, 0)
148148 let newStakingAmount = (stakingAmount + amount_)
149149 let invocation = if ((amount_ > 0))
150150 then invoke(adapter_, FUNC_STAKE, nil, [AttachedPayment(asset_, amount_)])
151151 else invoke(adapter_, FUNC_UNSTAKE, [(-1 * amount_)], nil)
152152 if ((invocation == invocation))
153153 then [IntegerEntry(KEY_STAKING_AMOUNT, newStakingAmount)]
154154 else throw("Strict value is not equal to itself.")
155155 }
156156
157157
158158 func _checkpoint (compensation) = {
159159 let invocation = invoke(_loadStakingAdapter(), FUNC_CLAIM_REWARD, nil, nil)
160160 if ((invocation == invocation))
161161 then match invocation {
162162 case reward: (Int, Int, Int) =>
163163 if (compensation)
164164 then {
165165 let stake = invoke(this, FUNC_STAKE, [reward._1, reward._3], nil)
166166 if ((stake == stake))
167167 then $Tuple2(true, reward._2)
168168 else throw("Strict value is not equal to itself.")
169169 }
170170 else {
171171 let stake = invoke(this, FUNC_STAKE, [(reward._1 + reward._2), reward._3], nil)
172172 if ((stake == stake))
173173 then $Tuple2(true, 0)
174174 else throw("Strict value is not equal to itself.")
175175 }
176176 case _ =>
177177 $Tuple2(false, 0)
178178 }
179179 else throw("Strict value is not equal to itself.")
180180 }
181181
182182
183183 @Callable(i)
184184 func init (tokenName_,tokenDescr_,baseAsset_,stakingAdapter_) = {
185185 let multisig = valueOrErrorMessage(getString(KEY_MULTISIG), "init: no multisig set")
186- let asset = _loadAsset()
187- let baseAsset = _toAssetVector(baseAsset_)
188- let err = if ((i.caller != this))
189- then throw("init: permission denied")
190- else if ((asset != base58''))
191- then throw("init: already initialized")
192- else if (if ((4 > size(tokenName_)))
193- then true
194- else (size(tokenName_) > 16))
195- then throw("init: invalid token name")
196- else if ((size(tokenDescr_) > 1000))
197- then throw("init: invalid token description")
198- else if (!(_validateAsset(baseAsset_)))
199- then throw("init: invalid base asset")
200- else if (!(_validateAddress(stakingAdapter_)))
201- then throw("init: invalid staking adapter")
202- else unit
203- if ((err == err))
186+ if ((multisig == multisig))
204187 then {
205- let tokenDecimals = _getAssetDecimals(baseAsset)
206- let issue = Issue(tokenName_, tokenDescr_, INIT_AMOUNT, tokenDecimals, true)
207- let assetId = calculateAssetId(issue)
208- let stakeActions = _updateStaking(baseAsset, INIT_AMOUNT, addressFromStringValue(stakingAdapter_))
209- $Tuple2(([StringEntry(KEY_BASE_ASSET, baseAsset_), StringEntry(KEY_STAKING_ADAPTER, stakingAdapter_), StringEntry(KEY_ASSET, toBase58String(assetId)), issue] ++ stakeActions), unit)
188+ let asset = _loadAsset()
189+ let baseAsset = _toAssetVector(baseAsset_)
190+ let err = if ((i.caller != this))
191+ then throw("init: permission denied")
192+ else if ((asset != base58''))
193+ then throw("init: already initialized")
194+ else if (if ((4 > size(tokenName_)))
195+ then true
196+ else (size(tokenName_) > 16))
197+ then throw("init: invalid token name")
198+ else if ((size(tokenDescr_) > 1000))
199+ then throw("init: invalid token description")
200+ else if (!(_validateAsset(baseAsset_)))
201+ then throw("init: invalid base asset")
202+ else if (!(_validateAddress(stakingAdapter_)))
203+ then throw("init: invalid staking adapter")
204+ else unit
205+ if ((err == err))
206+ then {
207+ let tokenDecimals = _getAssetDecimals(baseAsset)
208+ let issue = Issue(tokenName_, tokenDescr_, INIT_AMOUNT, tokenDecimals, true)
209+ let assetId = calculateAssetId(issue)
210+ let stakeActions = _updateStaking(baseAsset, INIT_AMOUNT, addressFromStringValue(stakingAdapter_))
211+ $Tuple2(([StringEntry(KEY_BASE_ASSET, baseAsset_), StringEntry(KEY_STAKING_ADAPTER, stakingAdapter_), StringEntry(KEY_ASSET, toBase58String(assetId)), issue] ++ stakeActions), unit)
212+ }
213+ else throw("Strict value is not equal to itself.")
210214 }
211215 else throw("Strict value is not equal to itself.")
212216 }
213217
214218
215219
216220 @Callable(i)
217221 func getRate () = {
218222 let lastRate = _loadBigInt(KEY_LAST_RATE, PERCENT_FACTOR)
219223 let currentRate = _loadBigInt(KEY_CURRENT_RATE, ZERO_BIGINT)
220224 let lastHeight = _loadInt(KEY_LAST_HEIGHT, 0)
221225 let targetHeight = min([_loadInt(KEY_TARGET_HEIGHT, 0), height])
222226 let rate = (lastRate + (currentRate * toBigInt((targetHeight - lastHeight))))
223227 $Tuple2(nil, toString(rate))
224228 }
225229
226230
227231
228232 @Callable(i)
229233 func checkpoint () = {
230234 let checkpoint = _checkpoint(true)
231235 if ((checkpoint == checkpoint))
232236 then if (!(checkpoint._1))
233237 then throw("checkpoint: no reward")
234238 else if ((checkpoint._2 > 0))
235239 then $Tuple2([ScriptTransfer(i.originCaller, checkpoint._2, _loadBaseAsset())], unit)
236240 else $Tuple2(nil, unit)
237241 else throw("Strict value is not equal to itself.")
238242 }
239243
240244
241245
242246 @Callable(i)
243247 func deposit () = {
244248 let caller = toString(i.caller)
245249 let baseAsset = _loadBaseAsset()
246250 let asset = _loadAsset()
247251 let assetQuantity = toBigInt(_getAssetQuantity(asset))
248252 let err = if ((size(i.payments) != 1))
249253 then throw("deposit: no payments")
250254 else if ((i.payments[0].assetId != baseAsset))
251255 then throw("deposit: payment is not in base asset")
252256 else if ((0 >= i.payments[0].amount))
253257 then throw("deposit: invalid payment amount")
254258 else unit
255259 if ((err == err))
256260 then {
257261 let checkpoint = _checkpoint(false)
258262 if ((checkpoint == checkpoint))
259263 then {
260264 let lastRate = _loadBigInt(KEY_LAST_RATE, PERCENT_FACTOR)
261265 let currentRate = _loadBigInt(KEY_CURRENT_RATE, ZERO_BIGINT)
262266 let lastHeight = _loadInt(KEY_LAST_HEIGHT, 0)
263267 let targetHeight = min([_loadInt(KEY_TARGET_HEIGHT, 0), height])
264268 let lastRateUpdated = (lastRate + (currentRate * toBigInt((targetHeight - lastHeight))))
265269 let issueAmount = toInt(fraction(toBigInt(i.payments[0].amount), PERCENT_FACTOR, lastRateUpdated, FLOOR))
266270 let currentRateUpdated = fraction(currentRate, assetQuantity, (assetQuantity + toBigInt(issueAmount)), FLOOR)
267271 let lastHeightUpdated = targetHeight
268272 let stakeActions = _updateStaking(baseAsset, i.payments[0].amount, _loadStakingAdapter())
269273 $Tuple2(([Reissue(asset, issueAmount, true), ScriptTransfer(i.caller, issueAmount, asset), BinaryEntry(KEY_LAST_RATE, toBytes(lastRateUpdated)), BinaryEntry(KEY_CURRENT_RATE, toBytes(currentRateUpdated)), IntegerEntry(KEY_LAST_HEIGHT, lastHeightUpdated)] ++ stakeActions), unit)
270274 }
271275 else throw("Strict value is not equal to itself.")
272276 }
273277 else throw("Strict value is not equal to itself.")
274278 }
275279
276280
277281
278282 @Callable(i)
279283 func stake (amount_,spreadBlocks_) = {
280284 let caller = toString(i.caller)
281285 let baseAsset = _loadBaseAsset()
282286 let asset = _loadAsset()
283287 let assetQuantity = toBigInt(_getAssetQuantity(asset))
284288 let err = if ((i.caller != this))
285289 then throw("stake: only this contract")
286290 else if ((0 >= amount_))
287291 then throw("stake: invalid stake amount")
288292 else if ((amount_ > _getAssetBalance(baseAsset, this)))
289293 then throw("stake: insufficient stake amount")
290294 else if ((assetQuantity == ZERO_BIGINT))
291295 then throw("stake: no deposits to stake for")
292296 else unit
293297 if ((err == err))
294298 then {
295299 let lastRate = _loadBigInt(KEY_LAST_RATE, PERCENT_FACTOR)
296300 let currentRate = _loadBigInt(KEY_CURRENT_RATE, ZERO_BIGINT)
297301 let lastHeight = _loadInt(KEY_LAST_HEIGHT, 0)
298302 let targetHeight = _loadInt(KEY_TARGET_HEIGHT, 0)
299303 let minTargetHeight = min([targetHeight, height])
300304 let actions = if ((minTargetHeight == height))
301305 then {
302306 let lastRateUpdated = (lastRate + (toBigInt((minTargetHeight - lastHeight)) * currentRate))
303307 let remainingReward = (currentRate * toBigInt((targetHeight - minTargetHeight)))
304308 let currentRateUpdated = fraction(((toBigInt(amount_) * PERCENT_FACTOR) + remainingReward), ONE_BIGINT, (assetQuantity * toBigInt(spreadBlocks_)))
305309 let lastHeightUpdated = height
306310 let targetHeightUpdated = (lastHeightUpdated + spreadBlocks_)
307311 [BinaryEntry(KEY_LAST_RATE, toBytes(lastRateUpdated)), BinaryEntry(KEY_CURRENT_RATE, toBytes(currentRateUpdated)), IntegerEntry(KEY_LAST_HEIGHT, lastHeightUpdated), IntegerEntry(KEY_TARGET_HEIGHT, targetHeightUpdated)]
308312 }
309313 else if ((targetHeight > lastHeight))
310314 then {
311315 let lastRateUpdated = (lastRate + (toBigInt((targetHeight - lastHeight)) * currentRate))
312316 let currentRateUpdated = fraction(toBigInt(amount_), PERCENT_FACTOR, (assetQuantity * toBigInt(spreadBlocks_)))
313317 let lastHeightUpdated = height
314318 let targetHeightUpdated = (lastHeightUpdated + spreadBlocks_)
315319 [BinaryEntry(KEY_LAST_RATE, toBytes(lastRateUpdated)), BinaryEntry(KEY_CURRENT_RATE, toBytes(currentRateUpdated)), IntegerEntry(KEY_LAST_HEIGHT, lastHeightUpdated), IntegerEntry(KEY_TARGET_HEIGHT, targetHeightUpdated)]
316320 }
317321 else {
318322 let currentRateUpdated = fraction(toBigInt(amount_), PERCENT_FACTOR, (assetQuantity * toBigInt(spreadBlocks_)))
319323 let lastHeightUpdated = height
320324 let targetHeightUpdated = (lastHeightUpdated + spreadBlocks_)
321325 [BinaryEntry(KEY_CURRENT_RATE, toBytes(currentRateUpdated)), IntegerEntry(KEY_LAST_HEIGHT, lastHeightUpdated), IntegerEntry(KEY_TARGET_HEIGHT, targetHeightUpdated)]
322326 }
323327 let stakeActions = _updateStaking(baseAsset, amount_, _loadStakingAdapter())
324328 $Tuple2((actions ++ stakeActions), unit)
325329 }
326330 else throw("Strict value is not equal to itself.")
327331 }
328332
329333
330334
331335 @Callable(i)
332336 func withdraw () = {
333337 let caller = toString(i.caller)
334338 let baseAsset = _loadBaseAsset()
335339 let asset = _loadAsset()
336340 let assetQuantity = toBigInt(_getAssetQuantity(asset))
337341 let err = if ((1 > size(i.payments)))
338342 then throw("withdraw: no payments")
339343 else if ((i.payments[0].assetId != asset))
340344 then throw("withdraw: payment is not in correct asset")
341345 else if ((0 >= i.payments[0].amount))
342346 then throw("withdraw: invalid payment amount")
343347 else unit
344348 if ((err == err))
345349 then {
346350 let checkpoint = _checkpoint(false)
347351 if ((checkpoint == checkpoint))
348352 then {
349353 let lastRate = _loadBigInt(KEY_LAST_RATE, PERCENT_FACTOR)
350354 let currentRate = _loadBigInt(KEY_CURRENT_RATE, ZERO_BIGINT)
351355 let lastHeight = _loadInt(KEY_LAST_HEIGHT, 0)
352356 let targetHeight = min([_loadInt(KEY_TARGET_HEIGHT, 0), height])
353357 let lastRateUpdated = (lastRate + (currentRate * toBigInt((targetHeight - lastHeight))))
354358 let baseAmount = toInt(fraction(toBigInt(i.payments[0].amount), lastRateUpdated, PERCENT_FACTOR, FLOOR))
355359 let currentRateUpdated = fraction(currentRate, assetQuantity, (assetQuantity - toBigInt(i.payments[0].amount)), FLOOR)
356360 let lastHeightUpdated = targetHeight
357361 let stakeActions = _updateStaking(baseAsset, (-1 * baseAmount), _loadStakingAdapter())
358362 $Tuple2((stakeActions ++ [Burn(asset, i.payments[0].amount), ScriptTransfer(i.caller, baseAmount, unit), BinaryEntry(KEY_LAST_RATE, toBytes(lastRateUpdated)), BinaryEntry(KEY_CURRENT_RATE, toBytes(currentRateUpdated)), IntegerEntry(KEY_LAST_HEIGHT, lastHeightUpdated)]), unit)
359363 }
360364 else throw("Strict value is not equal to itself.")
361365 }
362366 else throw("Strict value is not equal to itself.")
363367 }
364368
365369
366370
367371 @Callable(i)
368372 func setMultisig (multisig_) = {
369373 let err = if ((i.caller != this))
370374 then throw("setMultisig: permission denied")
371375 else if (!(_validateAddress(multisig_)))
372376 then throw("setMultisig: invalid multisig address")
373377 else unit
374378 if ((err == err))
375379 then $Tuple2([StringEntry(KEY_MULTISIG, multisig_)], unit)
376380 else throw("Strict value is not equal to itself.")
377381 }
378382
379383
380384
381385 @Callable(i)
382386 func setSponsorshipManager (manager_) = {
383387 let err = if ((i.caller != this))
384388 then throw("setSponsorshipManager: permission denied")
385389 else if (!(_validateAddress(manager_)))
386390 then throw("setSponsorshipManager: invalid manager address")
387391 else unit
388392 if ((err == err))
389393 then $Tuple2([StringEntry(KEY_SPONSORSHIP_MANAGER, manager_)], unit)
390394 else throw("Strict value is not equal to itself.")
391395 }
392396
393397
394398
395399 @Callable(i)
396400 func updateSponsorship (minSponsoredAssetFee_,wavesRequiredAmount_) = {
397401 let err = if ((i.caller != _loadSponsorshipManager()))
398402 then throw("updateSponsorship: permission denied")
399403 else if ((0 > minSponsoredAssetFee_))
400404 then throw("updateSponsorship: invalid sponsorship fee")
401405 else if ((0 > wavesRequiredAmount_))
402406 then throw("updateSponsorship: invalid waves required amount")
403407 else unit
404408 if ((err == err))
405409 then {
406410 let sponsorAsset = _loadAsset()
411+ let sponsorAmount = assetBalance(this, sponsorAsset)
407412 let minSponsoredAssetFee = if ((minSponsoredAssetFee_ == 0))
408413 then unit
409414 else minSponsoredAssetFee_
410415 let actions = if ((wavesBalance(this).regular > wavesRequiredAmount_))
411416 then [ScriptTransfer(i.caller, (wavesBalance(this).regular - wavesRequiredAmount_), unit)]
412417 else nil
413- $Tuple2((actions ++ [ScriptTransfer(i.caller, assetBalance(this, sponsorAsset), sponsorAsset), SponsorFee(sponsorAsset, minSponsoredAssetFee)]), unit)
414- }
415- else throw("Strict value is not equal to itself.")
416- }
417-
418-
419-
420-@Callable(i)
421-func wxVotingSuggest (votingAddress_,wxAsset_,wxAmount_,assetImage_) = {
422- let err = if ((i.caller != this))
423- then throw("wxVotingSuggest: permission denied")
424- else if (!(_validateAddress(votingAddress_)))
425- then throw("wxVotingSuggest: invalid voting address")
426- else if ((0 > wxAmount_))
427- then throw("wxVotingSuggest: invalid wx amount")
428- else unit
429- if ((err == err))
430- then {
431- let sponsorAssetStr = toBase58String(_loadAsset())
432- let invocation = invoke(addressFromStringValue(votingAddress_), "suggest", [sponsorAssetStr, assetImage_], [AttachedPayment(_toAssetVector(wxAsset_), wxAmount_)])
433- if ((invocation == invocation))
434- then $Tuple2(nil, unit)
435- else throw("Strict value is not equal to itself.")
418+ $Tuple2((actions ++ [ScriptTransfer(i.caller, sponsorAmount, sponsorAsset), SponsorFee(sponsorAsset, minSponsoredAssetFee)]), sponsorAmount)
436419 }
437420 else throw("Strict value is not equal to itself.")
438421 }
439422
440423
441424 @Verifier(tx)
442425 func verify () = match getString(KEY_MULTISIG) {
443426 case multisig: String =>
444427 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
445428 case _ =>
446429 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
447430 }
448431

github/deemru/w8io/3ef1775 
60.18 ms