tx · 8gijVd7Gv2Fnt3rZZMJ2tT7TMkJ7VEKsu6ZtEKs6xU4C

3N4kXZHGke6yRq3Z57q7BTgCrT2SCvQCYER:  -0.01400000 Waves

2022.12.06 13:45 [2348378] smart account 3N4kXZHGke6yRq3Z57q7BTgCrT2SCvQCYER > SELF 0.00000000 Waves

{ "type": 13, "id": "8gijVd7Gv2Fnt3rZZMJ2tT7TMkJ7VEKsu6ZtEKs6xU4C", "fee": 1400000, "feeAssetId": null, "timestamp": 1670323435906, "version": 2, "chainId": 84, "sender": "3N4kXZHGke6yRq3Z57q7BTgCrT2SCvQCYER", "senderPublicKey": "6sxdMr2xYPPACEJccwmgS7nWC2ez1c38Y1kDX49ne42b", "proofs": [ "3srgyW9WWriGcTk5nSFtimJ9JMgs6MQdTeSENp38v9PaW2e1sVoFs1X1mo7wfz4YhUZhikUQt2BG39FvrEpMhAvX" ], "script": "base64:BgIwCAISBgoECAgICBIAEgASABIECgIBARIAEgMKAQgSAwoBCBIECgIBARIGCgQICAEIIgAJU0VQQVJBVE9SAgJfXwAFV0FWRVMCBVdBVkVTAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAApLRVlfU1RBVFVTAgZTVEFUVVMADktFWV9CQVNFX0FTU0VUAgpCQVNFX0FTU0VUAAlLRVlfQVNTRVQCBUFTU0VUABNLRVlfU1RBS0lOR19BREFQVEVSAg9TVEFLSU5HX0FEQVBURVIAEktFWV9TVEFLSU5HX0FNT1VOVAIOU1RBS0lOR19BTU9VTlQADUtFWV9MQVNUX1JBVEUCCUxBU1RfUkFURQAQS0VZX0NVUlJFTlRfUkFURQIMQ1VSUkVOVF9SQVRFAA9LRVlfTEFTVF9IRUlHSFQCC0xBU1RfSEVJR0hUABFLRVlfVEFSR0VUX0hFSUdIVAINVEFSR0VUX0hFSUdIVAAXS0VZX1NQT05TT1JTSElQX01BTkFHRVICE1NQT05TT1JTSElQX01BTkFHRVIACkZVTkNfU1RBS0UCBXN0YWtlAAxGVU5DX1VOU1RBS0UCB3Vuc3Rha2UAEUZVTkNfQ0xBSU1fUkVXQVJEAgtjbGFpbVJld2FyZAAOUEVSQ0VOVF9GQUNUT1IJALYCAQCAoJSljR0AC1pFUk9fQklHSU5UCQC2AgEAAAAKT05FX0JJR0lOVAkAtgIBAAEAC0lOSVRfQU1PVU5UAIDC1y8BEF92YWxpZGF0ZUFkZHJlc3MBCGFkZHJlc3NfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwEOX3ZhbGlkYXRlQXNzZXQBBmFzc2V0XwMJAAACBQZhc3NldF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFBmFzc2V0XwMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAYHAQ5fdG9Bc3NldFZlY3RvcgEGYXNzZXRfAwkAAAIFBmFzc2V0XwUFV0FWRVMFBHVuaXQJANkEAQUGYXNzZXRfARFfZ2V0QXNzZXREZWNpbWFscwEGYXNzZXRfBAckbWF0Y2gwBQZhc3NldF8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAQHJG1hdGNoMQkA7AcBBQFhAwkAAQIFByRtYXRjaDECBUFzc2V0BAVhc3NldAUHJG1hdGNoMQgFBWFzc2V0CGRlY2ltYWxzCQACAQIgX2dldEFzc2V0RGVjaW1hbHM6IG5vIHN1Y2ggYXNzZXQACAERX2dldEFzc2V0UXVhbnRpdHkBBmFzc2V0XwQHJG1hdGNoMAkA7AcBBQZhc3NldF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAIBQFhCHF1YW50aXR5CQACAQIgX2dldEFzc2V0UXVhbnRpdHk6IG5vIHN1Y2ggYXNzZXQBEF9nZXRBc3NldEJhbGFuY2UCBmFzc2V0XwdhZGRyZXNzBAckbWF0Y2gwBQZhc3NldF8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkA8AcCBQdhZGRyZXNzBQFhCAkA7wcBBQdhZGRyZXNzB3JlZ3VsYXIBDl9sb2FkQmFzZUFzc2V0AAQHJG1hdGNoMAkAoggBBQ5LRVlfQkFTRV9BU1NFVAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQAAAgUBYQUFV0FWRVMFBHVuaXQJANkEAQUBYQkAAgECHV9sb2FkQmFzZUFzc2V0OiBubyBiYXNlIGFzc2V0ARNfbG9hZFN0YWtpbmdBZGFwdGVyAAQHJG1hdGNoMAkAoggBBRNLRVlfU1RBS0lOR19BREFQVEVSAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkAAgECJ19sb2FkU3Rha2luZ0FkYXB0ZXI6IG5vIHN0YWtpbmcgYWRhcHRlcgEXX2xvYWRTcG9uc29yc2hpcE1hbmFnZXIABAckbWF0Y2gwCQCiCAEFF0tFWV9TUE9OU09SU0hJUF9NQU5BR0VSAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkAAgECL19sb2FkU3BvbnNvcnNoaXBNYW5hZ2VyOiBubyBzcG9uc29yc2hpcCBtYW5hZ2VyAQhfbG9hZEludAIEa2V5XwhkZWZhdWx0XwQHJG1hdGNoMAkAnwgBBQRrZXlfAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQUIZGVmYXVsdF8BC19sb2FkQmlnSW50AgRrZXlfCGRlZmF1bHRfBAckbWF0Y2gwCQChCAEFBGtleV8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkAngMBBQFhBQhkZWZhdWx0XwEKX2xvYWRBc3NldAAEByRtYXRjaDAJAKIIAQUJS0VZX0FTU0VUAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkA2QQBBQFhAQABDl91cGRhdGVTdGFraW5nAwZhc3NldF8HYW1vdW50XwhhZGFwdGVyXwQNc3Rha2luZ0Ftb3VudAkBCF9sb2FkSW50AgUSS0VZX1NUQUtJTkdfQU1PVU5UAAAEEG5ld1N0YWtpbmdBbW91bnQJAGQCBQ1zdGFraW5nQW1vdW50BQdhbW91bnRfBAppbnZvY2F0aW9uAwkAZgIFB2Ftb3VudF8AAAkA/AcEBQhhZGFwdGVyXwUKRlVOQ19TVEFLRQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQZhc3NldF8FB2Ftb3VudF8FA25pbAkA/AcEBQhhZGFwdGVyXwUMRlVOQ19VTlNUQUtFCQDMCAIJAGgCAP///////////wEFB2Ftb3VudF8FA25pbAUDbmlsAwkAAAIFCmludm9jYXRpb24FCmludm9jYXRpb24JAMwIAgkBDEludGVnZXJFbnRyeQIFEktFWV9TVEFLSU5HX0FNT1VOVAUQbmV3U3Rha2luZ0Ftb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtfY2hlY2twb2ludAEMY29tcGVuc2F0aW9uBAppbnZvY2F0aW9uCQD8BwQJARNfbG9hZFN0YWtpbmdBZGFwdGVyAAURRlVOQ19DTEFJTV9SRVdBUkQFA25pbAUDbmlsAwkAAAIFCmludm9jYXRpb24FCmludm9jYXRpb24EByRtYXRjaDAFCmludm9jYXRpb24DCQABAgUHJG1hdGNoMAIPKEludCwgSW50LCBJbnQpBAZyZXdhcmQFByRtYXRjaDADBQxjb21wZW5zYXRpb24EBXN0YWtlCQD8BwQFBHRoaXMFCkZVTkNfU1RBS0UJAMwIAggFBnJld2FyZAJfMQkAzAgCCAUGcmV3YXJkAl8zBQNuaWwFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UJAJQKAgYIBQZyZXdhcmQCXzIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBXN0YWtlCQD8BwQFBHRoaXMFCkZVTkNfU1RBS0UJAMwIAgkAZAIIBQZyZXdhcmQCXzEIBQZyZXdhcmQCXzIJAMwIAggFBnJld2FyZAJfMwUDbmlsBQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlCQCUCgIGAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgcAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgoBaQEEaW5pdAQKdG9rZW5OYW1lXwt0b2tlbkRlc2NyXwpiYXNlQXNzZXRfD3N0YWtpbmdBZGFwdGVyXwQIbXVsdGlzaWcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBQxLRVlfTVVMVElTSUcCFWluaXQ6IG5vIG11bHRpc2lnIHNldAQFYXNzZXQJAQpfbG9hZEFzc2V0AAQJYmFzZUFzc2V0CQEOX3RvQXNzZXRWZWN0b3IBBQpiYXNlQXNzZXRfBANlcnIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhdpbml0OiBwZXJtaXNzaW9uIGRlbmllZAMJAQIhPQIFBWFzc2V0AQAJAAIBAhlpbml0OiBhbHJlYWR5IGluaXRpYWxpemVkAwMJAGYCAAQJALECAQUKdG9rZW5OYW1lXwYJAGYCCQCxAgEFCnRva2VuTmFtZV8AEAkAAgECGGluaXQ6IGludmFsaWQgdG9rZW4gbmFtZQMJAGYCCQCxAgEFC3Rva2VuRGVzY3JfAOgHCQACAQIfaW5pdDogaW52YWxpZCB0b2tlbiBkZXNjcmlwdGlvbgMJAQEhAQkBDl92YWxpZGF0ZUFzc2V0AQUKYmFzZUFzc2V0XwkAAgECGGluaXQ6IGludmFsaWQgYmFzZSBhc3NldAMJAQEhAQkBEF92YWxpZGF0ZUFkZHJlc3MBBQ9zdGFraW5nQWRhcHRlcl8JAAIBAh1pbml0OiBpbnZhbGlkIHN0YWtpbmcgYWRhcHRlcgUEdW5pdAMJAAACBQNlcnIFA2VycgQNdG9rZW5EZWNpbWFscwkBEV9nZXRBc3NldERlY2ltYWxzAQUJYmFzZUFzc2V0BAVpc3N1ZQkAwggFBQp0b2tlbk5hbWVfBQt0b2tlbkRlc2NyXwULSU5JVF9BTU9VTlQFDXRva2VuRGVjaW1hbHMGBAdhc3NldElkCQC4CAEFBWlzc3VlBAxzdGFrZUFjdGlvbnMJAQ5fdXBkYXRlU3Rha2luZwMFCWJhc2VBc3NldAULSU5JVF9BTU9VTlQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFD3N0YWtpbmdBZGFwdGVyXwkAlAoCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUOS0VZX0JBU0VfQVNTRVQFCmJhc2VBc3NldF8JAMwIAgkBC1N0cmluZ0VudHJ5AgUTS0VZX1NUQUtJTkdfQURBUFRFUgUPc3Rha2luZ0FkYXB0ZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCUtFWV9BU1NFVAkA2AQBBQdhc3NldElkCQDMCAIFBWlzc3VlBQNuaWwFDHN0YWtlQWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdnZXRSYXRlAAQIbGFzdFJhdGUJAQtfbG9hZEJpZ0ludAIFDUtFWV9MQVNUX1JBVEUFDlBFUkNFTlRfRkFDVE9SBAtjdXJyZW50UmF0ZQkBC19sb2FkQmlnSW50AgUQS0VZX0NVUlJFTlRfUkFURQULWkVST19CSUdJTlQECmxhc3RIZWlnaHQJAQhfbG9hZEludAIFD0tFWV9MQVNUX0hFSUdIVAAABAx0YXJnZXRIZWlnaHQJAJcDAQkAzAgCCQEIX2xvYWRJbnQCBRFLRVlfVEFSR0VUX0hFSUdIVAAACQDMCAIFBmhlaWdodAUDbmlsBARyYXRlCQC3AgIFCGxhc3RSYXRlCQC5AgIFC2N1cnJlbnRSYXRlCQC2AgEJAGUCBQx0YXJnZXRIZWlnaHQFCmxhc3RIZWlnaHQJAJQKAgUDbmlsCQCmAwEFBHJhdGUBaQEKY2hlY2twb2ludAAECmNoZWNrcG9pbnQJAQtfY2hlY2twb2ludAEGAwkAAAIFCmNoZWNrcG9pbnQFCmNoZWNrcG9pbnQDCQEBIQEIBQpjaGVja3BvaW50Al8xCQACAQIVY2hlY2twb2ludDogbm8gcmV3YXJkAwkAZgIIBQpjaGVja3BvaW50Al8yAAAJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQxvcmlnaW5DYWxsZXIIBQpjaGVja3BvaW50Al8yCQEOX2xvYWRCYXNlQXNzZXQABQNuaWwFBHVuaXQJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2RlcG9zaXQABAZjYWxsZXIJAKUIAQgFAWkGY2FsbGVyBAliYXNlQXNzZXQJAQ5fbG9hZEJhc2VBc3NldAAEBWFzc2V0CQEKX2xvYWRBc3NldAAEDWFzc2V0UXVhbnRpdHkJALYCAQkBEV9nZXRBc3NldFF1YW50aXR5AQUFYXNzZXQEA2VycgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECFGRlcG9zaXQ6IG5vIHBheW1lbnRzAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQliYXNlQXNzZXQJAAIBAiVkZXBvc2l0OiBwYXltZW50IGlzIG5vdCBpbiBiYXNlIGFzc2V0AwkAZwIAAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAAIBAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BQR1bml0AwkAAAIFA2VycgUDZXJyBApjaGVja3BvaW50CQELX2NoZWNrcG9pbnQBBwMJAAACBQpjaGVja3BvaW50BQpjaGVja3BvaW50BAhsYXN0UmF0ZQkBC19sb2FkQmlnSW50AgUNS0VZX0xBU1RfUkFURQUOUEVSQ0VOVF9GQUNUT1IEC2N1cnJlbnRSYXRlCQELX2xvYWRCaWdJbnQCBRBLRVlfQ1VSUkVOVF9SQVRFBQtaRVJPX0JJR0lOVAQKbGFzdEhlaWdodAkBCF9sb2FkSW50AgUPS0VZX0xBU1RfSEVJR0hUAAAEDHRhcmdldEhlaWdodAkAlwMBCQDMCAIJAQhfbG9hZEludAIFEUtFWV9UQVJHRVRfSEVJR0hUAAAJAMwIAgUGaGVpZ2h0BQNuaWwED2xhc3RSYXRlVXBkYXRlZAkAtwICBQhsYXN0UmF0ZQkAuQICBQtjdXJyZW50UmF0ZQkAtgIBCQBlAgUMdGFyZ2V0SGVpZ2h0BQpsYXN0SGVpZ2h0BAtpc3N1ZUFtb3VudAkAoAMBCQC9AgQJALYCAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFDlBFUkNFTlRfRkFDVE9SBQ9sYXN0UmF0ZVVwZGF0ZWQFBUZMT09SBBJjdXJyZW50UmF0ZVVwZGF0ZWQJAL0CBAULY3VycmVudFJhdGUFDWFzc2V0UXVhbnRpdHkJALcCAgUNYXNzZXRRdWFudGl0eQkAtgIBBQtpc3N1ZUFtb3VudAUFRkxPT1IEEWxhc3RIZWlnaHRVcGRhdGVkBQx0YXJnZXRIZWlnaHQEDHN0YWtlQWN0aW9ucwkBDl91cGRhdGVTdGFraW5nAwUJYmFzZUFzc2V0CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBE19sb2FkU3Rha2luZ0FkYXB0ZXIACQCUCgIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFBWFzc2V0BQtpc3N1ZUFtb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtpc3N1ZUFtb3VudAUFYXNzZXQJAMwIAgkBC0JpbmFyeUVudHJ5AgUNS0VZX0xBU1RfUkFURQkAnQMBBQ9sYXN0UmF0ZVVwZGF0ZWQJAMwIAgkBC0JpbmFyeUVudHJ5AgUQS0VZX0NVUlJFTlRfUkFURQkAnQMBBRJjdXJyZW50UmF0ZVVwZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFD0tFWV9MQVNUX0hFSUdIVAURbGFzdEhlaWdodFVwZGF0ZWQFA25pbAUMc3Rha2VBY3Rpb25zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXN0YWtlAgdhbW91bnRfDXNwcmVhZEJsb2Nrc18EBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIECWJhc2VBc3NldAkBDl9sb2FkQmFzZUFzc2V0AAQFYXNzZXQJAQpfbG9hZEFzc2V0AAQNYXNzZXRRdWFudGl0eQkAtgIBCQERX2dldEFzc2V0UXVhbnRpdHkBBQVhc3NldAQDZXJyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIZc3Rha2U6IG9ubHkgdGhpcyBjb250cmFjdAMJAGcCAAAFB2Ftb3VudF8JAAIBAhtzdGFrZTogaW52YWxpZCBzdGFrZSBhbW91bnQDCQBmAgUHYW1vdW50XwkBEF9nZXRBc3NldEJhbGFuY2UCBQliYXNlQXNzZXQFBHRoaXMJAAIBAiBzdGFrZTogaW5zdWZmaWNpZW50IHN0YWtlIGFtb3VudAMJAAACBQ1hc3NldFF1YW50aXR5BQtaRVJPX0JJR0lOVAkAAgECH3N0YWtlOiBubyBkZXBvc2l0cyB0byBzdGFrZSBmb3IFBHVuaXQDCQAAAgUDZXJyBQNlcnIECGxhc3RSYXRlCQELX2xvYWRCaWdJbnQCBQ1LRVlfTEFTVF9SQVRFBQ5QRVJDRU5UX0ZBQ1RPUgQLY3VycmVudFJhdGUJAQtfbG9hZEJpZ0ludAIFEEtFWV9DVVJSRU5UX1JBVEUFC1pFUk9fQklHSU5UBApsYXN0SGVpZ2h0CQEIX2xvYWRJbnQCBQ9LRVlfTEFTVF9IRUlHSFQAAAQMdGFyZ2V0SGVpZ2h0CQEIX2xvYWRJbnQCBRFLRVlfVEFSR0VUX0hFSUdIVAAABA9taW5UYXJnZXRIZWlnaHQJAJcDAQkAzAgCBQx0YXJnZXRIZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwEB2FjdGlvbnMDCQAAAgUPbWluVGFyZ2V0SGVpZ2h0BQZoZWlnaHQED2xhc3RSYXRlVXBkYXRlZAkAtwICBQhsYXN0UmF0ZQkAuQICCQC2AgEJAGUCBQ9taW5UYXJnZXRIZWlnaHQFCmxhc3RIZWlnaHQFC2N1cnJlbnRSYXRlBA9yZW1haW5pbmdSZXdhcmQJALkCAgULY3VycmVudFJhdGUJALYCAQkAZQIFDHRhcmdldEhlaWdodAUPbWluVGFyZ2V0SGVpZ2h0BBJjdXJyZW50UmF0ZVVwZGF0ZWQJALwCAwkAtwICCQC5AgIJALYCAQUHYW1vdW50XwUOUEVSQ0VOVF9GQUNUT1IFD3JlbWFpbmluZ1Jld2FyZAUKT05FX0JJR0lOVAkAuQICBQ1hc3NldFF1YW50aXR5CQC2AgEFDXNwcmVhZEJsb2Nrc18EEWxhc3RIZWlnaHRVcGRhdGVkBQZoZWlnaHQEE3RhcmdldEhlaWdodFVwZGF0ZWQJAGQCBRFsYXN0SGVpZ2h0VXBkYXRlZAUNc3ByZWFkQmxvY2tzXwkAzAgCCQELQmluYXJ5RW50cnkCBQ1LRVlfTEFTVF9SQVRFCQCdAwEFD2xhc3RSYXRlVXBkYXRlZAkAzAgCCQELQmluYXJ5RW50cnkCBRBLRVlfQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPS0VZX0xBU1RfSEVJR0hUBRFsYXN0SGVpZ2h0VXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURS0VZX1RBUkdFVF9IRUlHSFQFE3RhcmdldEhlaWdodFVwZGF0ZWQFA25pbAMJAGYCBQx0YXJnZXRIZWlnaHQFCmxhc3RIZWlnaHQED2xhc3RSYXRlVXBkYXRlZAkAtwICBQhsYXN0UmF0ZQkAuQICCQC2AgEJAGUCBQx0YXJnZXRIZWlnaHQFCmxhc3RIZWlnaHQFC2N1cnJlbnRSYXRlBBJjdXJyZW50UmF0ZVVwZGF0ZWQJALwCAwkAtgIBBQdhbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAuQICBQ1hc3NldFF1YW50aXR5CQC2AgEFDXNwcmVhZEJsb2Nrc18EEWxhc3RIZWlnaHRVcGRhdGVkBQZoZWlnaHQEE3RhcmdldEhlaWdodFVwZGF0ZWQJAGQCBRFsYXN0SGVpZ2h0VXBkYXRlZAUNc3ByZWFkQmxvY2tzXwkAzAgCCQELQmluYXJ5RW50cnkCBQ1LRVlfTEFTVF9SQVRFCQCdAwEFD2xhc3RSYXRlVXBkYXRlZAkAzAgCCQELQmluYXJ5RW50cnkCBRBLRVlfQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPS0VZX0xBU1RfSEVJR0hUBRFsYXN0SGVpZ2h0VXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURS0VZX1RBUkdFVF9IRUlHSFQFE3RhcmdldEhlaWdodFVwZGF0ZWQFA25pbAQSY3VycmVudFJhdGVVcGRhdGVkCQC8AgMJALYCAQUHYW1vdW50XwUOUEVSQ0VOVF9GQUNUT1IJALkCAgUNYXNzZXRRdWFudGl0eQkAtgIBBQ1zcHJlYWRCbG9ja3NfBBFsYXN0SGVpZ2h0VXBkYXRlZAUGaGVpZ2h0BBN0YXJnZXRIZWlnaHRVcGRhdGVkCQBkAgURbGFzdEhlaWdodFVwZGF0ZWQFDXNwcmVhZEJsb2Nrc18JAMwIAgkBC0JpbmFyeUVudHJ5AgUQS0VZX0NVUlJFTlRfUkFURQkAnQMBBRJjdXJyZW50UmF0ZVVwZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFD0tFWV9MQVNUX0hFSUdIVAURbGFzdEhlaWdodFVwZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEUtFWV9UQVJHRVRfSEVJR0hUBRN0YXJnZXRIZWlnaHRVcGRhdGVkBQNuaWwEDHN0YWtlQWN0aW9ucwkBDl91cGRhdGVTdGFraW5nAwUJYmFzZUFzc2V0BQdhbW91bnRfCQETX2xvYWRTdGFraW5nQWRhcHRlcgAJAJQKAgkAzggCBQdhY3Rpb25zBQxzdGFrZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcABAZjYWxsZXIJAKUIAQgFAWkGY2FsbGVyBAliYXNlQXNzZXQJAQ5fbG9hZEJhc2VBc3NldAAEBWFzc2V0CQEKX2xvYWRBc3NldAAEDWFzc2V0UXVhbnRpdHkJALYCAQkBEV9nZXRBc3NldFF1YW50aXR5AQUFYXNzZXQEA2VycgMJAGYCAAEJAJADAQgFAWkIcGF5bWVudHMJAAIBAhV3aXRoZHJhdzogbm8gcGF5bWVudHMDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFBWFzc2V0CQACAQIpd2l0aGRyYXc6IHBheW1lbnQgaXMgbm90IGluIGNvcnJlY3QgYXNzZXQDCQBnAgAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAAgECIHdpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BQR1bml0AwkAAAIFA2VycgUDZXJyBApjaGVja3BvaW50CQELX2NoZWNrcG9pbnQBBwMJAAACBQpjaGVja3BvaW50BQpjaGVja3BvaW50BAhsYXN0UmF0ZQkBC19sb2FkQmlnSW50AgUNS0VZX0xBU1RfUkFURQUOUEVSQ0VOVF9GQUNUT1IEC2N1cnJlbnRSYXRlCQELX2xvYWRCaWdJbnQCBRBLRVlfQ1VSUkVOVF9SQVRFBQtaRVJPX0JJR0lOVAQKbGFzdEhlaWdodAkBCF9sb2FkSW50AgUPS0VZX0xBU1RfSEVJR0hUAAAEDHRhcmdldEhlaWdodAkAlwMBCQDMCAIJAQhfbG9hZEludAIFEUtFWV9UQVJHRVRfSEVJR0hUAAAJAMwIAgUGaGVpZ2h0BQNuaWwED2xhc3RSYXRlVXBkYXRlZAkAtwICBQhsYXN0UmF0ZQkAuQICBQtjdXJyZW50UmF0ZQkAtgIBCQBlAgUMdGFyZ2V0SGVpZ2h0BQpsYXN0SGVpZ2h0BApiYXNlQW1vdW50CQCgAwEJAL0CBAkAtgIBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUPbGFzdFJhdGVVcGRhdGVkBQ5QRVJDRU5UX0ZBQ1RPUgUFRkxPT1IEEmN1cnJlbnRSYXRlVXBkYXRlZAkAvQIEBQtjdXJyZW50UmF0ZQUNYXNzZXRRdWFudGl0eQkAuAICBQ1hc3NldFF1YW50aXR5CQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQVGTE9PUgQRbGFzdEhlaWdodFVwZGF0ZWQFDHRhcmdldEhlaWdodAQMc3Rha2VBY3Rpb25zCQEOX3VwZGF0ZVN0YWtpbmcDBQliYXNlQXNzZXQJAGgCAP///////////wEFCmJhc2VBbW91bnQJARNfbG9hZFN0YWtpbmdBZGFwdGVyAAkAlAoCCQDOCAIFDHN0YWtlQWN0aW9ucwkAzAgCCQEEQnVybgIFBWFzc2V0CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCmJhc2VBbW91bnQFBHVuaXQJAMwIAgkBC0JpbmFyeUVudHJ5AgUNS0VZX0xBU1RfUkFURQkAnQMBBQ9sYXN0UmF0ZVVwZGF0ZWQJAMwIAgkBC0JpbmFyeUVudHJ5AgUQS0VZX0NVUlJFTlRfUkFURQkAnQMBBRJjdXJyZW50UmF0ZVVwZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFD0tFWV9MQVNUX0hFSUdIVAURbGFzdEhlaWdodFVwZGF0ZWQFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzZXRNdWx0aXNpZwEJbXVsdGlzaWdfBANlcnIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAh5zZXRNdWx0aXNpZzogcGVybWlzc2lvbiBkZW5pZWQDCQEBIQEJARBfdmFsaWRhdGVBZGRyZXNzAQUJbXVsdGlzaWdfCQACAQIlc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcgYWRkcmVzcwUEdW5pdAMJAAACBQNlcnIFA2VycgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9NVUxUSVNJRwUJbXVsdGlzaWdfBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVc2V0U3BvbnNvcnNoaXBNYW5hZ2VyAQhtYW5hZ2VyXwQDZXJyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIoc2V0U3BvbnNvcnNoaXBNYW5hZ2VyOiBwZXJtaXNzaW9uIGRlbmllZAMJAQEhAQkBEF92YWxpZGF0ZUFkZHJlc3MBBQhtYW5hZ2VyXwkAAgECLnNldFNwb25zb3JzaGlwTWFuYWdlcjogaW52YWxpZCBtYW5hZ2VyIGFkZHJlc3MFBHVuaXQDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBRdLRVlfU1BPTlNPUlNISVBfTUFOQUdFUgUIbWFuYWdlcl8FA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARF1cGRhdGVTcG9uc29yc2hpcAIVbWluU3BvbnNvcmVkQXNzZXRGZWVfFHdhdmVzUmVxdWlyZWRBbW91bnRfBANlcnIDCQECIT0CCAUBaQZjYWxsZXIJARdfbG9hZFNwb25zb3JzaGlwTWFuYWdlcgAJAAIBAiR1cGRhdGVTcG9uc29yc2hpcDogcGVybWlzc2lvbiBkZW5pZWQDCQBmAgAABRVtaW5TcG9uc29yZWRBc3NldEZlZV8JAAIBAip1cGRhdGVTcG9uc29yc2hpcDogaW52YWxpZCBzcG9uc29yc2hpcCBmZWUDCQBmAgAABRR3YXZlc1JlcXVpcmVkQW1vdW50XwkAAgECMHVwZGF0ZVNwb25zb3JzaGlwOiBpbnZhbGlkIHdhdmVzIHJlcXVpcmVkIGFtb3VudAUEdW5pdAMJAAACBQNlcnIFA2VycgQMc3BvbnNvckFzc2V0CQEKX2xvYWRBc3NldAAEFG1pblNwb25zb3JlZEFzc2V0RmVlAwkAAAIFFW1pblNwb25zb3JlZEFzc2V0RmVlXwAABQR1bml0BRVtaW5TcG9uc29yZWRBc3NldEZlZV8EB2FjdGlvbnMDCQBmAggJAO8HAQUEdGhpcwdyZWd1bGFyBRR3YXZlc1JlcXVpcmVkQW1vdW50XwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCCAkA7wcBBQR0aGlzB3JlZ3VsYXIFFHdhdmVzUmVxdWlyZWRBbW91bnRfBQR1bml0BQNuaWwFA25pbAkAlAoCCQDOCAIFB2FjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQDwBwIFBHRoaXMFDHNwb25zb3JBc3NldAUMc3BvbnNvckFzc2V0CQDMCAIJAQpTcG9uc29yRmVlAgUMc3BvbnNvckFzc2V0BRRtaW5TcG9uc29yZWRBc3NldEZlZQUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD3d4Vm90aW5nU3VnZ2VzdAQOdm90aW5nQWRkcmVzc18Id3hBc3NldF8Jd3hBbW91bnRfC2Fzc2V0SW1hZ2VfBANlcnIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAiJ3eFZvdGluZ1N1Z2dlc3Q6IHBlcm1pc3Npb24gZGVuaWVkAwkBASEBCQEQX3ZhbGlkYXRlQWRkcmVzcwEFDnZvdGluZ0FkZHJlc3NfCQACAQInd3hWb3RpbmdTdWdnZXN0OiBpbnZhbGlkIHZvdGluZyBhZGRyZXNzAwkAZgIAAAUJd3hBbW91bnRfCQACAQIid3hWb3RpbmdTdWdnZXN0OiBpbnZhbGlkIHd4IGFtb3VudAUEdW5pdAMJAAACBQNlcnIFA2VycgQPc3BvbnNvckFzc2V0U3RyCQDYBAEJAQpfbG9hZEFzc2V0AAQHd3hBc3NldAkBDl90b0Fzc2V0VmVjdG9yAQUId3hBc3NldF8EC3d4QXNzZXRJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQd3eEFzc2V0AiF3eFZvdGluZ1N1Z2dlc3Q6IGludmFsaWQgd3ggYXNzZXQCJnd4Vm90aW5nU3VnZ2VzdDogaW52YWxpZCB3eCBhc3NldCBpbmZvBAppbnZvY2F0aW9uCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDnZvdGluZ0FkZHJlc3NfAgdzdWdnZXN0CQDMCAIFD3Nwb25zb3JBc3NldFN0cgkAzAgCBQthc3NldEltYWdlXwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQd3eEFzc2V0CQBoAgUJd3hBbW91bnRfCAULd3hBc3NldEluZm8IZGVjaW1hbHMFA25pbAMJAAACBQppbnZvY2F0aW9uBQppbnZvY2F0aW9uCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQlTRVBBUkFUT1IHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5GLwpbQ==", "height": 2348378, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HrL5TnfyTHyWT29Avd5GMq1zSMwSkZgStTCWEHUPJ6AN Next: ESTcvu8S9pTZiz2248A3tUjFUKUHsdjdtZPLT5nb8ZAL Diff:
OldNewDifferences
418418
419419
420420 @Callable(i)
421-func wxVotingSuggest (votingAddress_,wxAsset_,assetImage_) = {
422- let votingAddress = valueOrErrorMessage(addressFromString(votingAddress_), "wxVotingSuggest: invalid voting address")
423- let sponsorAssetStr = toBase58String(_loadAsset())
424- let wxAsset = _toAssetVector(wxAsset_)
425- let wxAssetInfo = valueOrErrorMessage(assetInfo(valueOrErrorMessage(wxAsset, "wxVotingSuggest: invalid wx asset")), "wxVotingSuggest: invalid wx asset info")
426- let invocation = invoke(votingAddress, "suggest", [sponsorAssetStr, assetImage_], [AttachedPayment(wxAsset, (100 * wxAssetInfo.decimals))])
427- if ((invocation == invocation))
428- then $Tuple2(nil, unit)
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 wxAsset = _toAssetVector(wxAsset_)
433+ let wxAssetInfo = valueOrErrorMessage(assetInfo(valueOrErrorMessage(wxAsset, "wxVotingSuggest: invalid wx asset")), "wxVotingSuggest: invalid wx asset info")
434+ let invocation = invoke(addressFromStringValue(votingAddress_), "suggest", [sponsorAssetStr, assetImage_], [AttachedPayment(wxAsset, (wxAmount_ * wxAssetInfo.decimals))])
435+ if ((invocation == invocation))
436+ then $Tuple2(nil, unit)
437+ else throw("Strict value is not equal to itself.")
438+ }
429439 else throw("Strict value is not equal to itself.")
430440 }
431441
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)
421-func wxVotingSuggest (votingAddress_,wxAsset_,assetImage_) = {
422- let votingAddress = valueOrErrorMessage(addressFromString(votingAddress_), "wxVotingSuggest: invalid voting address")
423- let sponsorAssetStr = toBase58String(_loadAsset())
424- let wxAsset = _toAssetVector(wxAsset_)
425- let wxAssetInfo = valueOrErrorMessage(assetInfo(valueOrErrorMessage(wxAsset, "wxVotingSuggest: invalid wx asset")), "wxVotingSuggest: invalid wx asset info")
426- let invocation = invoke(votingAddress, "suggest", [sponsorAssetStr, assetImage_], [AttachedPayment(wxAsset, (100 * wxAssetInfo.decimals))])
427- if ((invocation == invocation))
428- then $Tuple2(nil, unit)
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 wxAsset = _toAssetVector(wxAsset_)
433+ let wxAssetInfo = valueOrErrorMessage(assetInfo(valueOrErrorMessage(wxAsset, "wxVotingSuggest: invalid wx asset")), "wxVotingSuggest: invalid wx asset info")
434+ let invocation = invoke(addressFromStringValue(votingAddress_), "suggest", [sponsorAssetStr, assetImage_], [AttachedPayment(wxAsset, (wxAmount_ * wxAssetInfo.decimals))])
435+ if ((invocation == invocation))
436+ then $Tuple2(nil, unit)
437+ else throw("Strict value is not equal to itself.")
438+ }
429439 else throw("Strict value is not equal to itself.")
430440 }
431441
432442
433443 @Verifier(tx)
434444 func verify () = match getString(KEY_MULTISIG) {
435445 case multisig: String =>
436446 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
437447 case _ =>
438448 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
439449 }
440450

github/deemru/w8io/3ef1775 
129.85 ms