tx · B7VNDGc2LMnfWjNKuv2KMBPmRUwStJhpesmnGToCfHj7

3N161dNaH1Zu796mCcrFz6RU2ne7TXjNFA7:  -0.01400000 Waves

2022.10.13 23:05 [2271043] smart account 3N161dNaH1Zu796mCcrFz6RU2ne7TXjNFA7 > SELF 0.00000000 Waves

{ "type": 13, "id": "B7VNDGc2LMnfWjNKuv2KMBPmRUwStJhpesmnGToCfHj7", "fee": 1400000, "feeAssetId": null, "timestamp": 1665691567172, "version": 2, "chainId": 84, "sender": "3N161dNaH1Zu796mCcrFz6RU2ne7TXjNFA7", "senderPublicKey": "DPxp9FYJJXeS9HeeyLgzEogd8BNLkD19yJgwBAhFbPju", "proofs": [ "5Wk9Mu97HWF8JuH1GYuFcgpEMQLJrSdfRHKAcWhQzxH3yzNLKgLJuBSjq119skMkgFHkE75jfAXBGrRR8BmoKq5k" ], "script": "base64:BgIWCAISBAoCCAgSAwoBCBIAEgMKAQESAAwACVNFUEFSQVRPUgICX18ADlBFUkNFTlRfRkFDVE9SCQC2AgEAgKCUpY0dAAtaRVJPX0JJR0lOVAkAtgIBAAAACk9ORV9CSUdJTlQJALYCAQABAApUT0tFTl9OQU1FAgxTdGFrZWQgV0FWRVMAEVRPS0VOX0RFU0NSSVBUSU9OAhJTdGFrZWQgV0FWRVMgdG9rZW4ADlRPS0VOX0RFQ0lNQUxTAAgBDGdldExlYXNlTm9kZQAEByRtYXRjaDAJAKIIAQIKTEVBU0VfTk9ERQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAQdBZGRyZXNzAQkA2QQBBQFhCQACAQIjZ2V0TGVhc2VOb2RlOiBubyBsZWFzZSBub2RlIGFkZHJlc3MBB2xvYWRJbnQCBGtleV8IZGVmYXVsdF8EByRtYXRjaDAJAJ8IAQUEa2V5XwMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEFCGRlZmF1bHRfAQpsb2FkQmlnSW50AgRrZXlfCGRlZmF1bHRfBAckbWF0Y2gwCQChCAEFBGtleV8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkAngMBBQFhBQhkZWZhdWx0XwEJbG9hZEFzc2V0AAQHJG1hdGNoMAkAoggBAgVBU1NFVAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJANkEAQUBYQEAAQ5fdXBkYXRlTGVhc2luZwEHYW1vdW50XwQHbGVhc2VJZAkAoQgBAghMRUFTRV9JRAQLbGVhc2VBbW91bnQJAQdsb2FkSW50AgIMTEVBU0VfQU1PVU5UAAAEDm5ld0xlYXNlQW1vdW50CQBkAgULbGVhc2VBbW91bnQFB2Ftb3VudF8EDnVubGVhc2VPckVtcHR5AwkBCWlzRGVmaW5lZAEFB2xlYXNlSWQJAMwIAgkBC0xlYXNlQ2FuY2VsAQkBBXZhbHVlAQUHbGVhc2VJZAUDbmlsBQNuaWwEDGxlYXNlQWN0aW9ucwMJAGYCBQ5uZXdMZWFzZUFtb3VudAAABAVsZWFzZQkAxAgCCQEMZ2V0TGVhc2VOb2RlAAUObmV3TGVhc2VBbW91bnQJAMwIAgUFbGVhc2UJAMwIAgkBC0JpbmFyeUVudHJ5AgIITEVBU0VfSUQJALkIAQUFbGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQICDExFQVNFX0FNT1VOVAUObmV3TGVhc2VBbW91bnQFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBAghMRUFTRV9JRAkAzAgCCQEMSW50ZWdlckVudHJ5AgIMTEVBU0VfQU1PVU5UAAAFA25pbAkAzggCBQ51bmxlYXNlT3JFbXB0eQUMbGVhc2VBY3Rpb25zBQFpAQRpbml0AghtdWx0aXNpZwlsZWFzZU5vZGUEBWFzc2V0CQEJbG9hZEFzc2V0AAQDZXJyAwkBAiE9AgUFYXNzZXQBAAkAAgECGWluaXQ6IGFscmVhZHkgaW5pdGlhbGl6ZWQDCQAAAgUJbGVhc2VOb2RlAgAJAAIBAhhpbml0OiBpbnZhbGlkIGxlYXNlIG5vZGUDAwkAAAIFCG11bHRpc2lnAgAGCQECIT0CCQDIAQEJANkEAQUIbXVsdGlzaWcAIAkAAgECIWluaXQ6IGludmFsaWQgbXVsdGlzaWcgcHVibGljIGtleQUEdW5pdAMJAAACBQNlcnIFA2VycgQFaXNzdWUJAMIIBQUKVE9LRU5fTkFNRQURVE9LRU5fREVTQ1JJUFRJT04AAAUOVE9LRU5fREVDSU1BTFMGBAdhc3NldElkCQC4CAEFBWlzc3VlCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgIKTEVBU0VfTk9ERQUJbGVhc2VOb2RlCQDMCAIJAQtTdHJpbmdFbnRyeQICBUFTU0VUCQDYBAEFB2Fzc2V0SWQJAMwIAgUFaXNzdWUFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQp1cGRhdGVOb2RlAQlsZWFzZU5vZGUEB2xlYXNlSWQJAKEIAQIITEVBU0VfSUQEC2xlYXNlQW1vdW50CQEHbG9hZEludAICDExFQVNFX0FNT1VOVAAABA51bmxlYXNlT3JFbXB0eQMJAQlpc0RlZmluZWQBBQdsZWFzZUlkCQDMCAIJAQtMZWFzZUNhbmNlbAEJAQV2YWx1ZQEFB2xlYXNlSWQFA25pbAUDbmlsBAVsZWFzZQkAxAgCCQEHQWRkcmVzcwEJANkEAQUJbGVhc2VOb2RlBQtsZWFzZUFtb3VudAQMbGVhc2VBY3Rpb25zCQDMCAIFBWxlYXNlCQDMCAIJAQtCaW5hcnlFbnRyeQICCExFQVNFX0lECQC5CAEFBWxlYXNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgxMRUFTRV9BTU9VTlQFC2xlYXNlQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQICCkxFQVNFX05PREUFCWxlYXNlTm9kZQUDbmlsCQCUCgIJAM4IAgUOdW5sZWFzZU9yRW1wdHkFDGxlYXNlQWN0aW9ucwUEdW5pdAFpAQdkZXBvc2l0AAQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgQDZXJyAwkAZgIAAQkAkAMBCAUBaQhwYXltZW50cwkAAgECFGRlcG9zaXQ6IG5vIHBheW1lbnRzAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0CQACAQIdZGVwb3NpdDogcGF5bWVudCBpcyBub3Qgd2F2ZXMDCQBnAgAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAAgECH2RlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhbW91bnQFBHVuaXQDCQAAAgUDZXJyBQNlcnIEBWFzc2V0CQEJbG9hZEFzc2V0AAQNYXNzZXRRdWFudGl0eQQHJG1hdGNoMAkA7AcBBQVhc3NldAMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAkAtgIBCAUBYQhxdWFudGl0eQkAAgECIWRlcG9zaXQ6IGNvbnRyYWN0IG5vdCBpbml0aWFsaXplZAQMdG90YWxEZXBvc2l0CQEHbG9hZEludAICDVRPVEFMX0RFUE9TSVQAAAQIbGFzdFJhdGUJAQpsb2FkQmlnSW50AgIJTEFTVF9SQVRFBQ5QRVJDRU5UX0ZBQ1RPUgQLY3VycmVudFJhdGUJAQpsb2FkQmlnSW50AgIMQ1VSUkVOVF9SQVRFBQtaRVJPX0JJR0lOVAQKbGFzdEhlaWdodAkBB2xvYWRJbnQCAgtMQVNUX0hFSUdIVAAABAx0YXJnZXRIZWlnaHQJAJcDAQkAzAgCCQEHbG9hZEludAICDVRBUkdFVF9IRUlHSFQAAAkAzAgCCAUJbGFzdEJsb2NrBmhlaWdodAUDbmlsBA9sYXN0UmF0ZVVwZGF0ZWQJALcCAgUIbGFzdFJhdGUJALkCAgULY3VycmVudFJhdGUJALYCAQkAZQIFDHRhcmdldEhlaWdodAUKbGFzdEhlaWdodAQLaXNzdWVBbW91bnQJAKADAQkAvQIECQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ5QRVJDRU5UX0ZBQ1RPUgUPbGFzdFJhdGVVcGRhdGVkBQVGTE9PUgQSY3VycmVudFJhdGVVcGRhdGVkCQC9AgQFC2N1cnJlbnRSYXRlBQ1hc3NldFF1YW50aXR5CQC3AgIFDWFzc2V0UXVhbnRpdHkJALYCAQULaXNzdWVBbW91bnQFBUZMT09SBBFsYXN0SGVpZ2h0VXBkYXRlZAUMdGFyZ2V0SGVpZ2h0BAxsZWFzZUFjdGlvbnMJAQ5fdXBkYXRlTGVhc2luZwEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQCUCgIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFBWFzc2V0BQtpc3N1ZUFtb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtpc3N1ZUFtb3VudAUFYXNzZXQJAMwIAgkBDEludGVnZXJFbnRyeQICDVRPVEFMX0RFUE9TSVQJAGQCBQx0b3RhbERlcG9zaXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJAQtCaW5hcnlFbnRyeQICCUxBU1RfUkFURQkAnQMBBQ9sYXN0UmF0ZVVwZGF0ZWQJAMwIAgkBC0JpbmFyeUVudHJ5AgIMQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgILTEFTVF9IRUlHSFQFEWxhc3RIZWlnaHRVcGRhdGVkBQNuaWwFDGxlYXNlQWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQEJYXRCbG9ja3NfBAZjYWxsZXIJAKUIAQgFAWkGY2FsbGVyBAVhc3NldAkBCWxvYWRBc3NldAAEDWFzc2V0UXVhbnRpdHkEByRtYXRjaDAJAOwHAQUFYXNzZXQDCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAJALYCAQgFAWEIcXVhbnRpdHkJAAIBAh9zdGFrZTogY29udHJhY3Qgbm90IGluaXRpYWxpemVkBANlcnIDCQECIT0CCAUBaQZjYWxsZXIJAQxnZXRMZWFzZU5vZGUACQACAQIcc3Rha2U6IGNhbGxlciBpcyBub3QgYWxsb3dlZAMJAGcCAAAFCWF0QmxvY2tzXwkAAgECFXN0YWtlOiBpbnZhbGlkIGJsb2NrcwMJAGYCAAEJAJADAQgFAWkIcGF5bWVudHMJAAIBAhJzdGFrZTogbm8gcGF5bWVudHMDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFBHVuaXQJAAIBAhtzdGFrZTogcGF5bWVudCBpcyBub3Qgd2F2ZXMDCQBnAgAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAAgECHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50AwkAAAIFDWFzc2V0UXVhbnRpdHkFC1pFUk9fQklHSU5UCQACAQIfc3Rha2U6IG5vIGRlcG9zaXRzIHRvIHN0YWtlIGZvcgUEdW5pdAMJAAACBQNlcnIFA2VycgQIbGFzdFJhdGUJAQpsb2FkQmlnSW50AgIJTEFTVF9SQVRFBQ5QRVJDRU5UX0ZBQ1RPUgQLY3VycmVudFJhdGUJAQpsb2FkQmlnSW50AgIMQ1VSUkVOVF9SQVRFBQtaRVJPX0JJR0lOVAQKbGFzdEhlaWdodAkBB2xvYWRJbnQCAgtMQVNUX0hFSUdIVAAABAx0YXJnZXRIZWlnaHQJAQdsb2FkSW50AgINVEFSR0VUX0hFSUdIVAAABA9taW5UYXJnZXRIZWlnaHQJAJcDAQkAzAgCBQx0YXJnZXRIZWlnaHQJAMwIAggFCWxhc3RCbG9jawZoZWlnaHQFA25pbAQHYWN0aW9ucwMJAAACBQ9taW5UYXJnZXRIZWlnaHQIBQlsYXN0QmxvY2sGaGVpZ2h0BA9sYXN0UmF0ZVVwZGF0ZWQJALcCAgUIbGFzdFJhdGUJALkCAgkAtgIBCQBlAgUPbWluVGFyZ2V0SGVpZ2h0BQpsYXN0SGVpZ2h0BQtjdXJyZW50UmF0ZQQPcmVtYWluaW5nUmV3YXJkCQC5AgIFC2N1cnJlbnRSYXRlCQC2AgEJAGUCBQx0YXJnZXRIZWlnaHQFD21pblRhcmdldEhlaWdodAQSY3VycmVudFJhdGVVcGRhdGVkCQC8AgMJALcCAgkAuQICCQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ5QRVJDRU5UX0ZBQ1RPUgUPcmVtYWluaW5nUmV3YXJkBQpPTkVfQklHSU5UCQC5AgIFDWFzc2V0UXVhbnRpdHkJALYCAQUJYXRCbG9ja3NfBBFsYXN0SGVpZ2h0VXBkYXRlZAgFCWxhc3RCbG9jawZoZWlnaHQEE3RhcmdldEhlaWdodFVwZGF0ZWQJAGQCBRFsYXN0SGVpZ2h0VXBkYXRlZAUJYXRCbG9ja3NfCQDMCAIJAQtCaW5hcnlFbnRyeQICCUxBU1RfUkFURQkAnQMBBQ9sYXN0UmF0ZVVwZGF0ZWQJAMwIAgkBC0JpbmFyeUVudHJ5AgIMQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgILTEFTVF9IRUlHSFQFEWxhc3RIZWlnaHRVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1UQVJHRVRfSEVJR0hUBRN0YXJnZXRIZWlnaHRVcGRhdGVkBQNuaWwDCQBmAgUMdGFyZ2V0SGVpZ2h0BQpsYXN0SGVpZ2h0BA9sYXN0UmF0ZVVwZGF0ZWQJALcCAgUIbGFzdFJhdGUJALkCAgkAtgIBCQBlAgUMdGFyZ2V0SGVpZ2h0BQpsYXN0SGVpZ2h0BQtjdXJyZW50UmF0ZQQSY3VycmVudFJhdGVVcGRhdGVkCQC8AgMJALYCAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFDlBFUkNFTlRfRkFDVE9SCQC5AgIFDWFzc2V0UXVhbnRpdHkJALYCAQUJYXRCbG9ja3NfBBFsYXN0SGVpZ2h0VXBkYXRlZAgFCWxhc3RCbG9jawZoZWlnaHQEE3RhcmdldEhlaWdodFVwZGF0ZWQJAGQCBRFsYXN0SGVpZ2h0VXBkYXRlZAUJYXRCbG9ja3NfCQDMCAIJAQtCaW5hcnlFbnRyeQICCUxBU1RfUkFURQkAnQMBBQ9sYXN0UmF0ZVVwZGF0ZWQJAMwIAgkBC0JpbmFyeUVudHJ5AgIMQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgILTEFTVF9IRUlHSFQFEWxhc3RIZWlnaHRVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1UQVJHRVRfSEVJR0hUBRN0YXJnZXRIZWlnaHRVcGRhdGVkBQNuaWwEEmN1cnJlbnRSYXRlVXBkYXRlZAkAvAIDCQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ5QRVJDRU5UX0ZBQ1RPUgkAuQICBQ1hc3NldFF1YW50aXR5CQC2AgEFCWF0QmxvY2tzXwQRbGFzdEhlaWdodFVwZGF0ZWQIBQlsYXN0QmxvY2sGaGVpZ2h0BBN0YXJnZXRIZWlnaHRVcGRhdGVkCQBkAgURbGFzdEhlaWdodFVwZGF0ZWQFCWF0QmxvY2tzXwkAzAgCCQELQmluYXJ5RW50cnkCAgxDVVJSRU5UX1JBVEUJAJ0DAQUSY3VycmVudFJhdGVVcGRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgtMQVNUX0hFSUdIVAURbGFzdEhlaWdodFVwZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQICDVRBUkdFVF9IRUlHSFQFE3RhcmdldEhlaWdodFVwZGF0ZWQFA25pbAQMbGVhc2VBY3Rpb25zCQEOX3VwZGF0ZUxlYXNpbmcBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAlAoCCQDOCAIFB2FjdGlvbnMFDGxlYXNlQWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwAEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQEJbG9hZEFzc2V0AAQDZXJyAwkAZgIAAQkAkAMBCAUBaQhwYXltZW50cwkAAgECFXdpdGhkcmF3OiBubyBwYXltZW50cwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUFYXNzZXQJAAIBAiV3aXRoZHJhdzogcGF5bWVudCBpcyBub3Qgc3Rha2VkIHdhdmVzAwkAZwIAAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAAIBAiB3aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFtb3VudAUEdW5pdAMJAAACBQNlcnIFA2VycgQNYXNzZXRRdWFudGl0eQQHJG1hdGNoMAkA7AcBBQVhc3NldAMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAkAtgIBCAUBYQhxdWFudGl0eQkAAgECIndpdGhkcmF3OiBjb250cmFjdCBub3QgaW5pdGlhbGl6ZWQECGxhc3RSYXRlCQEKbG9hZEJpZ0ludAICCUxBU1RfUkFURQUOUEVSQ0VOVF9GQUNUT1IEC2N1cnJlbnRSYXRlCQEKbG9hZEJpZ0ludAICDENVUlJFTlRfUkFURQULWkVST19CSUdJTlQECmxhc3RIZWlnaHQJAQdsb2FkSW50AgILTEFTVF9IRUlHSFQAAAQMdGFyZ2V0SGVpZ2h0CQCXAwEJAMwIAgkBB2xvYWRJbnQCAg1UQVJHRVRfSEVJR0hUAAAJAMwIAggFCWxhc3RCbG9jawZoZWlnaHQFA25pbAQPbGFzdFJhdGVVcGRhdGVkCQC3AgIFCGxhc3RSYXRlCQC5AgIFC2N1cnJlbnRSYXRlCQC2AgEJAGUCBQx0YXJnZXRIZWlnaHQFCmxhc3RIZWlnaHQEC3dhdmVzQW1vdW50CQCgAwEJAL0CBAkAtgIBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUPbGFzdFJhdGVVcGRhdGVkBQ5QRVJDRU5UX0ZBQ1RPUgUFRkxPT1IEEmN1cnJlbnRSYXRlVXBkYXRlZAkAvQIEBQtjdXJyZW50UmF0ZQUNYXNzZXRRdWFudGl0eQkAuAICBQ1hc3NldFF1YW50aXR5CQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQVGTE9PUgQRbGFzdEhlaWdodFVwZGF0ZWQFDHRhcmdldEhlaWdodAQMbGVhc2VBY3Rpb25zCQEOX3VwZGF0ZUxlYXNpbmcBCQBoAgD///////////8BBQt3YXZlc0Ftb3VudAkAlAoCCQDOCAIFDGxlYXNlQWN0aW9ucwkAzAgCCQEEQnVybgIFBWFzc2V0CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC3dhdmVzQW1vdW50BQR1bml0CQDMCAIJAQtCaW5hcnlFbnRyeQICCUxBU1RfUkFURQkAnQMBBQ9sYXN0UmF0ZVVwZGF0ZWQJAMwIAgkBC0JpbmFyeUVudHJ5AgIMQ1VSUkVOVF9SQVRFCQCdAwEFEmN1cnJlbnRSYXRlVXBkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgILTEFTVF9IRUlHSFQFEWxhc3RIZWlnaHRVcGRhdGVkBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABBBtdWx0aXNpZ0NvbnRyYWN0CQCnCAEJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIITVVMVElTSUcEBnF1b3J1bQkBEUBleHRyTmF0aXZlKDEwNTApAgUQbXVsdGlzaWdDb250cmFjdAIGUVVPUlVNBApwdWJsaWNLZXlzCQERQGV4dHJOYXRpdmUoMTA1MykCBRBtdWx0aXNpZ0NvbnRyYWN0AgtQVUJMSUNfS0VZUwQOcHVibGljS2V5c0xpc3QJALUJAgUKcHVibGljS2V5cwUJU0VQQVJBVE9SCgEIdmVyaWZpZXICA2FjYwxwdWJsaWNLZXlTdHIECXB1YmxpY0tleQkA2QQBBQxwdWJsaWNLZXlTdHIDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwgFA2FjYwJfMQUJcHVibGljS2V5CQCUCgIJAGQCCAUDYWNjAl8xAAEJAGQCCAUDYWNjAl8yAAEJAJQKAgkAZAIIBQNhY2MCXzEAAQgFA2FjYwJfMgQGcmVzdWx0CgACJGwFDnB1YmxpY0tleXNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAEAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIdmVyaWZpZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAGcCCAUGcmVzdWx0Al8yBQZxdW9ydW0hbnL4", "height": 2271043, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEPARATOR = "__"
5+
6+let PERCENT_FACTOR = toBigInt(1000000000000)
7+
8+let ZERO_BIGINT = toBigInt(0)
9+
10+let ONE_BIGINT = toBigInt(1)
11+
12+let TOKEN_NAME = "Staked WAVES"
13+
14+let TOKEN_DESCRIPTION = "Staked WAVES token"
15+
16+let TOKEN_DECIMALS = 8
17+
18+func getLeaseNode () = match getString("LEASE_NODE") {
19+ case a: String =>
20+ Address(fromBase58String(a))
21+ case _ =>
22+ throw("getLeaseNode: no lease node address")
23+}
24+
25+
26+func loadInt (key_,default_) = match getInteger(key_) {
27+ case a: Int =>
28+ a
29+ case _ =>
30+ default_
31+}
32+
33+
34+func loadBigInt (key_,default_) = match getBinary(key_) {
35+ case a: ByteVector =>
36+ toBigInt(a)
37+ case _ =>
38+ default_
39+}
40+
41+
42+func loadAsset () = match getString("ASSET") {
43+ case a: String =>
44+ fromBase58String(a)
45+ case _ =>
46+ base58''
47+}
48+
49+
50+func _updateLeasing (amount_) = {
51+ let leaseId = getBinary("LEASE_ID")
52+ let leaseAmount = loadInt("LEASE_AMOUNT", 0)
53+ let newLeaseAmount = (leaseAmount + amount_)
54+ let unleaseOrEmpty = if (isDefined(leaseId))
55+ then [LeaseCancel(value(leaseId))]
56+ else nil
57+ let leaseActions = if ((newLeaseAmount > 0))
58+ then {
59+ let lease = Lease(getLeaseNode(), newLeaseAmount)
60+[lease, BinaryEntry("LEASE_ID", calculateLeaseId(lease)), IntegerEntry("LEASE_AMOUNT", newLeaseAmount)]
61+ }
62+ else [DeleteEntry("LEASE_ID"), IntegerEntry("LEASE_AMOUNT", 0)]
63+ (unleaseOrEmpty ++ leaseActions)
64+ }
65+
66+
67+@Callable(i)
68+func init (multisig,leaseNode) = {
69+ let asset = loadAsset()
70+ let err = if ((asset != base58''))
71+ then throw("init: already initialized")
72+ else if ((leaseNode == ""))
73+ then throw("init: invalid lease node")
74+ else if (if ((multisig == ""))
75+ then true
76+ else (size(fromBase58String(multisig)) != 32))
77+ then throw("init: invalid multisig public key")
78+ else unit
79+ if ((err == err))
80+ then {
81+ let issue = Issue(TOKEN_NAME, TOKEN_DESCRIPTION, 0, TOKEN_DECIMALS, true)
82+ let assetId = calculateAssetId(issue)
83+ $Tuple2([StringEntry("LEASE_NODE", leaseNode), StringEntry("ASSET", toBase58String(assetId)), issue], unit)
84+ }
85+ else throw("Strict value is not equal to itself.")
86+ }
87+
88+
89+
90+@Callable(i)
91+func updateNode (leaseNode) = {
92+ let leaseId = getBinary("LEASE_ID")
93+ let leaseAmount = loadInt("LEASE_AMOUNT", 0)
94+ let unleaseOrEmpty = if (isDefined(leaseId))
95+ then [LeaseCancel(value(leaseId))]
96+ else nil
97+ let lease = Lease(Address(fromBase58String(leaseNode)), leaseAmount)
98+ let leaseActions = [lease, BinaryEntry("LEASE_ID", calculateLeaseId(lease)), IntegerEntry("LEASE_AMOUNT", leaseAmount), StringEntry("LEASE_NODE", leaseNode)]
99+ $Tuple2((unleaseOrEmpty ++ leaseActions), unit)
100+ }
101+
102+
103+
104+@Callable(i)
105+func deposit () = {
106+ let caller = toString(i.caller)
107+ let err = if ((1 > size(i.payments)))
108+ then throw("deposit: no payments")
109+ else if ((i.payments[0].assetId != unit))
110+ then throw("deposit: payment is not waves")
111+ else if ((0 >= i.payments[0].amount))
112+ then throw("deposit: invalid payment amount")
113+ else unit
114+ if ((err == err))
115+ then {
116+ let asset = loadAsset()
117+ let assetQuantity = match assetInfo(asset) {
118+ case a: Asset =>
119+ toBigInt(a.quantity)
120+ case _ =>
121+ throw("deposit: contract not initialized")
122+ }
123+ let totalDeposit = loadInt("TOTAL_DEPOSIT", 0)
124+ let lastRate = loadBigInt("LAST_RATE", PERCENT_FACTOR)
125+ let currentRate = loadBigInt("CURRENT_RATE", ZERO_BIGINT)
126+ let lastHeight = loadInt("LAST_HEIGHT", 0)
127+ let targetHeight = min([loadInt("TARGET_HEIGHT", 0), lastBlock.height])
128+ let lastRateUpdated = (lastRate + (currentRate * toBigInt((targetHeight - lastHeight))))
129+ let issueAmount = toInt(fraction(toBigInt(i.payments[0].amount), PERCENT_FACTOR, lastRateUpdated, FLOOR))
130+ let currentRateUpdated = fraction(currentRate, assetQuantity, (assetQuantity + toBigInt(issueAmount)), FLOOR)
131+ let lastHeightUpdated = targetHeight
132+ let leaseActions = _updateLeasing(i.payments[0].amount)
133+ $Tuple2(([Reissue(asset, issueAmount, true), ScriptTransfer(i.caller, issueAmount, asset), IntegerEntry("TOTAL_DEPOSIT", (totalDeposit + i.payments[0].amount)), BinaryEntry("LAST_RATE", toBytes(lastRateUpdated)), BinaryEntry("CURRENT_RATE", toBytes(currentRateUpdated)), IntegerEntry("LAST_HEIGHT", lastHeightUpdated)] ++ leaseActions), unit)
134+ }
135+ else throw("Strict value is not equal to itself.")
136+ }
137+
138+
139+
140+@Callable(i)
141+func stake (atBlocks_) = {
142+ let caller = toString(i.caller)
143+ let asset = loadAsset()
144+ let assetQuantity = match assetInfo(asset) {
145+ case a: Asset =>
146+ toBigInt(a.quantity)
147+ case _ =>
148+ throw("stake: contract not initialized")
149+ }
150+ let err = if ((i.caller != getLeaseNode()))
151+ then throw("stake: caller is not allowed")
152+ else if ((0 >= atBlocks_))
153+ then throw("stake: invalid blocks")
154+ else if ((1 > size(i.payments)))
155+ then throw("stake: no payments")
156+ else if ((i.payments[0].assetId != unit))
157+ then throw("stake: payment is not waves")
158+ else if ((0 >= i.payments[0].amount))
159+ then throw("stake: invalid payment amount")
160+ else if ((assetQuantity == ZERO_BIGINT))
161+ then throw("stake: no deposits to stake for")
162+ else unit
163+ if ((err == err))
164+ then {
165+ let lastRate = loadBigInt("LAST_RATE", PERCENT_FACTOR)
166+ let currentRate = loadBigInt("CURRENT_RATE", ZERO_BIGINT)
167+ let lastHeight = loadInt("LAST_HEIGHT", 0)
168+ let targetHeight = loadInt("TARGET_HEIGHT", 0)
169+ let minTargetHeight = min([targetHeight, lastBlock.height])
170+ let actions = if ((minTargetHeight == lastBlock.height))
171+ then {
172+ let lastRateUpdated = (lastRate + (toBigInt((minTargetHeight - lastHeight)) * currentRate))
173+ let remainingReward = (currentRate * toBigInt((targetHeight - minTargetHeight)))
174+ let currentRateUpdated = fraction(((toBigInt(i.payments[0].amount) * PERCENT_FACTOR) + remainingReward), ONE_BIGINT, (assetQuantity * toBigInt(atBlocks_)))
175+ let lastHeightUpdated = lastBlock.height
176+ let targetHeightUpdated = (lastHeightUpdated + atBlocks_)
177+[BinaryEntry("LAST_RATE", toBytes(lastRateUpdated)), BinaryEntry("CURRENT_RATE", toBytes(currentRateUpdated)), IntegerEntry("LAST_HEIGHT", lastHeightUpdated), IntegerEntry("TARGET_HEIGHT", targetHeightUpdated)]
178+ }
179+ else if ((targetHeight > lastHeight))
180+ then {
181+ let lastRateUpdated = (lastRate + (toBigInt((targetHeight - lastHeight)) * currentRate))
182+ let currentRateUpdated = fraction(toBigInt(i.payments[0].amount), PERCENT_FACTOR, (assetQuantity * toBigInt(atBlocks_)))
183+ let lastHeightUpdated = lastBlock.height
184+ let targetHeightUpdated = (lastHeightUpdated + atBlocks_)
185+[BinaryEntry("LAST_RATE", toBytes(lastRateUpdated)), BinaryEntry("CURRENT_RATE", toBytes(currentRateUpdated)), IntegerEntry("LAST_HEIGHT", lastHeightUpdated), IntegerEntry("TARGET_HEIGHT", targetHeightUpdated)]
186+ }
187+ else {
188+ let currentRateUpdated = fraction(toBigInt(i.payments[0].amount), PERCENT_FACTOR, (assetQuantity * toBigInt(atBlocks_)))
189+ let lastHeightUpdated = lastBlock.height
190+ let targetHeightUpdated = (lastHeightUpdated + atBlocks_)
191+[BinaryEntry("CURRENT_RATE", toBytes(currentRateUpdated)), IntegerEntry("LAST_HEIGHT", lastHeightUpdated), IntegerEntry("TARGET_HEIGHT", targetHeightUpdated)]
192+ }
193+ let leaseActions = _updateLeasing(i.payments[0].amount)
194+ $Tuple2((actions ++ leaseActions), unit)
195+ }
196+ else throw("Strict value is not equal to itself.")
197+ }
198+
199+
200+
201+@Callable(i)
202+func withdraw () = {
203+ let caller = toString(i.caller)
204+ let asset = loadAsset()
205+ let err = if ((1 > size(i.payments)))
206+ then throw("withdraw: no payments")
207+ else if ((i.payments[0].assetId != asset))
208+ then throw("withdraw: payment is not staked waves")
209+ else if ((0 >= i.payments[0].amount))
210+ then throw("withdraw: invalid payment amount")
211+ else unit
212+ if ((err == err))
213+ then {
214+ let assetQuantity = match assetInfo(asset) {
215+ case a: Asset =>
216+ toBigInt(a.quantity)
217+ case _ =>
218+ throw("withdraw: contract not initialized")
219+ }
220+ let lastRate = loadBigInt("LAST_RATE", PERCENT_FACTOR)
221+ let currentRate = loadBigInt("CURRENT_RATE", ZERO_BIGINT)
222+ let lastHeight = loadInt("LAST_HEIGHT", 0)
223+ let targetHeight = min([loadInt("TARGET_HEIGHT", 0), lastBlock.height])
224+ let lastRateUpdated = (lastRate + (currentRate * toBigInt((targetHeight - lastHeight))))
225+ let wavesAmount = toInt(fraction(toBigInt(i.payments[0].amount), lastRateUpdated, PERCENT_FACTOR, FLOOR))
226+ let currentRateUpdated = fraction(currentRate, assetQuantity, (assetQuantity - toBigInt(i.payments[0].amount)), FLOOR)
227+ let lastHeightUpdated = targetHeight
228+ let leaseActions = _updateLeasing((-1 * wavesAmount))
229+ $Tuple2((leaseActions ++ [Burn(asset, i.payments[0].amount), ScriptTransfer(i.caller, wavesAmount, unit), BinaryEntry("LAST_RATE", toBytes(lastRateUpdated)), BinaryEntry("CURRENT_RATE", toBytes(currentRateUpdated)), IntegerEntry("LAST_HEIGHT", lastHeightUpdated)]), unit)
230+ }
231+ else throw("Strict value is not equal to itself.")
232+ }
233+
234+
235+@Verifier(tx)
236+func verify () = {
237+ let multisigContract = addressFromPublicKey(fromBase58String(getStringValue(this, "MULTISIG")))
238+ let quorum = getIntegerValue(multisigContract, "QUORUM")
239+ let publicKeys = getStringValue(multisigContract, "PUBLIC_KEYS")
240+ let publicKeysList = split(publicKeys, SEPARATOR)
241+ func verifier (acc,publicKeyStr) = {
242+ let publicKey = fromBase58String(publicKeyStr)
243+ if (sigVerify(tx.bodyBytes, tx.proofs[acc._1], publicKey))
244+ then $Tuple2((acc._1 + 1), (acc._2 + 1))
245+ else $Tuple2((acc._1 + 1), acc._2)
246+ }
247+
248+ let result = {
249+ let $l = publicKeysList
250+ let $s = size($l)
251+ let $acc0 = $Tuple2(1, 0)
252+ func $f0_1 ($a,$i) = if (($i >= $s))
253+ then $a
254+ else verifier($a, $l[$i])
255+
256+ func $f0_2 ($a,$i) = if (($i >= $s))
257+ then $a
258+ else throw("List size exceeds 10")
259+
260+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
261+ }
262+ (result._2 >= quorum)
263+ }
264+

github/deemru/w8io/873ac7e 
25.61 ms