tx · 47KkVHdpBz1cSrmEnkwVtLfCJ4dJGxWvRRPWVFmiTtv6

3N3vjjwCXWsTfu2w6biwcPhZe3v17HGY3tR:  -0.01300000 Waves

2023.05.04 11:35 [2562780] smart account 3N3vjjwCXWsTfu2w6biwcPhZe3v17HGY3tR > SELF 0.00000000 Waves

{ "type": 13, "id": "47KkVHdpBz1cSrmEnkwVtLfCJ4dJGxWvRRPWVFmiTtv6", "fee": 1300000, "feeAssetId": null, "timestamp": 1683189390709, "version": 2, "chainId": 84, "sender": "3N3vjjwCXWsTfu2w6biwcPhZe3v17HGY3tR", "senderPublicKey": "B2SJ1BXVdLQeEg3kiwBCznf5t6GjLEz81mEWEV3fs2vF", "proofs": [ "4PWFVJY5AJ8fgHgsuwTiWLD864BgyCSWNKpBUxPzhshyrmCkN9FhqB2k91emAzf7utYX4FZ3bDhJX376nEq3BN62" ], "script": "base64:BgIgCAISBgoECAgBARIECgIBBBIDCgEBEgQKAgEEEgMKAQESAANTRVACAl9fARBibG9ja0hlaWdodEVycm9yAAkAAgECL1RoZSBibG9jaydzIGhlaWdodCBpcyB0b28gYmlnIGZvciB0aGlzIHByb3Bvc2FsARBhbHJlYWR5Vm90ZUVycm9yAAkAAgECFllvdSBoYXZlIGFscmVhZHkgdm90ZWQBC25vVm90ZUVycm9yAAkAAgECGllvdSBoYXZlIG5vdCBhbHJlYWR5IHZvdGVkARJnd3hDb250cmFjdEFkZHJlc3MACQC5CQIJAMwIAgICJXMJAMwIAgISZ3d4Q29udHJhY3RBZGRyZXNzBQNuaWwFA1NFUAEPa2V5Q3VycmVudEluZGV4AAkAuQkCCQDMCAICAiVzCQDMCAICDGN1cnJlbnRJbmRleAUDbmlsBQNTRVABD2tleVByb3Bvc2FsSW5mbwEGbnVtYmVyCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgxwcm9wb3NhbEluZm8JAMwIAgkApAMBBQZudW1iZXIFA25pbAUDU0VQARVrZXlVc2VyVm90ZU9uUHJvcG9zYWwCBm51bWJlcgR1c2VyCQC5CQIJAMwIAgIGJXMlZCVzCQDMCAICEnVzZXJWb3RlT25Qcm9wb3NhbAkAzAgCCQCkAwEFBm51bWJlcgkAzAgCBQR1c2VyBQNuaWwFA1NFUAETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAIXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MBD2dldEN1cnJlbnRJbmRleAAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ9rZXlDdXJyZW50SW5kZXgAARdnZXRNYW5hZ2VyQWRkcmVzc09yRmFpbAAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAESZm9ybWF0UHJvcG9zYWxJbmZvBgRuYW1lC2Rlc2NyaXB0aW9uA2VuZAxxdW9ydW1OdW1iZXINcG9zaXRpdmVWb3Rlcw1uZWdhdGl2ZVZvdGVzCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIFBG5hbWUJAMwIAgULZGVzY3JpcHRpb24JAMwIAgUDZW5kCQDMCAIFDHF1b3J1bU51bWJlcgkAzAgCBQ1wb3NpdGl2ZVZvdGVzCQDMCAIFDW5lZ2F0aXZlVm90ZXMFA25pbAUDU0VQARhmb3JtYXRVc2VyVm90ZU9uUHJvcG9zYWwCBHZvdGUJZ3d4TnVtYmVyCQC5CQIJAMwIAgIEJWQlZAkAzAgCBQR2b3RlCQDMCAIFCWd3eE51bWJlcgUDbmlsBQNTRVABBWFzSW50AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgNJbnQEBnZhbEludAUHJG1hdGNoMAUGdmFsSW50CQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50ARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQTbWFuYWdlclZhdWx0QWRkcmVzcwkBF2dldE1hbmFnZXJBZGRyZXNzT3JGYWlsAAQHJG1hdGNoMAkAnQgCBRNtYW5hZ2VyVmF1bHRBZGRyZXNzCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQlpc01hbmFnZXIBAWkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAAgECC01hdGNoIGVycm9yAQttdXN0TWFuYWdlcgEBaQMJAQlpc01hbmFnZXIBBQFpBgkAAgECEXBlcm1pc3Npb24gZGVuaWVkBQFpAQxzdGFydE5ld1ZvdGUEBG5hbWULZGVzY3JpcHRpb24QZXhwaXJhdGlvbkhlaWdodAxxdW9ydW1OdW1iZXIEBmNoZWNrcwkAzAgCCQELbXVzdE1hbmFnZXIBBQFpBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MECHRoZUluZGV4CQEPZ2V0Q3VycmVudEluZGV4AAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleUN1cnJlbnRJbmRleAAJAGQCBQh0aGVJbmRleAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlQcm9wb3NhbEluZm8BBQh0aGVJbmRleAkBEmZvcm1hdFByb3Bvc2FsSW5mbwYFBG5hbWUFC2Rlc2NyaXB0aW9uCQCkAwEJAGQCCAUJbGFzdEJsb2NrBmhlaWdodAUQZXhwaXJhdGlvbkhlaWdodAkApAMBBQxxdW9ydW1OdW1iZXICATACATAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd2b3RlRm9yAg1wcm9wb3NhbEluZGV4BmNob2ljZQQFRU1QVFkCBUVNUFRZBAh2b3RlSW5mbwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UHJvcG9zYWxJbmZvAQUNcHJvcG9zYWxJbmRleAUFRU1QVFkEDXZvdGVJbmZvQXJyYXkJALUJAgUIdm90ZUluZm8FA1NFUAQMdXNlclZvdGVJbmZvCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJARVrZXlVc2VyVm90ZU9uUHJvcG9zYWwCBQ1wcm9wb3NhbEluZGV4CQClCAEIBQFpBmNhbGxlcgUFRU1QVFkEBmNoZWNrcwkAzAgCAwkBAiE9AgUIdm90ZUluZm8FBUVNUFRZBgkAAgECDE5vIHN1Y2ggdm90ZQkAzAgCAwkAZgIJAQV2YWx1ZQEJALYJAQkAkQMCBQ12b3RlSW5mb0FycmF5AAMIBQlsYXN0QmxvY2sGaGVpZ2h0BgkBEGJsb2NrSGVpZ2h0RXJyb3IACQDMCAIDCQAAAgUMdXNlclZvdGVJbmZvBQVFTVBUWQYJARBhbHJlYWR5Vm90ZUVycm9yAAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAlnd3hOdW1iZXIJAQVhc0ludAEJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQkBEmd3eENvbnRyYWN0QWRkcmVzcwACIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQV2YWx1ZQEJALYJAQkAkQMCBQ12b3RlSW5mb0FycmF5AAMFA25pbAUDbmlsBAskdDAzMzcxNDQ1OQMFBmNob2ljZQQHYWN0aW9uMQkBC1N0cmluZ0VudHJ5AgkBD2tleVByb3Bvc2FsSW5mbwEFDXByb3Bvc2FsSW5kZXgJARJmb3JtYXRQcm9wb3NhbEluZm8GCQCRAwIFDXZvdGVJbmZvQXJyYXkAAQkAkQMCBQ12b3RlSW5mb0FycmF5AAIJAJEDAgUNdm90ZUluZm9BcnJheQADCQCRAwIFDXZvdGVJbmZvQXJyYXkABAkApAMBCQBkAgkBBXZhbHVlAQkAtgkBCQCRAwIFDXZvdGVJbmZvQXJyYXkABQUJZ3d4TnVtYmVyCQCRAwIFDXZvdGVJbmZvQXJyYXkABgQHYWN0aW9uMgkBC1N0cmluZ0VudHJ5AgkBFWtleVVzZXJWb3RlT25Qcm9wb3NhbAIFDXByb3Bvc2FsSW5kZXgJAKUIAQgFAWkGY2FsbGVyCQEYZm9ybWF0VXNlclZvdGVPblByb3Bvc2FsAgIBMQkApAMBBQlnd3hOdW1iZXIJAJQKAgUHYWN0aW9uMQUHYWN0aW9uMgQHYWN0aW9uMQkBC1N0cmluZ0VudHJ5AgkBD2tleVByb3Bvc2FsSW5mbwEFDXByb3Bvc2FsSW5kZXgJARJmb3JtYXRQcm9wb3NhbEluZm8GCQCRAwIFDXZvdGVJbmZvQXJyYXkAAQkAkQMCBQ12b3RlSW5mb0FycmF5AAIJAJEDAgUNdm90ZUluZm9BcnJheQADCQCRAwIFDXZvdGVJbmZvQXJyYXkABAkAkQMCBQ12b3RlSW5mb0FycmF5AAUJAKQDAQkAZAIJAQV2YWx1ZQEJALYJAQkAkQMCBQ12b3RlSW5mb0FycmF5AAYFCWd3eE51bWJlcgQHYWN0aW9uMgkBC1N0cmluZ0VudHJ5AgkBFWtleVVzZXJWb3RlT25Qcm9wb3NhbAIFDXByb3Bvc2FsSW5kZXgJAKUIAQgFAWkGY2FsbGVyCQEYZm9ybWF0VXNlclZvdGVPblByb3Bvc2FsAgIBMAkApAMBBQlnd3hOdW1iZXIJAJQKAgUHYWN0aW9uMQUHYWN0aW9uMgQHYWN0aW9uMQgFCyR0MDMzNzE0NDU5Al8xBAdhY3Rpb24yCAULJHQwMzM3MTQ0NTkCXzIJAMwIAgUHYWN0aW9uMQkAzAgCBQdhY3Rpb24yBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKZGVsZXRlVm90ZQENcHJvcG9zYWxJbmRleAQFRU1QVFkCBUVNUFRZBAh2b3RlSW5mbwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UHJvcG9zYWxJbmZvAQUNcHJvcG9zYWxJbmRleAUFRU1QVFkEDXZvdGVJbmZvQXJyYXkJALUJAgUIdm90ZUluZm8FA1NFUAQMdXNlclZvdGVJbmZvCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJARVrZXlVc2VyVm90ZU9uUHJvcG9zYWwCBQ1wcm9wb3NhbEluZGV4CQClCAEIBQFpBmNhbGxlcgUFRU1QVFkEEXVzZXJWb3RlSW5mb0FycmF5CQC1CQIFDHVzZXJWb3RlSW5mbwUDU0VQBAZjaGVja3MJAMwIAgMJAQIhPQIFCHZvdGVJbmZvBQVFTVBUWQYJAAIBAgxObyBzdWNoIHZvdGUJAMwIAgMJAGYCCQEFdmFsdWUBCQC2CQEJAJEDAgUNdm90ZUluZm9BcnJheQADCAUJbGFzdEJsb2NrBmhlaWdodAYJARBibG9ja0hlaWdodEVycm9yAAkAzAgCAwkBAiE9AgUMdXNlclZvdGVJbmZvBQVFTVBUWQYJAQtub1ZvdGVFcnJvcgAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQGYWN0aW9uAwkAAAIJAJEDAgURdXNlclZvdGVJbmZvQXJyYXkAAQIBMQkBC1N0cmluZ0VudHJ5AgkBD2tleVByb3Bvc2FsSW5mbwEFDXByb3Bvc2FsSW5kZXgJARJmb3JtYXRQcm9wb3NhbEluZm8GCQCRAwIFDXZvdGVJbmZvQXJyYXkAAQkAkQMCBQ12b3RlSW5mb0FycmF5AAIJAJEDAgUNdm90ZUluZm9BcnJheQADCQCRAwIFDXZvdGVJbmZvQXJyYXkABAkApAMBCQBlAgkBBXZhbHVlAQkAtgkBCQCRAwIFDXZvdGVJbmZvQXJyYXkABQkBBXZhbHVlAQkAtgkBCQCRAwIFEXVzZXJWb3RlSW5mb0FycmF5AAIJAJEDAgUNdm90ZUluZm9BcnJheQAGCQELU3RyaW5nRW50cnkCCQEPa2V5UHJvcG9zYWxJbmZvAQUNcHJvcG9zYWxJbmRleAkBEmZvcm1hdFByb3Bvc2FsSW5mbwYJAJEDAgUNdm90ZUluZm9BcnJheQABCQCRAwIFDXZvdGVJbmZvQXJyYXkAAgkAkQMCBQ12b3RlSW5mb0FycmF5AAMJAJEDAgUNdm90ZUluZm9BcnJheQAECQCRAwIFDXZvdGVJbmZvQXJyYXkABQkApAMBCQBlAgkBBXZhbHVlAQkAtgkBCQCRAwIFDXZvdGVJbmZvQXJyYXkABgkBBXZhbHVlAQkAtgkBCQCRAwIFEXVzZXJWb3RlSW5mb0FycmF5AAIJAMwIAgUGYWN0aW9uCQDMCAIJAQtEZWxldGVFbnRyeQEJARVrZXlVc2VyVm90ZU9uUHJvcG9zYWwCBQ1wcm9wb3NhbEluZGV4CQClCAEIBQFpBmNhbGxlcgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmNoYW5nZVZvdGUCDXByb3Bvc2FsSW5kZXgGY2hvaWNlBAVFTVBUWQIFRU1QVFkECHZvdGVJbmZvCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ9rZXlQcm9wb3NhbEluZm8BBQ1wcm9wb3NhbEluZGV4BQVFTVBUWQQNdm90ZUluZm9BcnJheQkAtQkCBQh2b3RlSW5mbwUDU0VQBAx1c2VyVm90ZUluZm8JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBFWtleVVzZXJWb3RlT25Qcm9wb3NhbAIFDXByb3Bvc2FsSW5kZXgJAKUIAQgFAWkGY2FsbGVyBQVFTVBUWQQRdXNlclZvdGVJbmZvQXJyYXkJALUJAgUMdXNlclZvdGVJbmZvBQNTRVAEBmNoZWNrcwkAzAgCAwkBAiE9AgUIdm90ZUluZm8FBUVNUFRZBgkAAgECDE5vIHN1Y2ggdm90ZQkAzAgCAwkAZgIJAQV2YWx1ZQEJALYJAQkAkQMCBQ12b3RlSW5mb0FycmF5AAMIBQlsYXN0QmxvY2sGaGVpZ2h0BgkBEGJsb2NrSGVpZ2h0RXJyb3IACQDMCAIDCQECIT0CBQx1c2VyVm90ZUluZm8FBUVNUFRZBgkBC25vVm90ZUVycm9yAAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAlnd3hOdW1iZXIJAQVhc0ludAEJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQkBEmd3eENvbnRyYWN0QWRkcmVzcwACIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQV2YWx1ZQEJALYJAQkAkQMCBQ12b3RlSW5mb0FycmF5AAMFA25pbAUDbmlsBAskdDA2Njc5NzAxOAMFBmNob2ljZQQJZm9yTnVtYmVyBQlnd3hOdW1iZXIEDWFnYWluc3ROdW1iZXIAAAQNY2hvaWNlSW50ZWdlcgABCQCVCgMFCWZvck51bWJlcgUNYWdhaW5zdE51bWJlcgUNY2hvaWNlSW50ZWdlcgQJZm9yTnVtYmVyAAAEDWFnYWluc3ROdW1iZXIFCWd3eE51bWJlcgQNY2hvaWNlSW50ZWdlcgAACQCVCgMFCWZvck51bWJlcgUNYWdhaW5zdE51bWJlcgUNY2hvaWNlSW50ZWdlcgQMdXNlclBvd2VyRm9yCAULJHQwNjY3OTcwMTgCXzEEEHVzZXJQb3dlckFnYWluc3QIBQskdDA2Njc5NzAxOAJfMgQJY2hvaWNlSW50CAULJHQwNjY3OTcwMTgCXzMEBmFjdGlvbgMJAAACCQCRAwIFEXVzZXJWb3RlSW5mb0FycmF5AAECATEJAQtTdHJpbmdFbnRyeQIJAQ9rZXlQcm9wb3NhbEluZm8BBQ1wcm9wb3NhbEluZGV4CQESZm9ybWF0UHJvcG9zYWxJbmZvBgkAkQMCBQ12b3RlSW5mb0FycmF5AAEJAJEDAgUNdm90ZUluZm9BcnJheQACCQCRAwIFDXZvdGVJbmZvQXJyYXkAAwkAkQMCBQ12b3RlSW5mb0FycmF5AAQJAKQDAQkAZAIJAGUCCQEFdmFsdWUBCQC2CQEJAJEDAgUNdm90ZUluZm9BcnJheQAFCQEFdmFsdWUBCQC2CQEJAJEDAgURdXNlclZvdGVJbmZvQXJyYXkAAgUMdXNlclBvd2VyRm9yCQCkAwEJAGQCCQEFdmFsdWUBCQC2CQEJAJEDAgUNdm90ZUluZm9BcnJheQAGBRB1c2VyUG93ZXJBZ2FpbnN0CQELU3RyaW5nRW50cnkCCQEPa2V5UHJvcG9zYWxJbmZvAQUNcHJvcG9zYWxJbmRleAkBEmZvcm1hdFByb3Bvc2FsSW5mbwYJAJEDAgUNdm90ZUluZm9BcnJheQABCQCRAwIFDXZvdGVJbmZvQXJyYXkAAgkAkQMCBQ12b3RlSW5mb0FycmF5AAMJAJEDAgUNdm90ZUluZm9BcnJheQAECQCkAwEJAGQCCQEFdmFsdWUBCQC2CQEJAJEDAgUNdm90ZUluZm9BcnJheQAFBQx1c2VyUG93ZXJGb3IJAKQDAQkAZAIJAGUCCQEFdmFsdWUBCQC2CQEJAJEDAgUNdm90ZUluZm9BcnJheQAGCQEFdmFsdWUBCQC2CQEJAJEDAgURdXNlclZvdGVJbmZvQXJyYXkAAgUQdXNlclBvd2VyQWdhaW5zdAkAzAgCBQZhY3Rpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBFWtleVVzZXJWb3RlT25Qcm9wb3NhbAIFDXByb3Bvc2FsSW5kZXgJAKUIAQgFAWkGY2FsbGVyCQEYZm9ybWF0VXNlclZvdGVPblByb3Bvc2FsAgkApAMBBQljaG9pY2VJbnQJAKQDAQUJZ3d4TnVtYmVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERZ2V0UmVzdWx0UkVBRE9OTFkBDXByb3Bvc2FsSW5kZXgEBUVNUFRZAgVFTVBUWQQIdm90ZUluZm8JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBD2tleVByb3Bvc2FsSW5mbwEFDXByb3Bvc2FsSW5kZXgFBUVNUFRZBA12b3RlSW5mb0FycmF5CQC1CQIFCHZvdGVJbmZvBQNTRVAEBmNoZWNrcwkAzAgCAwkBAiE9AgUIdm90ZUluZm8FBUVNUFRZBgkAAgECDE5vIHN1Y2ggdm90ZQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA1wb3NpdGl2ZVZvdGVzCQCRAwIFDXZvdGVJbmZvQXJyYXkABQQNbmVnYXRpdmVWb3RlcwkAkQMCBQ12b3RlSW5mb0FycmF5AAYEDHF1b3J1bU51bWJlcgkAkQMCBQ12b3RlSW5mb0FycmF5AAQJAJQKAgUDbmlsCQDMCAIFDXBvc2l0aXZlVm90ZXMJAMwIAgUNbmVnYXRpdmVWb3RlcwkAzAgCBQxxdW9ydW1OdW1iZXIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleYL/LUg=", "height": 2562780, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 5rJKi4LC3ocdN2NRhHZDUuVc4kFGkf7nk2D23No9FmG5 Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEP = "__"
5+
6+func blockHeightError () = throw("The block's height is too big for this proposal")
7+
8+
9+func alreadyVoteError () = throw("You have already voted")
10+
11+
12+func noVoteError () = throw("You have not already voted")
13+
14+
15+func gwxContractAddress () = makeString(["%s", "gwxContractAddress"], SEP)
16+
17+
18+func keyCurrentIndex () = makeString(["%s", "currentIndex"], SEP)
19+
20+
21+func keyProposalInfo (number) = makeString(["%s%d", "proposalInfo", toString(number)], SEP)
22+
23+
24+func keyUserVoteOnProposal (number,user) = makeString(["%s%d%s", "userVoteOnProposal", toString(number), user], SEP)
25+
26+
27+func keyManagerPublicKey () = "%s__managerPublicKey"
28+
29+
30+func keyManagerVaultAddress () = "%s__managerVaultAddress"
31+
32+
33+func getCurrentIndex () = getIntegerValue(this, keyCurrentIndex())
34+
35+
36+func getManagerAddressOrFail () = addressFromStringValue(getStringValue(keyManagerVaultAddress()))
37+
38+
39+func formatProposalInfo (name,description,end,quorumNumber,positiveVotes,negativeVotes) = makeString(["%d%d%d%d%d%d", name, description, end, quorumNumber, positiveVotes, negativeVotes], SEP)
40+
41+
42+func formatUserVoteOnProposal (vote,gwxNumber) = makeString(["%d%d", vote, gwxNumber], SEP)
43+
44+
45+func asInt (val) = match val {
46+ case valInt: Int =>
47+ valInt
48+ case _ =>
49+ throw("fail to cast into Int")
50+}
51+
52+
53+func managerPublicKeyOrUnit () = {
54+ let managerVaultAddress = getManagerAddressOrFail()
55+ match getString(managerVaultAddress, keyManagerPublicKey()) {
56+ case s: String =>
57+ fromBase58String(s)
58+ case _: Unit =>
59+ unit
60+ case _ =>
61+ throw("Match error")
62+ }
63+ }
64+
65+
66+func isManager (i) = match managerPublicKeyOrUnit() {
67+ case pk: ByteVector =>
68+ (i.callerPublicKey == pk)
69+ case _: Unit =>
70+ (i.caller == this)
71+ case _ =>
72+ throw("Match error")
73+}
74+
75+
76+func mustManager (i) = if (isManager(i))
77+ then true
78+ else throw("permission denied")
79+
80+
81+@Callable(i)
82+func startNewVote (name,description,expirationHeight,quorumNumber) = {
83+ let checks = [mustManager(i)]
84+ if ((checks == checks))
85+ then {
86+ let theIndex = getCurrentIndex()
87+[IntegerEntry(keyCurrentIndex(), (theIndex + 1)), StringEntry(keyProposalInfo(theIndex), formatProposalInfo(name, description, toString((lastBlock.height + expirationHeight)), toString(quorumNumber), "0", "0"))]
88+ }
89+ else throw("Strict value is not equal to itself.")
90+ }
91+
92+
93+
94+@Callable(i)
95+func voteFor (proposalIndex,choice) = {
96+ let EMPTY = "EMPTY"
97+ let voteInfo = valueOrElse(getString(this, keyProposalInfo(proposalIndex)), EMPTY)
98+ let voteInfoArray = split(voteInfo, SEP)
99+ let userVoteInfo = valueOrElse(getString(this, keyUserVoteOnProposal(proposalIndex, toString(i.caller))), EMPTY)
100+ let checks = [if ((voteInfo != EMPTY))
101+ then true
102+ else throw("No such vote"), if ((value(parseInt(voteInfoArray[3])) > lastBlock.height))
103+ then true
104+ else blockHeightError(), if ((userVoteInfo == EMPTY))
105+ then true
106+ else alreadyVoteError()]
107+ if ((checks == checks))
108+ then {
109+ let gwxNumber = asInt(invoke(addressFromStringValue(getStringValue(gwxContractAddress())), "getUserGwxAmountAtHeightREADONLY", [toString(i.caller), value(parseInt(voteInfoArray[3]))], nil))
110+ let $t033714459 = if (choice)
111+ then {
112+ let action1 = StringEntry(keyProposalInfo(proposalIndex), formatProposalInfo(voteInfoArray[1], voteInfoArray[2], voteInfoArray[3], voteInfoArray[4], toString((value(parseInt(voteInfoArray[5])) + gwxNumber)), voteInfoArray[6]))
113+ let action2 = StringEntry(keyUserVoteOnProposal(proposalIndex, toString(i.caller)), formatUserVoteOnProposal("1", toString(gwxNumber)))
114+ $Tuple2(action1, action2)
115+ }
116+ else {
117+ let action1 = StringEntry(keyProposalInfo(proposalIndex), formatProposalInfo(voteInfoArray[1], voteInfoArray[2], voteInfoArray[3], voteInfoArray[4], voteInfoArray[5], toString((value(parseInt(voteInfoArray[6])) + gwxNumber))))
118+ let action2 = StringEntry(keyUserVoteOnProposal(proposalIndex, toString(i.caller)), formatUserVoteOnProposal("0", toString(gwxNumber)))
119+ $Tuple2(action1, action2)
120+ }
121+ let action1 = $t033714459._1
122+ let action2 = $t033714459._2
123+[action1, action2]
124+ }
125+ else throw("Strict value is not equal to itself.")
126+ }
127+
128+
129+
130+@Callable(i)
131+func deleteVote (proposalIndex) = {
132+ let EMPTY = "EMPTY"
133+ let voteInfo = valueOrElse(getString(this, keyProposalInfo(proposalIndex)), EMPTY)
134+ let voteInfoArray = split(voteInfo, SEP)
135+ let userVoteInfo = valueOrElse(getString(this, keyUserVoteOnProposal(proposalIndex, toString(i.caller))), EMPTY)
136+ let userVoteInfoArray = split(userVoteInfo, SEP)
137+ let checks = [if ((voteInfo != EMPTY))
138+ then true
139+ else throw("No such vote"), if ((value(parseInt(voteInfoArray[3])) > lastBlock.height))
140+ then true
141+ else blockHeightError(), if ((userVoteInfo != EMPTY))
142+ then true
143+ else noVoteError()]
144+ if ((checks == checks))
145+ then {
146+ let action = if ((userVoteInfoArray[1] == "1"))
147+ then StringEntry(keyProposalInfo(proposalIndex), formatProposalInfo(voteInfoArray[1], voteInfoArray[2], voteInfoArray[3], voteInfoArray[4], toString((value(parseInt(voteInfoArray[5])) - value(parseInt(userVoteInfoArray[2])))), voteInfoArray[6]))
148+ else StringEntry(keyProposalInfo(proposalIndex), formatProposalInfo(voteInfoArray[1], voteInfoArray[2], voteInfoArray[3], voteInfoArray[4], voteInfoArray[5], toString((value(parseInt(voteInfoArray[6])) - value(parseInt(userVoteInfoArray[2]))))))
149+[action, DeleteEntry(keyUserVoteOnProposal(proposalIndex, toString(i.caller)))]
150+ }
151+ else throw("Strict value is not equal to itself.")
152+ }
153+
154+
155+
156+@Callable(i)
157+func changeVote (proposalIndex,choice) = {
158+ let EMPTY = "EMPTY"
159+ let voteInfo = valueOrElse(getString(this, keyProposalInfo(proposalIndex)), EMPTY)
160+ let voteInfoArray = split(voteInfo, SEP)
161+ let userVoteInfo = valueOrElse(getString(this, keyUserVoteOnProposal(proposalIndex, toString(i.caller))), EMPTY)
162+ let userVoteInfoArray = split(userVoteInfo, SEP)
163+ let checks = [if ((voteInfo != EMPTY))
164+ then true
165+ else throw("No such vote"), if ((value(parseInt(voteInfoArray[3])) > lastBlock.height))
166+ then true
167+ else blockHeightError(), if ((userVoteInfo != EMPTY))
168+ then true
169+ else noVoteError()]
170+ if ((checks == checks))
171+ then {
172+ let gwxNumber = asInt(invoke(addressFromStringValue(getStringValue(gwxContractAddress())), "getUserGwxAmountAtHeightREADONLY", [toString(i.caller), value(parseInt(voteInfoArray[3]))], nil))
173+ let $t066797018 = if (choice)
174+ then {
175+ let forNumber = gwxNumber
176+ let againstNumber = 0
177+ let choiceInteger = 1
178+ $Tuple3(forNumber, againstNumber, choiceInteger)
179+ }
180+ else {
181+ let forNumber = 0
182+ let againstNumber = gwxNumber
183+ let choiceInteger = 0
184+ $Tuple3(forNumber, againstNumber, choiceInteger)
185+ }
186+ let userPowerFor = $t066797018._1
187+ let userPowerAgainst = $t066797018._2
188+ let choiceInt = $t066797018._3
189+ let action = if ((userVoteInfoArray[1] == "1"))
190+ then StringEntry(keyProposalInfo(proposalIndex), formatProposalInfo(voteInfoArray[1], voteInfoArray[2], voteInfoArray[3], voteInfoArray[4], toString(((value(parseInt(voteInfoArray[5])) - value(parseInt(userVoteInfoArray[2]))) + userPowerFor)), toString((value(parseInt(voteInfoArray[6])) + userPowerAgainst))))
191+ else StringEntry(keyProposalInfo(proposalIndex), formatProposalInfo(voteInfoArray[1], voteInfoArray[2], voteInfoArray[3], voteInfoArray[4], toString((value(parseInt(voteInfoArray[5])) + userPowerFor)), toString(((value(parseInt(voteInfoArray[6])) - value(parseInt(userVoteInfoArray[2]))) + userPowerAgainst))))
192+[action, StringEntry(keyUserVoteOnProposal(proposalIndex, toString(i.caller)), formatUserVoteOnProposal(toString(choiceInt), toString(gwxNumber)))]
193+ }
194+ else throw("Strict value is not equal to itself.")
195+ }
196+
197+
198+
199+@Callable(i)
200+func getResultREADONLY (proposalIndex) = {
201+ let EMPTY = "EMPTY"
202+ let voteInfo = valueOrElse(getString(this, keyProposalInfo(proposalIndex)), EMPTY)
203+ let voteInfoArray = split(voteInfo, SEP)
204+ let checks = [if ((voteInfo != EMPTY))
205+ then true
206+ else throw("No such vote")]
207+ if ((checks == checks))
208+ then {
209+ let positiveVotes = voteInfoArray[5]
210+ let negativeVotes = voteInfoArray[6]
211+ let quorumNumber = voteInfoArray[4]
212+ $Tuple2(nil, [positiveVotes, negativeVotes, quorumNumber])
213+ }
214+ else throw("Strict value is not equal to itself.")
215+ }
216+
217+
218+@Verifier(tx)
219+func verify () = {
220+ let targetPublicKey = match managerPublicKeyOrUnit() {
221+ case pk: ByteVector =>
222+ pk
223+ case _: Unit =>
224+ tx.senderPublicKey
225+ case _ =>
226+ throw("Match error")
227+ }
228+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
229+ }
230+

github/deemru/w8io/3ef1775 
28.26 ms