tx · HrL5TnfyTHyWT29Avd5GMq1zSMwSkZgStTCWEHUPJ6AN

3N4kXZHGke6yRq3Z57q7BTgCrT2SCvQCYER:  -0.01400000 Waves

2022.12.06 13:31 [2348364] smart account 3N4kXZHGke6yRq3Z57q7BTgCrT2SCvQCYER > SELF 0.00000000 Waves

{ "type": 13, "id": "HrL5TnfyTHyWT29Avd5GMq1zSMwSkZgStTCWEHUPJ6AN", "fee": 1400000, "feeAssetId": null, "timestamp": 1670322659957, "version": 2, "chainId": 84, "sender": "3N4kXZHGke6yRq3Z57q7BTgCrT2SCvQCYER", "senderPublicKey": "6sxdMr2xYPPACEJccwmgS7nWC2ez1c38Y1kDX49ne42b", "proofs": [ "jSSZagR2maN8TqcSExKrPMmL9vCSkkHMZNQ61t9p25Fcdfb9zMm3gXrweZYrmU4KTwLmKJj9MYd4yETNdw9xzMk" ], "script": "base64:BgIvCAISBgoECAgICBIAEgASABIECgIBARIAEgMKAQgSAwoBCBIECgIBARIFCgMICAgiAAlTRVBBUkFUT1ICAl9fAAVXQVZFUwIFV0FWRVMADEtFWV9NVUxUSVNJRwIITVVMVElTSUcACktFWV9TVEFUVVMCBlNUQVRVUwAOS0VZX0JBU0VfQVNTRVQCCkJBU0VfQVNTRVQACUtFWV9BU1NFVAIFQVNTRVQAE0tFWV9TVEFLSU5HX0FEQVBURVICD1NUQUtJTkdfQURBUFRFUgASS0VZX1NUQUtJTkdfQU1PVU5UAg5TVEFLSU5HX0FNT1VOVAANS0VZX0xBU1RfUkFURQIJTEFTVF9SQVRFABBLRVlfQ1VSUkVOVF9SQVRFAgxDVVJSRU5UX1JBVEUAD0tFWV9MQVNUX0hFSUdIVAILTEFTVF9IRUlHSFQAEUtFWV9UQVJHRVRfSEVJR0hUAg1UQVJHRVRfSEVJR0hUABdLRVlfU1BPTlNPUlNISVBfTUFOQUdFUgITU1BPTlNPUlNISVBfTUFOQUdFUgAKRlVOQ19TVEFLRQIFc3Rha2UADEZVTkNfVU5TVEFLRQIHdW5zdGFrZQARRlVOQ19DTEFJTV9SRVdBUkQCC2NsYWltUmV3YXJkAA5QRVJDRU5UX0ZBQ1RPUgkAtgIBAICglKWNHQALWkVST19CSUdJTlQJALYCAQAAAApPTkVfQklHSU5UCQC2AgEAAQALSU5JVF9BTU9VTlQAgMLXLwEQX3ZhbGlkYXRlQWRkcmVzcwEIYWRkcmVzc18EByRtYXRjaDAJAKYIAQUIYWRkcmVzc18DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYHAQ5fdmFsaWRhdGVBc3NldAEGYXNzZXRfAwkAAAIFBmFzc2V0XwUFV0FWRVMGBAckbWF0Y2gwCQDsBwEJANkEAQUGYXNzZXRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgcBDl90b0Fzc2V0VmVjdG9yAQZhc3NldF8DCQAAAgUGYXNzZXRfBQVXQVZFUwUEdW5pdAkA2QQBBQZhc3NldF8BEV9nZXRBc3NldERlY2ltYWxzAQZhc3NldF8EByRtYXRjaDAFBmFzc2V0XwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQDsBwEFAWEDCQABAgUHJG1hdGNoMQIFQXNzZXQEBWFzc2V0BQckbWF0Y2gxCAUFYXNzZXQIZGVjaW1hbHMJAAIBAiBfZ2V0QXNzZXREZWNpbWFsczogbm8gc3VjaCBhc3NldAAIARFfZ2V0QXNzZXRRdWFudGl0eQEGYXNzZXRfBAckbWF0Y2gwCQDsBwEFBmFzc2V0XwMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAgFAWEIcXVhbnRpdHkJAAIBAiBfZ2V0QXNzZXRRdWFudGl0eTogbm8gc3VjaCBhc3NldAEQX2dldEFzc2V0QmFsYW5jZQIGYXNzZXRfB2FkZHJlc3MEByRtYXRjaDAFBmFzc2V0XwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwCQDwBwIFB2FkZHJlc3MFAWEICQDvBwEFB2FkZHJlc3MHcmVndWxhcgEOX2xvYWRCYXNlQXNzZXQABAckbWF0Y2gwCQCiCAEFDktFWV9CQVNFX0FTU0VUAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAAACBQFhBQVXQVZFUwUEdW5pdAkA2QQBBQFhCQACAQIdX2xvYWRCYXNlQXNzZXQ6IG5vIGJhc2UgYXNzZXQBE19sb2FkU3Rha2luZ0FkYXB0ZXIABAckbWF0Y2gwCQCiCAEFE0tFWV9TVEFLSU5HX0FEQVBURVIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQACAQInX2xvYWRTdGFraW5nQWRhcHRlcjogbm8gc3Rha2luZyBhZGFwdGVyARdfbG9hZFNwb25zb3JzaGlwTWFuYWdlcgAEByRtYXRjaDAJAKIIAQUXS0VZX1NQT05TT1JTSElQX01BTkFHRVIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQACAQIvX2xvYWRTcG9uc29yc2hpcE1hbmFnZXI6IG5vIHNwb25zb3JzaGlwIG1hbmFnZXIBCF9sb2FkSW50AgRrZXlfCGRlZmF1bHRfBAckbWF0Y2gwCQCfCAEFBGtleV8DCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhBQhkZWZhdWx0XwELX2xvYWRCaWdJbnQCBGtleV8IZGVmYXVsdF8EByRtYXRjaDAJAKEIAQUEa2V5XwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwCQCeAwEFAWEFCGRlZmF1bHRfAQpfbG9hZEFzc2V0AAQHJG1hdGNoMAkAoggBBQlLRVlfQVNTRVQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQDZBAEFAWEBAAEOX3VwZGF0ZVN0YWtpbmcDBmFzc2V0XwdhbW91bnRfCGFkYXB0ZXJfBA1zdGFraW5nQW1vdW50CQEIX2xvYWRJbnQCBRJLRVlfU1RBS0lOR19BTU9VTlQAAAQQbmV3U3Rha2luZ0Ftb3VudAkAZAIFDXN0YWtpbmdBbW91bnQFB2Ftb3VudF8ECmludm9jYXRpb24DCQBmAgUHYW1vdW50XwAACQD8BwQFCGFkYXB0ZXJfBQpGVU5DX1NUQUtFBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBmFzc2V0XwUHYW1vdW50XwUDbmlsCQD8BwQFCGFkYXB0ZXJfBQxGVU5DX1VOU1RBS0UJAMwIAgkAaAIA////////////AQUHYW1vdW50XwUDbmlsBQNuaWwDCQAAAgUKaW52b2NhdGlvbgUKaW52b2NhdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSS0VZX1NUQUtJTkdfQU1PVU5UBRBuZXdTdGFraW5nQW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BC19jaGVja3BvaW50AQxjb21wZW5zYXRpb24ECmludm9jYXRpb24JAPwHBAkBE19sb2FkU3Rha2luZ0FkYXB0ZXIABRFGVU5DX0NMQUlNX1JFV0FSRAUDbmlsBQNuaWwDCQAAAgUKaW52b2NhdGlvbgUKaW52b2NhdGlvbgQHJG1hdGNoMAUKaW52b2NhdGlvbgMJAAECBQckbWF0Y2gwAg8oSW50LCBJbnQsIEludCkEBnJld2FyZAUHJG1hdGNoMAMFDGNvbXBlbnNhdGlvbgQFc3Rha2UJAPwHBAUEdGhpcwUKRlVOQ19TVEFLRQkAzAgCCAUGcmV3YXJkAl8xCQDMCAIIBQZyZXdhcmQCXzMFA25pbAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQkAlAoCBggFBnJld2FyZAJfMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQFc3Rha2UJAPwHBAUEdGhpcwUKRlVOQ19TVEFLRQkAzAgCCQBkAggFBnJld2FyZAJfMQgFBnJld2FyZAJfMgkAzAgCCAUGcmV3YXJkAl8zBQNuaWwFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UJAJQKAgYAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBwAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCgFpAQRpbml0BAp0b2tlbk5hbWVfC3Rva2VuRGVzY3JfCmJhc2VBc3NldF8Pc3Rha2luZ0FkYXB0ZXJfBAhtdWx0aXNpZwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFDEtFWV9NVUxUSVNJRwIVaW5pdDogbm8gbXVsdGlzaWcgc2V0BAVhc3NldAkBCl9sb2FkQXNzZXQABAliYXNlQXNzZXQJAQ5fdG9Bc3NldFZlY3RvcgEFCmJhc2VBc3NldF8EA2VycgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECF2luaXQ6IHBlcm1pc3Npb24gZGVuaWVkAwkBAiE9AgUFYXNzZXQBAAkAAgECGWluaXQ6IGFscmVhZHkgaW5pdGlhbGl6ZWQDAwkAZgIABAkAsQIBBQp0b2tlbk5hbWVfBgkAZgIJALECAQUKdG9rZW5OYW1lXwAQCQACAQIYaW5pdDogaW52YWxpZCB0b2tlbiBuYW1lAwkAZgIJALECAQULdG9rZW5EZXNjcl8A6AcJAAIBAh9pbml0OiBpbnZhbGlkIHRva2VuIGRlc2NyaXB0aW9uAwkBASEBCQEOX3ZhbGlkYXRlQXNzZXQBBQpiYXNlQXNzZXRfCQACAQIYaW5pdDogaW52YWxpZCBiYXNlIGFzc2V0AwkBASEBCQEQX3ZhbGlkYXRlQWRkcmVzcwEFD3N0YWtpbmdBZGFwdGVyXwkAAgECHWluaXQ6IGludmFsaWQgc3Rha2luZyBhZGFwdGVyBQR1bml0AwkAAAIFA2VycgUDZXJyBA10b2tlbkRlY2ltYWxzCQERX2dldEFzc2V0RGVjaW1hbHMBBQliYXNlQXNzZXQEBWlzc3VlCQDCCAUFCnRva2VuTmFtZV8FC3Rva2VuRGVzY3JfBQtJTklUX0FNT1VOVAUNdG9rZW5EZWNpbWFscwYEB2Fzc2V0SWQJALgIAQUFaXNzdWUEDHN0YWtlQWN0aW9ucwkBDl91cGRhdGVTdGFraW5nAwUJYmFzZUFzc2V0BQtJTklUX0FNT1VOVAkBEUBleHRyTmF0aXZlKDEwNjIpAQUPc3Rha2luZ0FkYXB0ZXJfCQCUCgIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQ5LRVlfQkFTRV9BU1NFVAUKYmFzZUFzc2V0XwkAzAgCCQELU3RyaW5nRW50cnkCBRNLRVlfU1RBS0lOR19BREFQVEVSBQ9zdGFraW5nQWRhcHRlcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUJS0VZX0FTU0VUCQDYBAEFB2Fzc2V0SWQJAMwIAgUFaXNzdWUFA25pbAUMc3Rha2VBY3Rpb25zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2dldFJhdGUABAhsYXN0UmF0ZQkBC19sb2FkQmlnSW50AgUNS0VZX0xBU1RfUkFURQUOUEVSQ0VOVF9GQUNUT1IEC2N1cnJlbnRSYXRlCQELX2xvYWRCaWdJbnQCBRBLRVlfQ1VSUkVOVF9SQVRFBQtaRVJPX0JJR0lOVAQKbGFzdEhlaWdodAkBCF9sb2FkSW50AgUPS0VZX0xBU1RfSEVJR0hUAAAEDHRhcmdldEhlaWdodAkAlwMBCQDMCAIJAQhfbG9hZEludAIFEUtFWV9UQVJHRVRfSEVJR0hUAAAJAMwIAgUGaGVpZ2h0BQNuaWwEBHJhdGUJALcCAgUIbGFzdFJhdGUJALkCAgULY3VycmVudFJhdGUJALYCAQkAZQIFDHRhcmdldEhlaWdodAUKbGFzdEhlaWdodAkAlAoCBQNuaWwJAKYDAQUEcmF0ZQFpAQpjaGVja3BvaW50AAQKY2hlY2twb2ludAkBC19jaGVja3BvaW50AQYDCQAAAgUKY2hlY2twb2ludAUKY2hlY2twb2ludAMJAQEhAQgFCmNoZWNrcG9pbnQCXzEJAAIBAhVjaGVja3BvaW50OiBubyByZXdhcmQDCQBmAggFCmNoZWNrcG9pbnQCXzIAAAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpDG9yaWdpbkNhbGxlcggFCmNoZWNrcG9pbnQCXzIJAQ5fbG9hZEJhc2VBc3NldAAFA25pbAUEdW5pdAkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAAEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIECWJhc2VBc3NldAkBDl9sb2FkQmFzZUFzc2V0AAQFYXNzZXQJAQpfbG9hZEFzc2V0AAQNYXNzZXRRdWFudGl0eQkAtgIBCQERX2dldEFzc2V0UXVhbnRpdHkBBQVhc3NldAQDZXJyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIUZGVwb3NpdDogbm8gcGF5bWVudHMDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFCWJhc2VBc3NldAkAAgECJWRlcG9zaXQ6IHBheW1lbnQgaXMgbm90IGluIGJhc2UgYXNzZXQDCQBnAgAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAAgECH2RlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhbW91bnQFBHVuaXQDCQAAAgUDZXJyBQNlcnIECmNoZWNrcG9pbnQJAQtfY2hlY2twb2ludAEHAwkAAAIFCmNoZWNrcG9pbnQFCmNoZWNrcG9pbnQECGxhc3RSYXRlCQELX2xvYWRCaWdJbnQCBQ1LRVlfTEFTVF9SQVRFBQ5QRVJDRU5UX0ZBQ1RPUgQLY3VycmVudFJhdGUJAQtfbG9hZEJpZ0ludAIFEEtFWV9DVVJSRU5UX1JBVEUFC1pFUk9fQklHSU5UBApsYXN0SGVpZ2h0CQEIX2xvYWRJbnQCBQ9LRVlfTEFTVF9IRUlHSFQAAAQMdGFyZ2V0SGVpZ2h0CQCXAwEJAMwIAgkBCF9sb2FkSW50AgURS0VZX1RBUkdFVF9IRUlHSFQAAAkAzAgCBQZoZWlnaHQFA25pbAQPbGFzdFJhdGVVcGRhdGVkCQC3AgIFCGxhc3RSYXRlCQC5AgIFC2N1cnJlbnRSYXRlCQC2AgEJAGUCBQx0YXJnZXRIZWlnaHQFCmxhc3RIZWlnaHQEC2lzc3VlQW1vdW50CQCgAwEJAL0CBAkAtgIBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUOUEVSQ0VOVF9GQUNUT1IFD2xhc3RSYXRlVXBkYXRlZAUFRkxPT1IEEmN1cnJlbnRSYXRlVXBkYXRlZAkAvQIEBQtjdXJyZW50UmF0ZQUNYXNzZXRRdWFudGl0eQkAtwICBQ1hc3NldFF1YW50aXR5CQC2AgEFC2lzc3VlQW1vdW50BQVGTE9PUgQRbGFzdEhlaWdodFVwZGF0ZWQFDHRhcmdldEhlaWdodAQMc3Rha2VBY3Rpb25zCQEOX3VwZGF0ZVN0YWtpbmcDBQliYXNlQXNzZXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQETX2xvYWRTdGFraW5nQWRhcHRlcgAJAJQKAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUFYXNzZXQFC2lzc3VlQW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2lzc3VlQW1vdW50BQVhc3NldAkAzAgCCQELQmluYXJ5RW50cnkCBQ1LRVlfTEFTVF9SQVRFCQCdAwEFD2xhc3RSYXRlVXBkYXRlZAkAzAgCCQELQmluYXJ5RW50cnkCBRBLRVlfQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPS0VZX0xBU1RfSEVJR0hUBRFsYXN0SGVpZ2h0VXBkYXRlZAUDbmlsBQxzdGFrZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFc3Rha2UCB2Ftb3VudF8Nc3ByZWFkQmxvY2tzXwQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgQJYmFzZUFzc2V0CQEOX2xvYWRCYXNlQXNzZXQABAVhc3NldAkBCl9sb2FkQXNzZXQABA1hc3NldFF1YW50aXR5CQC2AgEJARFfZ2V0QXNzZXRRdWFudGl0eQEFBWFzc2V0BANlcnIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhlzdGFrZTogb25seSB0aGlzIGNvbnRyYWN0AwkAZwIAAAUHYW1vdW50XwkAAgECG3N0YWtlOiBpbnZhbGlkIHN0YWtlIGFtb3VudAMJAGYCBQdhbW91bnRfCQEQX2dldEFzc2V0QmFsYW5jZQIFCWJhc2VBc3NldAUEdGhpcwkAAgECIHN0YWtlOiBpbnN1ZmZpY2llbnQgc3Rha2UgYW1vdW50AwkAAAIFDWFzc2V0UXVhbnRpdHkFC1pFUk9fQklHSU5UCQACAQIfc3Rha2U6IG5vIGRlcG9zaXRzIHRvIHN0YWtlIGZvcgUEdW5pdAMJAAACBQNlcnIFA2VycgQIbGFzdFJhdGUJAQtfbG9hZEJpZ0ludAIFDUtFWV9MQVNUX1JBVEUFDlBFUkNFTlRfRkFDVE9SBAtjdXJyZW50UmF0ZQkBC19sb2FkQmlnSW50AgUQS0VZX0NVUlJFTlRfUkFURQULWkVST19CSUdJTlQECmxhc3RIZWlnaHQJAQhfbG9hZEludAIFD0tFWV9MQVNUX0hFSUdIVAAABAx0YXJnZXRIZWlnaHQJAQhfbG9hZEludAIFEUtFWV9UQVJHRVRfSEVJR0hUAAAED21pblRhcmdldEhlaWdodAkAlwMBCQDMCAIFDHRhcmdldEhlaWdodAkAzAgCBQZoZWlnaHQFA25pbAQHYWN0aW9ucwMJAAACBQ9taW5UYXJnZXRIZWlnaHQFBmhlaWdodAQPbGFzdFJhdGVVcGRhdGVkCQC3AgIFCGxhc3RSYXRlCQC5AgIJALYCAQkAZQIFD21pblRhcmdldEhlaWdodAUKbGFzdEhlaWdodAULY3VycmVudFJhdGUED3JlbWFpbmluZ1Jld2FyZAkAuQICBQtjdXJyZW50UmF0ZQkAtgIBCQBlAgUMdGFyZ2V0SGVpZ2h0BQ9taW5UYXJnZXRIZWlnaHQEEmN1cnJlbnRSYXRlVXBkYXRlZAkAvAIDCQC3AgIJALkCAgkAtgIBBQdhbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgUPcmVtYWluaW5nUmV3YXJkBQpPTkVfQklHSU5UCQC5AgIFDWFzc2V0UXVhbnRpdHkJALYCAQUNc3ByZWFkQmxvY2tzXwQRbGFzdEhlaWdodFVwZGF0ZWQFBmhlaWdodAQTdGFyZ2V0SGVpZ2h0VXBkYXRlZAkAZAIFEWxhc3RIZWlnaHRVcGRhdGVkBQ1zcHJlYWRCbG9ja3NfCQDMCAIJAQtCaW5hcnlFbnRyeQIFDUtFWV9MQVNUX1JBVEUJAJ0DAQUPbGFzdFJhdGVVcGRhdGVkCQDMCAIJAQtCaW5hcnlFbnRyeQIFEEtFWV9DVVJSRU5UX1JBVEUJAJ0DAQUSY3VycmVudFJhdGVVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9LRVlfTEFTVF9IRUlHSFQFEWxhc3RIZWlnaHRVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFLRVlfVEFSR0VUX0hFSUdIVAUTdGFyZ2V0SGVpZ2h0VXBkYXRlZAUDbmlsAwkAZgIFDHRhcmdldEhlaWdodAUKbGFzdEhlaWdodAQPbGFzdFJhdGVVcGRhdGVkCQC3AgIFCGxhc3RSYXRlCQC5AgIJALYCAQkAZQIFDHRhcmdldEhlaWdodAUKbGFzdEhlaWdodAULY3VycmVudFJhdGUEEmN1cnJlbnRSYXRlVXBkYXRlZAkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC5AgIFDWFzc2V0UXVhbnRpdHkJALYCAQUNc3ByZWFkQmxvY2tzXwQRbGFzdEhlaWdodFVwZGF0ZWQFBmhlaWdodAQTdGFyZ2V0SGVpZ2h0VXBkYXRlZAkAZAIFEWxhc3RIZWlnaHRVcGRhdGVkBQ1zcHJlYWRCbG9ja3NfCQDMCAIJAQtCaW5hcnlFbnRyeQIFDUtFWV9MQVNUX1JBVEUJAJ0DAQUPbGFzdFJhdGVVcGRhdGVkCQDMCAIJAQtCaW5hcnlFbnRyeQIFEEtFWV9DVVJSRU5UX1JBVEUJAJ0DAQUSY3VycmVudFJhdGVVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9LRVlfTEFTVF9IRUlHSFQFEWxhc3RIZWlnaHRVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFLRVlfVEFSR0VUX0hFSUdIVAUTdGFyZ2V0SGVpZ2h0VXBkYXRlZAUDbmlsBBJjdXJyZW50UmF0ZVVwZGF0ZWQJALwCAwkAtgIBBQdhbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAuQICBQ1hc3NldFF1YW50aXR5CQC2AgEFDXNwcmVhZEJsb2Nrc18EEWxhc3RIZWlnaHRVcGRhdGVkBQZoZWlnaHQEE3RhcmdldEhlaWdodFVwZGF0ZWQJAGQCBRFsYXN0SGVpZ2h0VXBkYXRlZAUNc3ByZWFkQmxvY2tzXwkAzAgCCQELQmluYXJ5RW50cnkCBRBLRVlfQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPS0VZX0xBU1RfSEVJR0hUBRFsYXN0SGVpZ2h0VXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURS0VZX1RBUkdFVF9IRUlHSFQFE3RhcmdldEhlaWdodFVwZGF0ZWQFA25pbAQMc3Rha2VBY3Rpb25zCQEOX3VwZGF0ZVN0YWtpbmcDBQliYXNlQXNzZXQFB2Ftb3VudF8JARNfbG9hZFN0YWtpbmdBZGFwdGVyAAkAlAoCCQDOCAIFB2FjdGlvbnMFDHN0YWtlQWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwAEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIECWJhc2VBc3NldAkBDl9sb2FkQmFzZUFzc2V0AAQFYXNzZXQJAQpfbG9hZEFzc2V0AAQNYXNzZXRRdWFudGl0eQkAtgIBCQERX2dldEFzc2V0UXVhbnRpdHkBBQVhc3NldAQDZXJyAwkAZgIAAQkAkAMBCAUBaQhwYXltZW50cwkAAgECFXdpdGhkcmF3OiBubyBwYXltZW50cwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUFYXNzZXQJAAIBAil3aXRoZHJhdzogcGF5bWVudCBpcyBub3QgaW4gY29ycmVjdCBhc3NldAMJAGcCAAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQACAQIgd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudCBhbW91bnQFBHVuaXQDCQAAAgUDZXJyBQNlcnIECmNoZWNrcG9pbnQJAQtfY2hlY2twb2ludAEHAwkAAAIFCmNoZWNrcG9pbnQFCmNoZWNrcG9pbnQECGxhc3RSYXRlCQELX2xvYWRCaWdJbnQCBQ1LRVlfTEFTVF9SQVRFBQ5QRVJDRU5UX0ZBQ1RPUgQLY3VycmVudFJhdGUJAQtfbG9hZEJpZ0ludAIFEEtFWV9DVVJSRU5UX1JBVEUFC1pFUk9fQklHSU5UBApsYXN0SGVpZ2h0CQEIX2xvYWRJbnQCBQ9LRVlfTEFTVF9IRUlHSFQAAAQMdGFyZ2V0SGVpZ2h0CQCXAwEJAMwIAgkBCF9sb2FkSW50AgURS0VZX1RBUkdFVF9IRUlHSFQAAAkAzAgCBQZoZWlnaHQFA25pbAQPbGFzdFJhdGVVcGRhdGVkCQC3AgIFCGxhc3RSYXRlCQC5AgIFC2N1cnJlbnRSYXRlCQC2AgEJAGUCBQx0YXJnZXRIZWlnaHQFCmxhc3RIZWlnaHQECmJhc2VBbW91bnQJAKADAQkAvQIECQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ9sYXN0UmF0ZVVwZGF0ZWQFDlBFUkNFTlRfRkFDVE9SBQVGTE9PUgQSY3VycmVudFJhdGVVcGRhdGVkCQC9AgQFC2N1cnJlbnRSYXRlBQ1hc3NldFF1YW50aXR5CQC4AgIFDWFzc2V0UXVhbnRpdHkJALYCAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBUZMT09SBBFsYXN0SGVpZ2h0VXBkYXRlZAUMdGFyZ2V0SGVpZ2h0BAxzdGFrZUFjdGlvbnMJAQ5fdXBkYXRlU3Rha2luZwMFCWJhc2VBc3NldAkAaAIA////////////AQUKYmFzZUFtb3VudAkBE19sb2FkU3Rha2luZ0FkYXB0ZXIACQCUCgIJAM4IAgUMc3Rha2VBY3Rpb25zCQDMCAIJAQRCdXJuAgUFYXNzZXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKYmFzZUFtb3VudAUEdW5pdAkAzAgCCQELQmluYXJ5RW50cnkCBQ1LRVlfTEFTVF9SQVRFCQCdAwEFD2xhc3RSYXRlVXBkYXRlZAkAzAgCCQELQmluYXJ5RW50cnkCBRBLRVlfQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPS0VZX0xBU1RfSEVJR0hUBRFsYXN0SGVpZ2h0VXBkYXRlZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHnNldE11bHRpc2lnOiBwZXJtaXNzaW9uIGRlbmllZAMJAQEhAQkBEF92YWxpZGF0ZUFkZHJlc3MBBQltdWx0aXNpZ18JAAIBAiVzZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZyBhZGRyZXNzBQR1bml0AwkAAAIFA2VycgUDZXJyCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX01VTFRJU0lHBQltdWx0aXNpZ18FA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVzZXRTcG9uc29yc2hpcE1hbmFnZXIBCG1hbmFnZXJfBANlcnIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAihzZXRTcG9uc29yc2hpcE1hbmFnZXI6IHBlcm1pc3Npb24gZGVuaWVkAwkBASEBCQEQX3ZhbGlkYXRlQWRkcmVzcwEFCG1hbmFnZXJfCQACAQIuc2V0U3BvbnNvcnNoaXBNYW5hZ2VyOiBpbnZhbGlkIG1hbmFnZXIgYWRkcmVzcwUEdW5pdAMJAAACBQNlcnIFA2VycgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFF0tFWV9TUE9OU09SU0hJUF9NQU5BR0VSBQhtYW5hZ2VyXwUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXVwZGF0ZVNwb25zb3JzaGlwAhVtaW5TcG9uc29yZWRBc3NldEZlZV8Ud2F2ZXNSZXF1aXJlZEFtb3VudF8EA2VycgMJAQIhPQIIBQFpBmNhbGxlcgkBF19sb2FkU3BvbnNvcnNoaXBNYW5hZ2VyAAkAAgECJHVwZGF0ZVNwb25zb3JzaGlwOiBwZXJtaXNzaW9uIGRlbmllZAMJAGYCAAAFFW1pblNwb25zb3JlZEFzc2V0RmVlXwkAAgECKnVwZGF0ZVNwb25zb3JzaGlwOiBpbnZhbGlkIHNwb25zb3JzaGlwIGZlZQMJAGYCAAAFFHdhdmVzUmVxdWlyZWRBbW91bnRfCQACAQIwdXBkYXRlU3BvbnNvcnNoaXA6IGludmFsaWQgd2F2ZXMgcmVxdWlyZWQgYW1vdW50BQR1bml0AwkAAAIFA2VycgUDZXJyBAxzcG9uc29yQXNzZXQJAQpfbG9hZEFzc2V0AAQUbWluU3BvbnNvcmVkQXNzZXRGZWUDCQAAAgUVbWluU3BvbnNvcmVkQXNzZXRGZWVfAAAFBHVuaXQFFW1pblNwb25zb3JlZEFzc2V0RmVlXwQHYWN0aW9ucwMJAGYCCAkA7wcBBQR0aGlzB3JlZ3VsYXIFFHdhdmVzUmVxdWlyZWRBbW91bnRfCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIICQDvBwEFBHRoaXMHcmVndWxhcgUUd2F2ZXNSZXF1aXJlZEFtb3VudF8FBHVuaXQFA25pbAUDbmlsCQCUCgIJAM4IAgUHYWN0aW9ucwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAPAHAgUEdGhpcwUMc3BvbnNvckFzc2V0BQxzcG9uc29yQXNzZXQJAMwIAgkBClNwb25zb3JGZWUCBQxzcG9uc29yQXNzZXQFFG1pblNwb25zb3JlZEFzc2V0RmVlBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPd3hWb3RpbmdTdWdnZXN0Aw52b3RpbmdBZGRyZXNzXwh3eEFzc2V0Xwthc3NldEltYWdlXwQNdm90aW5nQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFDnZvdGluZ0FkZHJlc3NfAid3eFZvdGluZ1N1Z2dlc3Q6IGludmFsaWQgdm90aW5nIGFkZHJlc3MED3Nwb25zb3JBc3NldFN0cgkA2AQBCQEKX2xvYWRBc3NldAAEB3d4QXNzZXQJAQ5fdG9Bc3NldFZlY3RvcgEFCHd4QXNzZXRfBAt3eEFzc2V0SW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUHd3hBc3NldAIhd3hWb3RpbmdTdWdnZXN0OiBpbnZhbGlkIHd4IGFzc2V0AiZ3eFZvdGluZ1N1Z2dlc3Q6IGludmFsaWQgd3ggYXNzZXQgaW5mbwQKaW52b2NhdGlvbgkA/AcEBQ12b3RpbmdBZGRyZXNzAgdzdWdnZXN0CQDMCAIFD3Nwb25zb3JBc3NldFN0cgkAzAgCBQthc3NldEltYWdlXwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQd3eEFzc2V0CQBoAgBkCAULd3hBc3NldEluZm8IZGVjaW1hbHMFA25pbAMJAAACBQppbnZvY2F0aW9uBQppbnZvY2F0aW9uCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQlTRVBBUkFUT1IHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5FgQ9dQ==", "height": 2348364, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6aPd2miLEVUVkJQjPyGTXHfkgHfeMY1TyXVE4AJUdr8v Next: 8gijVd7Gv2Fnt3rZZMJ2tT7TMkJ7VEKsu6ZtEKs6xU4C Diff:
OldNewDifferences
420420 @Callable(i)
421421 func wxVotingSuggest (votingAddress_,wxAsset_,assetImage_) = {
422422 let votingAddress = valueOrErrorMessage(addressFromString(votingAddress_), "wxVotingSuggest: invalid voting address")
423+ let sponsorAssetStr = toBase58String(_loadAsset())
423424 let wxAsset = _toAssetVector(wxAsset_)
424425 let wxAssetInfo = valueOrErrorMessage(assetInfo(valueOrErrorMessage(wxAsset, "wxVotingSuggest: invalid wx asset")), "wxVotingSuggest: invalid wx asset info")
425- let invocation = invoke(votingAddress, "suggest", [_loadAsset(), assetImage_], [AttachedPayment(wxAsset, (100 * wxAssetInfo.decimals))])
426+ let invocation = invoke(votingAddress, "suggest", [sponsorAssetStr, assetImage_], [AttachedPayment(wxAsset, (100 * wxAssetInfo.decimals))])
426427 if ((invocation == invocation))
427428 then $Tuple2(nil, unit)
428429 else throw("Strict value is not equal to itself.")
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")
186186 let asset = _loadAsset()
187187 let baseAsset = _toAssetVector(baseAsset_)
188188 let err = if ((i.caller != this))
189189 then throw("init: permission denied")
190190 else if ((asset != base58''))
191191 then throw("init: already initialized")
192192 else if (if ((4 > size(tokenName_)))
193193 then true
194194 else (size(tokenName_) > 16))
195195 then throw("init: invalid token name")
196196 else if ((size(tokenDescr_) > 1000))
197197 then throw("init: invalid token description")
198198 else if (!(_validateAsset(baseAsset_)))
199199 then throw("init: invalid base asset")
200200 else if (!(_validateAddress(stakingAdapter_)))
201201 then throw("init: invalid staking adapter")
202202 else unit
203203 if ((err == err))
204204 then {
205205 let tokenDecimals = _getAssetDecimals(baseAsset)
206206 let issue = Issue(tokenName_, tokenDescr_, INIT_AMOUNT, tokenDecimals, true)
207207 let assetId = calculateAssetId(issue)
208208 let stakeActions = _updateStaking(baseAsset, INIT_AMOUNT, addressFromStringValue(stakingAdapter_))
209209 $Tuple2(([StringEntry(KEY_BASE_ASSET, baseAsset_), StringEntry(KEY_STAKING_ADAPTER, stakingAdapter_), StringEntry(KEY_ASSET, toBase58String(assetId)), issue] ++ stakeActions), unit)
210210 }
211211 else throw("Strict value is not equal to itself.")
212212 }
213213
214214
215215
216216 @Callable(i)
217217 func getRate () = {
218218 let lastRate = _loadBigInt(KEY_LAST_RATE, PERCENT_FACTOR)
219219 let currentRate = _loadBigInt(KEY_CURRENT_RATE, ZERO_BIGINT)
220220 let lastHeight = _loadInt(KEY_LAST_HEIGHT, 0)
221221 let targetHeight = min([_loadInt(KEY_TARGET_HEIGHT, 0), height])
222222 let rate = (lastRate + (currentRate * toBigInt((targetHeight - lastHeight))))
223223 $Tuple2(nil, toString(rate))
224224 }
225225
226226
227227
228228 @Callable(i)
229229 func checkpoint () = {
230230 let checkpoint = _checkpoint(true)
231231 if ((checkpoint == checkpoint))
232232 then if (!(checkpoint._1))
233233 then throw("checkpoint: no reward")
234234 else if ((checkpoint._2 > 0))
235235 then $Tuple2([ScriptTransfer(i.originCaller, checkpoint._2, _loadBaseAsset())], unit)
236236 else $Tuple2(nil, unit)
237237 else throw("Strict value is not equal to itself.")
238238 }
239239
240240
241241
242242 @Callable(i)
243243 func deposit () = {
244244 let caller = toString(i.caller)
245245 let baseAsset = _loadBaseAsset()
246246 let asset = _loadAsset()
247247 let assetQuantity = toBigInt(_getAssetQuantity(asset))
248248 let err = if ((size(i.payments) != 1))
249249 then throw("deposit: no payments")
250250 else if ((i.payments[0].assetId != baseAsset))
251251 then throw("deposit: payment is not in base asset")
252252 else if ((0 >= i.payments[0].amount))
253253 then throw("deposit: invalid payment amount")
254254 else unit
255255 if ((err == err))
256256 then {
257257 let checkpoint = _checkpoint(false)
258258 if ((checkpoint == checkpoint))
259259 then {
260260 let lastRate = _loadBigInt(KEY_LAST_RATE, PERCENT_FACTOR)
261261 let currentRate = _loadBigInt(KEY_CURRENT_RATE, ZERO_BIGINT)
262262 let lastHeight = _loadInt(KEY_LAST_HEIGHT, 0)
263263 let targetHeight = min([_loadInt(KEY_TARGET_HEIGHT, 0), height])
264264 let lastRateUpdated = (lastRate + (currentRate * toBigInt((targetHeight - lastHeight))))
265265 let issueAmount = toInt(fraction(toBigInt(i.payments[0].amount), PERCENT_FACTOR, lastRateUpdated, FLOOR))
266266 let currentRateUpdated = fraction(currentRate, assetQuantity, (assetQuantity + toBigInt(issueAmount)), FLOOR)
267267 let lastHeightUpdated = targetHeight
268268 let stakeActions = _updateStaking(baseAsset, i.payments[0].amount, _loadStakingAdapter())
269269 $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)
270270 }
271271 else throw("Strict value is not equal to itself.")
272272 }
273273 else throw("Strict value is not equal to itself.")
274274 }
275275
276276
277277
278278 @Callable(i)
279279 func stake (amount_,spreadBlocks_) = {
280280 let caller = toString(i.caller)
281281 let baseAsset = _loadBaseAsset()
282282 let asset = _loadAsset()
283283 let assetQuantity = toBigInt(_getAssetQuantity(asset))
284284 let err = if ((i.caller != this))
285285 then throw("stake: only this contract")
286286 else if ((0 >= amount_))
287287 then throw("stake: invalid stake amount")
288288 else if ((amount_ > _getAssetBalance(baseAsset, this)))
289289 then throw("stake: insufficient stake amount")
290290 else if ((assetQuantity == ZERO_BIGINT))
291291 then throw("stake: no deposits to stake for")
292292 else unit
293293 if ((err == err))
294294 then {
295295 let lastRate = _loadBigInt(KEY_LAST_RATE, PERCENT_FACTOR)
296296 let currentRate = _loadBigInt(KEY_CURRENT_RATE, ZERO_BIGINT)
297297 let lastHeight = _loadInt(KEY_LAST_HEIGHT, 0)
298298 let targetHeight = _loadInt(KEY_TARGET_HEIGHT, 0)
299299 let minTargetHeight = min([targetHeight, height])
300300 let actions = if ((minTargetHeight == height))
301301 then {
302302 let lastRateUpdated = (lastRate + (toBigInt((minTargetHeight - lastHeight)) * currentRate))
303303 let remainingReward = (currentRate * toBigInt((targetHeight - minTargetHeight)))
304304 let currentRateUpdated = fraction(((toBigInt(amount_) * PERCENT_FACTOR) + remainingReward), ONE_BIGINT, (assetQuantity * toBigInt(spreadBlocks_)))
305305 let lastHeightUpdated = height
306306 let targetHeightUpdated = (lastHeightUpdated + spreadBlocks_)
307307 [BinaryEntry(KEY_LAST_RATE, toBytes(lastRateUpdated)), BinaryEntry(KEY_CURRENT_RATE, toBytes(currentRateUpdated)), IntegerEntry(KEY_LAST_HEIGHT, lastHeightUpdated), IntegerEntry(KEY_TARGET_HEIGHT, targetHeightUpdated)]
308308 }
309309 else if ((targetHeight > lastHeight))
310310 then {
311311 let lastRateUpdated = (lastRate + (toBigInt((targetHeight - lastHeight)) * currentRate))
312312 let currentRateUpdated = fraction(toBigInt(amount_), PERCENT_FACTOR, (assetQuantity * toBigInt(spreadBlocks_)))
313313 let lastHeightUpdated = height
314314 let targetHeightUpdated = (lastHeightUpdated + spreadBlocks_)
315315 [BinaryEntry(KEY_LAST_RATE, toBytes(lastRateUpdated)), BinaryEntry(KEY_CURRENT_RATE, toBytes(currentRateUpdated)), IntegerEntry(KEY_LAST_HEIGHT, lastHeightUpdated), IntegerEntry(KEY_TARGET_HEIGHT, targetHeightUpdated)]
316316 }
317317 else {
318318 let currentRateUpdated = fraction(toBigInt(amount_), PERCENT_FACTOR, (assetQuantity * toBigInt(spreadBlocks_)))
319319 let lastHeightUpdated = height
320320 let targetHeightUpdated = (lastHeightUpdated + spreadBlocks_)
321321 [BinaryEntry(KEY_CURRENT_RATE, toBytes(currentRateUpdated)), IntegerEntry(KEY_LAST_HEIGHT, lastHeightUpdated), IntegerEntry(KEY_TARGET_HEIGHT, targetHeightUpdated)]
322322 }
323323 let stakeActions = _updateStaking(baseAsset, amount_, _loadStakingAdapter())
324324 $Tuple2((actions ++ stakeActions), unit)
325325 }
326326 else throw("Strict value is not equal to itself.")
327327 }
328328
329329
330330
331331 @Callable(i)
332332 func withdraw () = {
333333 let caller = toString(i.caller)
334334 let baseAsset = _loadBaseAsset()
335335 let asset = _loadAsset()
336336 let assetQuantity = toBigInt(_getAssetQuantity(asset))
337337 let err = if ((1 > size(i.payments)))
338338 then throw("withdraw: no payments")
339339 else if ((i.payments[0].assetId != asset))
340340 then throw("withdraw: payment is not in correct asset")
341341 else if ((0 >= i.payments[0].amount))
342342 then throw("withdraw: invalid payment amount")
343343 else unit
344344 if ((err == err))
345345 then {
346346 let checkpoint = _checkpoint(false)
347347 if ((checkpoint == checkpoint))
348348 then {
349349 let lastRate = _loadBigInt(KEY_LAST_RATE, PERCENT_FACTOR)
350350 let currentRate = _loadBigInt(KEY_CURRENT_RATE, ZERO_BIGINT)
351351 let lastHeight = _loadInt(KEY_LAST_HEIGHT, 0)
352352 let targetHeight = min([_loadInt(KEY_TARGET_HEIGHT, 0), height])
353353 let lastRateUpdated = (lastRate + (currentRate * toBigInt((targetHeight - lastHeight))))
354354 let baseAmount = toInt(fraction(toBigInt(i.payments[0].amount), lastRateUpdated, PERCENT_FACTOR, FLOOR))
355355 let currentRateUpdated = fraction(currentRate, assetQuantity, (assetQuantity - toBigInt(i.payments[0].amount)), FLOOR)
356356 let lastHeightUpdated = targetHeight
357357 let stakeActions = _updateStaking(baseAsset, (-1 * baseAmount), _loadStakingAdapter())
358358 $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)
359359 }
360360 else throw("Strict value is not equal to itself.")
361361 }
362362 else throw("Strict value is not equal to itself.")
363363 }
364364
365365
366366
367367 @Callable(i)
368368 func setMultisig (multisig_) = {
369369 let err = if ((i.caller != this))
370370 then throw("setMultisig: permission denied")
371371 else if (!(_validateAddress(multisig_)))
372372 then throw("setMultisig: invalid multisig address")
373373 else unit
374374 if ((err == err))
375375 then $Tuple2([StringEntry(KEY_MULTISIG, multisig_)], unit)
376376 else throw("Strict value is not equal to itself.")
377377 }
378378
379379
380380
381381 @Callable(i)
382382 func setSponsorshipManager (manager_) = {
383383 let err = if ((i.caller != this))
384384 then throw("setSponsorshipManager: permission denied")
385385 else if (!(_validateAddress(manager_)))
386386 then throw("setSponsorshipManager: invalid manager address")
387387 else unit
388388 if ((err == err))
389389 then $Tuple2([StringEntry(KEY_SPONSORSHIP_MANAGER, manager_)], unit)
390390 else throw("Strict value is not equal to itself.")
391391 }
392392
393393
394394
395395 @Callable(i)
396396 func updateSponsorship (minSponsoredAssetFee_,wavesRequiredAmount_) = {
397397 let err = if ((i.caller != _loadSponsorshipManager()))
398398 then throw("updateSponsorship: permission denied")
399399 else if ((0 > minSponsoredAssetFee_))
400400 then throw("updateSponsorship: invalid sponsorship fee")
401401 else if ((0 > wavesRequiredAmount_))
402402 then throw("updateSponsorship: invalid waves required amount")
403403 else unit
404404 if ((err == err))
405405 then {
406406 let sponsorAsset = _loadAsset()
407407 let minSponsoredAssetFee = if ((minSponsoredAssetFee_ == 0))
408408 then unit
409409 else minSponsoredAssetFee_
410410 let actions = if ((wavesBalance(this).regular > wavesRequiredAmount_))
411411 then [ScriptTransfer(i.caller, (wavesBalance(this).regular - wavesRequiredAmount_), unit)]
412412 else nil
413413 $Tuple2((actions ++ [ScriptTransfer(i.caller, assetBalance(this, sponsorAsset), sponsorAsset), SponsorFee(sponsorAsset, minSponsoredAssetFee)]), unit)
414414 }
415415 else throw("Strict value is not equal to itself.")
416416 }
417417
418418
419419
420420 @Callable(i)
421421 func wxVotingSuggest (votingAddress_,wxAsset_,assetImage_) = {
422422 let votingAddress = valueOrErrorMessage(addressFromString(votingAddress_), "wxVotingSuggest: invalid voting address")
423+ let sponsorAssetStr = toBase58String(_loadAsset())
423424 let wxAsset = _toAssetVector(wxAsset_)
424425 let wxAssetInfo = valueOrErrorMessage(assetInfo(valueOrErrorMessage(wxAsset, "wxVotingSuggest: invalid wx asset")), "wxVotingSuggest: invalid wx asset info")
425- let invocation = invoke(votingAddress, "suggest", [_loadAsset(), assetImage_], [AttachedPayment(wxAsset, (100 * wxAssetInfo.decimals))])
426+ let invocation = invoke(votingAddress, "suggest", [sponsorAssetStr, assetImage_], [AttachedPayment(wxAsset, (100 * wxAssetInfo.decimals))])
426427 if ((invocation == invocation))
427428 then $Tuple2(nil, unit)
428429 else throw("Strict value is not equal to itself.")
429430 }
430431
431432
432433 @Verifier(tx)
433434 func verify () = match getString(KEY_MULTISIG) {
434435 case multisig: String =>
435436 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
436437 case _ =>
437438 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
438439 }
439440

github/deemru/w8io/026f985 
47.39 ms