tx · DgqwdNWEhSAKdSZ3PeMRfzqSTUnxohoo6erkBqiLcR4K

3N1BEXuoepNEwqkbeZYKviaLQfvBQV3ibYE:  -0.02000000 Waves

2023.05.25 17:02 [2593604] smart account 3N1BEXuoepNEwqkbeZYKviaLQfvBQV3ibYE > SELF 0.00000000 Waves

{ "type": 13, "id": "DgqwdNWEhSAKdSZ3PeMRfzqSTUnxohoo6erkBqiLcR4K", "fee": 2000000, "feeAssetId": null, "timestamp": 1685023385044, "version": 2, "chainId": 84, "sender": "3N1BEXuoepNEwqkbeZYKviaLQfvBQV3ibYE", "senderPublicKey": "6t3vrhP1jCmG7CeKBmL8hUibtdP3cMXGC2XtPYEPPC5w", "proofs": [ "EewfDm7KPMTn1ssoWgxhtvkm7QeyrQghuCyPjDkdWjXFWjgLQ6objYTx6z4gnsd6mschfNfQfCgKtXRUN9J2CoR" ], "script": "base64:BgIqCAISBQoDCAEIEgMKAQgSBAoCCAQSAwoBCBIDCgEIEgQKAggBEgQKAggBMAAJc2VwYXJhdG9yAgJfXwAFTVVMVDgAgMLXLwEHd3JhcEVycgEDbXNnCQC5CQIJAMwIAgIYdm90aW5nX3ZlcmlmaWVkX3YyLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAQh0aHJvd0VycgEDbXNnCQACAQkBB3dyYXBFcnIBBQNtc2cBBWFzSW50AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgNJbnQEBnZhbEludAUHJG1hdGNoMAUGdmFsSW50CQACAQIbRmFpbGVkIHRvIGNhc3QgaW50byBJbnRlZ2VyARBnZXRJbnRlZ2VyT3JaZXJvAgdhZGRyZXNzA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQdhZGRyZXNzBQNrZXkAAAEQZ2V0SW50ZWdlck9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQdhZGRyZXNzBQNrZXkJAQd3cmFwRXJyAQkArAICBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEQZ2V0U3RyaW5nT3JFbXB0eQIHYWRkcmVzcwNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUHYWRkcmVzcwUDa2V5AgABD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJAQd3cmFwRXJyAQkArAICBQNrZXkCDyBpcyBub3QgZGVmaW5lZAATa2V5Qm9vc3RpbmdDb250cmFjdAkAuQkCCQDMCAICAiVzCQDMCAICEGJvb3N0aW5nQ29udHJhY3QFA25pbAUJc2VwYXJhdG9yABNrZXlFbWlzc2lvbkNvbnRyYWN0CQC5CQIJAMwIAgICJXMJAMwIAgIQZW1pc3Npb25Db250cmFjdAUDbmlsBQlzZXBhcmF0b3IAFmtleUFzc2V0c1N0b3JlQ29udHJhY3QJALkJAgkAzAgCAgIlcwkAzAgCAhNhc3NldHNTdG9yZUNvbnRyYWN0BQNuaWwFCXNlcGFyYXRvcgAQYm9vc3RpbmdDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUTa2V5Qm9vc3RpbmdDb250cmFjdAAQZW1pc3Npb25Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUTa2V5RW1pc3Npb25Db250cmFjdAATYXNzZXRzU3RvcmVDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUWa2V5QXNzZXRzU3RvcmVDb250cmFjdAARa2V5RW1pc3Npb25Db25maWcJALkJAgkAzAgCAgIlcwkAzAgCAgZjb25maWcFA25pbAUJc2VwYXJhdG9yAAx3eEFzc2V0SWRTdHIJAJEDAgkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUQZW1pc3Npb25Db250cmFjdAURa2V5RW1pc3Npb25Db25maWcFCXNlcGFyYXRvcgABAAl3eEFzc2V0SWQJANkEAQUMd3hBc3NldElkU3RyABVrZXlWb3RpbmdUaHJlc2hvbGRBZGQJALkJAgkAzAgCAgQlcyVzCQDMCAICD3ZvdGluZ1RocmVzaG9sZAkAzAgCAgNhZGQFA25pbAUJc2VwYXJhdG9yABhrZXlWb3RpbmdUaHJlc2hvbGRSZW1vdmUJALkJAgkAzAgCAgQlcyVzCQDMCAICD3ZvdGluZ1RocmVzaG9sZAkAzAgCAgZyZW1vdmUFA25pbAUJc2VwYXJhdG9yARJrZXlQZXJpb2RMZW5ndGhBZGQCB2Fzc2V0SWQFaW5kZXgJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIPcGVyaW9kTGVuZ3RoQWRkCQDMCAIFB2Fzc2V0SWQJAMwIAgkApAMBBQVpbmRleAUDbmlsBQlzZXBhcmF0b3IAFWtleVBlcmlvZExlbmd0aFJlbW92ZQkAuQkCCQDMCAICAiVzCQDMCAICEnBlcmlvZExlbmd0aFJlbW92ZQUDbmlsBQlzZXBhcmF0b3IBG2tleUN1cnJlbnRWb3RpbmdIZWlnaHRTdGFydAIHYXNzZXRJZAVpbmRleAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAhhjdXJyZW50Vm90aW5nSGVpZ2h0U3RhcnQJAMwIAgUHYXNzZXRJZAkAzAgCCQCkAwEFBWluZGV4BQNuaWwFCXNlcGFyYXRvcgELa2V5VmVyaWZpZWQBB2Fzc2V0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAICCHZlcmlmaWVkCQDMCAIFB2Fzc2V0SWQFA25pbAUJc2VwYXJhdG9yARlrZXlWZXJpZmljYXRpb25JblByb2dyZXNzAQdhc3NldElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICDHZlcmlmaWNhdGlvbgkAzAgCAgppblByb2dyZXNzCQDMCAIFB2Fzc2V0SWQFA25pbAUJc2VwYXJhdG9yARtrZXlEZXZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MBB2Fzc2V0SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIOZGV2ZXJpZmljYXRpb24JAMwIAgIKaW5Qcm9ncmVzcwkAzAgCBQdhc3NldElkBQNuaWwFCXNlcGFyYXRvcgASa2V5TWF4UGVyaW9kTGVuZ3RoCQC5CQIJAMwIAgICJXMJAMwIAgIPbWF4UGVyaW9kTGVuZ3RoBQNuaWwFCXNlcGFyYXRvcgASa2V5TWluUGVyaW9kTGVuZ3RoCQC5CQIJAMwIAgICJXMJAMwIAgIPbWluUGVyaW9kTGVuZ3RoBQNuaWwFCXNlcGFyYXRvcgEWa2V5Vm90aW5nUmV3YXJkQXNzZXRJZAIHYXNzZXRJZAVpbmRleAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAhN2b3RpbmdSZXdhcmRBc3NldElkCQDMCAIFB2Fzc2V0SWQJAMwIAgkApAMBBQVpbmRleAUDbmlsBQlzZXBhcmF0b3IBFGtleVRvdGFsVm90aW5nUmV3YXJkAgdhc3NldElkBWluZGV4CQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICDHZvdGluZ1Jld2FyZAkAzAgCBQdhc3NldElkCQDMCAIJAKQDAQUFaW5kZXgFA25pbAUJc2VwYXJhdG9yABtrZXlGaW5hbGl6ZUNhbGxSZXdhcmRBbW91bnQJALkJAgkAzAgCAgIlcwkAzAgCAhhmaW5hbGl6ZUNhbGxSZXdhcmRBbW91bnQFA25pbAUJc2VwYXJhdG9yABprZXlNaW5TdWdnZXN0UmVtb3ZlQmFsYW5jZQkAuQkCCQDMCAICAiVzCQDMCAICF21pblN1Z2dlc3RSZW1vdmVCYWxhbmNlBQNuaWwFCXNlcGFyYXRvcgEPa2V5Q3VycmVudEluZGV4AQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgxjdXJyZW50SW5kZXgJAMwIAgUHYXNzZXRJZAUDbmlsBQlzZXBhcmF0b3IBB2tleVZvdGUDB2Fzc2V0SWQFaW5kZXgGY2FsbGVyCQC5CQIJAMwIAgIIJXMlcyVkJXMJAMwIAgIEdm90ZQkAzAgCBQdhc3NldElkCQDMCAIJAKQDAQUFaW5kZXgJAMwIAgkApQgBBQZjYWxsZXIFA25pbAUJc2VwYXJhdG9yAQl2b3RlVmFsdWUCB2luRmF2b3IJZ3d4QW1vdW50CQC5CQIJAMwIAgIEJXMlZAkAzAgCCQClAwEFB2luRmF2b3IJAMwIAgkApAMBBQlnd3hBbW91bnQFA25pbAUJc2VwYXJhdG9yAQ9rZXlWb3RpbmdSZXN1bHQCB2Fzc2V0SWQFaW5kZXgJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIMdm90aW5nUmVzdWx0CQDMCAIFB2Fzc2V0SWQJAMwIAgkApAMBBQVpbmRleAUDbmlsBQlzZXBhcmF0b3IBC3ZvdGluZ1ZhbHVlAglmb3JBbW91bnQNYWdhaW5zdEFtb3VudAkAuQkCCQDMCAICBCVkJWQJAMwIAgkApAMBBQlmb3JBbW91bnQJAMwIAgkApAMBBQ1hZ2FpbnN0QW1vdW50BQNuaWwFCXNlcGFyYXRvcgASZGVmYXVsdFZvdGluZ1ZhbHVlCQC5CQIJAMwIAgIEJWQlZAkAzAgCAgEwCQDMCAICATAFA25pbAUJc2VwYXJhdG9yARBrZXlTdWdnZXN0SXNzdWVyAgdhc3NldElkBWluZGV4CQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICDXN1Z2dlc3RJc3N1ZXIJAMwIAgUHYXNzZXRJZAkAzAgCCQCkAwEFBWluZGV4BQNuaWwFCXNlcGFyYXRvcgEPa2V5Q2xhaW1IaXN0b3J5Awt1c2VyQWRkcmVzcwdhc3NldElkBWluZGV4CQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgIHaGlzdG9yeQkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAIFB2Fzc2V0SWQJAMwIAgkApAMBBQVpbmRleAUDbmlsBQlzZXBhcmF0b3IBEWNsYWltSGlzdG9yeVZhbHVlAQlnd3hBbW91bnQJALkJAgkAzAgCAgQlZCVzCQDMCAIJAKQDAQUJZ3d4QW1vdW50BQNuaWwFCXNlcGFyYXRvcgESa2V5Vm90aW5nRW5kSGVpZ2h0Agdhc3NldElkBWluZGV4CQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICD3ZvdGluZ0VuZEhlaWdodAkAzAgCBQdhc3NldElkCQDMCAIJAKQDAQUFaW5kZXgFA25pbAUJc2VwYXJhdG9yACBrZXlXeEZvclN1Z2dlc3RBZGRBbW91bnRSZXF1aXJlZAkAuQkCCQDMCAICAiVzCQDMCAICHXd4Rm9yU3VnZ2VzdEFkZEFtb3VudFJlcXVpcmVkBQNuaWwFCXNlcGFyYXRvcgAja2V5V3hGb3JTdWdnZXN0UmVtb3ZlQW1vdW50UmVxdWlyZWQJALkJAgkAzAgCAgIlcwkAzAgCAiB3eEZvclN1Z2dlc3RSZW1vdmVBbW91bnRSZXF1aXJlZAUDbmlsBQlzZXBhcmF0b3IAGWtleVd4U3VnZ2VzdEFkZEJ1cm5BbW91bnQJALkJAgkAzAgCAgIlcwkAzAgCAhZ3eFN1Z2dlc3RBZGRCdXJuQW1vdW50BQNuaWwFCXNlcGFyYXRvcgEYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0Agt1c2VyQWRkcmVzcwx0YXJnZXRIZWlnaHQECWd3eEFtb3VudAkA/AcEBRBib29zdGluZ0NvbnRyYWN0AiBnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHRSRUFET05MWQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQx0YXJnZXRIZWlnaHQFA25pbAUDbmlsCQEFYXNJbnQBBQlnd3hBbW91bnQBEXZvdGluZ0V4aXN0Q2hlY2tzAgdhc3NldElkDGN1cnJlbnRJbmRleAQWdmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEZa2V5VmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwEFB2Fzc2V0SWQHBBhkZXZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBG2tleURldmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwEFB2Fzc2V0SWQHBA1zdWdnZXN0SXNzdWVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBEGtleVN1Z2dlc3RJc3N1ZXICBQdhc3NldElkBQxjdXJyZW50SW5kZXgJAQd3cmFwRXJyAQIXdm90aW5nIGlzc3VlciBub3QgZm91bmQEGGN1cnJlbnRWb3RpbmdIZWlnaHRTdGFydAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJARtrZXlDdXJyZW50Vm90aW5nSGVpZ2h0U3RhcnQCBQdhc3NldElkBQxjdXJyZW50SW5kZXgJAQd3cmFwRXJyAQIddm90aW5nIHN0YXJ0IGhlaWdodCBub3QgZm91bmQEEnZvdGluZ1BlcmlvZExlbmdodAMFFnZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQESa2V5UGVyaW9kTGVuZ3RoQWRkAgUHYXNzZXRJZAUMY3VycmVudEluZGV4CQEHd3JhcEVycgECHnZvdGluZyBwZXJpb2QgbGVuZ3RoIG5vdCBmb3VuZAkBBXZhbHVlAQkAnwgBBRVrZXlQZXJpb2RMZW5ndGhSZW1vdmUEBmNoZWNrcwkAzAgCAwMFFnZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MGBRhkZXZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MGCQEIdGhyb3dFcnIBAhVubyB2b3RpbmcgaW4gcHJvZ3Jlc3MJAMwIAgMJAGYCCQBkAgUYY3VycmVudFZvdGluZ0hlaWdodFN0YXJ0BRJ2b3RpbmdQZXJpb2RMZW5naHQFBmhlaWdodAYJAQh0aHJvd0VycgECDnZvdGluZyBleHBpcmVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAJcKBQUWdmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwUYZGV2ZXJpZmljYXRpb25JblByb2dyZXNzBRhjdXJyZW50Vm90aW5nSGVpZ2h0U3RhcnQFEnZvdGluZ1BlcmlvZExlbmdodAUNc3VnZ2VzdElzc3VlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEPY2FsY3VsYXRlUmV3YXJkAwV2b3Rlcgdhc3NldElkBWluZGV4BAd2b3RlS2V5CQEHa2V5Vm90ZQMFB2Fzc2V0SWQFBWluZGV4BQV2b3RlcgQIbGFzdFZvdGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBQd2b3RlS2V5CQEHd3JhcEVycgECEnlvdSBoYXZlIG5vdCB2b3RlZAQNbGFzdFZvdGVQYXJ0cwkAtQkCBQhsYXN0Vm90ZQUJc2VwYXJhdG9yBAdpbkZhdm9yCQCRAwIFDWxhc3RWb3RlUGFydHMAAQQMcmV3YXJkQW1vdW50AwkAAAIFB2luRmF2b3ICBHRydWUECWd3eEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWxhc3RWb3RlUGFydHMAAgQPbGFzdFZvdGluZ1ZhbHVlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBD2tleVZvdGluZ1Jlc3VsdAIFB2Fzc2V0SWQFBWluZGV4CQEHd3JhcEVycgECFXZvdGluZyBkb2VzIG5vdCBleGlzdAQUbGFzdFZvdGluZ1ZhbHVlUGFydHMJALUJAgUPbGFzdFZvdGluZ1ZhbHVlBQlzZXBhcmF0b3IEDXRvdGFsVm90ZXNGb3IJAQ1wYXJzZUludFZhbHVlAQkAkQMCBRRsYXN0Vm90aW5nVmFsdWVQYXJ0cwABBBVwYXJ0T2ZUaGVUb3RhbFZvdGVzWDgJAGsDBQlnd3hBbW91bnQFBU1VTFQ4BQ10b3RhbFZvdGVzRm9yBBF0b3RhbFZvdGluZ1Jld2FyZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VG90YWxWb3RpbmdSZXdhcmQCBQdhc3NldElkBQVpbmRleAAABAxyZXdhcmRBbW91bnQJAG4EBRVwYXJ0T2ZUaGVUb3RhbFZvdGVzWDgFEXRvdGFsVm90aW5nUmV3YXJkBQVNVUxUOAUFRkxPT1IFDHJld2FyZEFtb3VudAAABQxyZXdhcmRBbW91bnQHAWkBCnN1Z2dlc3RBZGQDB2Fzc2V0SWQMcGVyaW9kTGVuZ3RoCmFzc2V0SW1hZ2UEBGluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFB2Fzc2V0SWQCEEludmFsaWQgYXNzZXQgSUQDCQAAAgUEaW5mbwUEaW5mbwQPY3VycmVudEluZGV4S2V5CQEPa2V5Q3VycmVudEluZGV4AQUHYXNzZXRJZAQMY3VycmVudEluZGV4CQCfCAEFD2N1cnJlbnRJbmRleEtleQQIbmV3SW5kZXgDCQEJaXNEZWZpbmVkAQUMY3VycmVudEluZGV4CQBkAgkBBXZhbHVlAQUMY3VycmVudEluZGV4AAEAAAQJd3hQYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEEHd4UGF5bWVudEFzc2V0SWQJAQV2YWx1ZQEIBQl3eFBheW1lbnQHYXNzZXRJZAQPd3hQYXltZW50QW1vdW50CQEFdmFsdWUBCAUJd3hQYXltZW50BmFtb3VudAQTdm90aW5nUmV3YXJkQWN0aW9ucwMJAGYCCQCQAwEIBQFpCHBheW1lbnRzAAEEE3ZvdGluZ1Jld2FyZFBheW1lbnQJAJEDAggFAWkIcGF5bWVudHMAAQQadm90aW5nUmV3YXJkUGF5bWVudEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFE3ZvdGluZ1Jld2FyZFBheW1lbnQHYXNzZXRJZAQZdm90aW5nUmV3YXJkUGF5bWVudEFtb3VudAkBBXZhbHVlAQgFE3ZvdGluZ1Jld2FyZFBheW1lbnQGYW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlWb3RpbmdSZXdhcmRBc3NldElkAgUHYXNzZXRJZAUIbmV3SW5kZXgFGnZvdGluZ1Jld2FyZFBheW1lbnRBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VG90YWxWb3RpbmdSZXdhcmQCBQdhc3NldElkBQhuZXdJbmRleAUZdm90aW5nUmV3YXJkUGF5bWVudEFtb3VudAUDbmlsBQNuaWwED21pblBlcmlvZExlbmd0aAkBEUBleHRyTmF0aXZlKDEwNTUpAQUSa2V5TWluUGVyaW9kTGVuZ3RoBA9tYXhQZXJpb2RMZW5ndGgJARFAZXh0ck5hdGl2ZSgxMDU1KQEFEmtleU1heFBlcmlvZExlbmd0aAQGY2hlY2tzCQDMCAIDAwkAZwIFDHBlcmlvZExlbmd0aAUPbWluUGVyaW9kTGVuZ3RoCQBnAgUPbWF4UGVyaW9kTGVuZ3RoBQxwZXJpb2RMZW5ndGgHBgkBCHRocm93RXJyAQIUaW52YWxpZCBwZXJpb2RMZW5ndGgJAMwIAgMJAAACCQCgCAEJAQtrZXlWZXJpZmllZAEFB2Fzc2V0SWQFBHVuaXQGCQEIdGhyb3dFcnIBAhBhbHJlYWR5IHZlcmlmaWVkCQDMCAIDCQAAAgkAoAgBCQEZa2V5VmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwEFB2Fzc2V0SWQFBHVuaXQGCQEIdGhyb3dFcnIBAhNhbHJlYWR5IGluIHByb2dyZXNzCQDMCAIDCQAAAgUPd3hQYXltZW50QW1vdW50CQEFdmFsdWUBCQCfCAEFIGtleVd4Rm9yU3VnZ2VzdEFkZEFtb3VudFJlcXVpcmVkBgkBCHRocm93RXJyAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBBxhc3NldHNTdG9yZUNyZWF0ZU9yVXBkYXRlSW52CQD8BwQFE2Fzc2V0c1N0b3JlQ29udHJhY3QCDmNyZWF0ZU9yVXBkYXRlCQDMCAIFB2Fzc2V0SWQJAMwIAgUKYXNzZXRJbWFnZQkAzAgCBwUDbmlsBQNuaWwDCQAAAgUcYXNzZXRzU3RvcmVDcmVhdGVPclVwZGF0ZUludgUcYXNzZXRzU3RvcmVDcmVhdGVPclVwZGF0ZUludgQPdm90aW5nRW5kSGVpZ2h0CQBkAgUGaGVpZ2h0BQxwZXJpb2RMZW5ndGgJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUPY3VycmVudEluZGV4S2V5BQhuZXdJbmRleAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBGWtleVZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MBBQdhc3NldElkBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBG2tleUN1cnJlbnRWb3RpbmdIZWlnaHRTdGFydAIFB2Fzc2V0SWQFCG5ld0luZGV4BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlQZXJpb2RMZW5ndGhBZGQCBQdhc3NldElkBQhuZXdJbmRleAUMcGVyaW9kTGVuZ3RoCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlTdWdnZXN0SXNzdWVyAgUHYXNzZXRJZAUIbmV3SW5kZXgJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5Vm90aW5nRW5kSGVpZ2h0AgUHYXNzZXRJZAUIbmV3SW5kZXgFD3ZvdGluZ0VuZEhlaWdodAkAzAgCCQEEQnVybgIFEHd4UGF5bWVudEFzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDU1KQEFGWtleVd4U3VnZ2VzdEFkZEJ1cm5BbW91bnQFA25pbAUTdm90aW5nUmV3YXJkQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1zdWdnZXN0UmVtb3ZlAQdhc3NldElkBA5nd3hBbW91bnRBdE5vdwkBGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAIJAKUIAQgFAWkGY2FsbGVyBQZoZWlnaHQEF21pblN1Z2dlc3RSZW1vdmVCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1NSkBBRprZXlNaW5TdWdnZXN0UmVtb3ZlQmFsYW5jZQQKaXNWZXJpZmllZAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQELa2V5VmVyaWZpZWQBBQdhc3NldElkBwQGY2hlY2tzCQDMCAIDBQppc1ZlcmlmaWVkBgkBCHRocm93RXJyAQkAuQkCCQDMCAIFB2Fzc2V0SWQJAMwIAgIMbm90IHZlcmlmaWVkBQNuaWwCASAJAMwIAgMJAGcCBQ5nd3hBbW91bnRBdE5vdwUXbWluU3VnZ2VzdFJlbW92ZUJhbGFuY2UGCQEIdGhyb3dFcnIBAhBub3QgZW5vdWdoIGdXWGVzBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MED2N1cnJlbnRJbmRleEtleQkBD2tleUN1cnJlbnRJbmRleAEFB2Fzc2V0SWQEDGN1cnJlbnRJbmRleAkAnwgBBQ9jdXJyZW50SW5kZXhLZXkECG5ld0luZGV4AwkBCWlzRGVmaW5lZAEFDGN1cnJlbnRJbmRleAkAZAIJAQV2YWx1ZQEFDGN1cnJlbnRJbmRleAABAAAEDHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFFWtleVBlcmlvZExlbmd0aFJlbW92ZQkBB3dyYXBFcnIBAhpwZXJpb2RMZW5ndGhSZW1vdmUgbm90IHNldAQPdm90aW5nRW5kSGVpZ2h0CQBkAgUGaGVpZ2h0BQxwZXJpb2RMZW5ndGgJAMwIAgkBDEludGVnZXJFbnRyeQIFD2N1cnJlbnRJbmRleEtleQUIbmV3SW5kZXgJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARtrZXlEZXZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MBBQdhc3NldElkBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBG2tleUN1cnJlbnRWb3RpbmdIZWlnaHRTdGFydAIFB2Fzc2V0SWQFCG5ld0luZGV4BQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleVN1Z2dlc3RJc3N1ZXICBQdhc3NldElkBQhuZXdJbmRleAkApQgBCAUBaQZjYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlWb3RpbmdFbmRIZWlnaHQCBQdhc3NldElkBQhuZXdJbmRleAUPdm90aW5nRW5kSGVpZ2h0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEdm90ZQIHYXNzZXRJZAdpbkZhdm9yBA9jdXJyZW50SW5kZXhLZXkJAQ9rZXlDdXJyZW50SW5kZXgBBQdhc3NldElkBAxjdXJyZW50SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ9jdXJyZW50SW5kZXhLZXkJAQd3cmFwRXJyAQIVdm90aW5nIGRvZXMgbm90IGV4aXN0BAp2b3RpbmdJbmZvCQERdm90aW5nRXhpc3RDaGVja3MCBQdhc3NldElkBQxjdXJyZW50SW5kZXgDCQAAAgUKdm90aW5nSW5mbwUKdm90aW5nSW5mbwQYY3VycmVudFZvdGluZ0hlaWdodFN0YXJ0CAUKdm90aW5nSW5mbwJfMwQSdm90aW5nUGVyaW9kTGVuZ2h0CAUKdm90aW5nSW5mbwJfNAQOZ3d4QW1vdW50QXRFbmQJARhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQCCQClCAEIBQFpBmNhbGxlcgkAZAIFGGN1cnJlbnRWb3RpbmdIZWlnaHRTdGFydAUSdm90aW5nUGVyaW9kTGVuZ2h0BAd2b3RlS2V5CQEHa2V5Vm90ZQMFB2Fzc2V0SWQFDGN1cnJlbnRJbmRleAgFAWkGY2FsbGVyBA92b3RpbmdSZXN1bHRLZXkJAQ9rZXlWb3RpbmdSZXN1bHQCBQdhc3NldElkBQxjdXJyZW50SW5kZXgEBmNoZWNrcwkAzAgCAwkAAAIJAKIIAQUHdm90ZUtleQUEdW5pdAYJAQh0aHJvd0VycgECFllvdSBoYXZlIGFscmVhZHkgdm90ZWQJAMwIAgMJAGYCBQ5nd3hBbW91bnRBdEVuZAAABgkAAgECKFlvdSdsbCBub3QgaGF2ZSBnV1ggYXQgdGhlIGVuZCBvZiB2b3RpbmcFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQPbGFzdFZvdGluZ1ZhbHVlCQELdmFsdWVPckVsc2UCCQCiCAEFD3ZvdGluZ1Jlc3VsdEtleQUSZGVmYXVsdFZvdGluZ1ZhbHVlBBRsYXN0Vm90aW5nVmFsdWVQYXJ0cwkAtQkCBQ9sYXN0Vm90aW5nVmFsdWUFCXNlcGFyYXRvcgQObmV3Vm90aW5nVmFsdWUDBQdpbkZhdm9yCQELdm90aW5nVmFsdWUCCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFFGxhc3RWb3RpbmdWYWx1ZVBhcnRzAAEFDmd3eEFtb3VudEF0RW5kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUUbGFzdFZvdGluZ1ZhbHVlUGFydHMAAgkBC3ZvdGluZ1ZhbHVlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFFGxhc3RWb3RpbmdWYWx1ZVBhcnRzAAEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUUbGFzdFZvdGluZ1ZhbHVlUGFydHMAAgUOZ3d4QW1vdW50QXRFbmQJAMwIAgkBC1N0cmluZ0VudHJ5AgUHdm90ZUtleQkBCXZvdGVWYWx1ZQIFB2luRmF2b3IFDmd3eEFtb3VudEF0RW5kCQDMCAIJAQtTdHJpbmdFbnRyeQIFD3ZvdGluZ1Jlc3VsdEtleQUObmV3Vm90aW5nVmFsdWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjYW5jZWxWb3RlAQdhc3NldElkBA9jdXJyZW50SW5kZXhLZXkJAQ9rZXlDdXJyZW50SW5kZXgBBQdhc3NldElkBAxjdXJyZW50SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ9jdXJyZW50SW5kZXhLZXkJAQd3cmFwRXJyAQIVdm90aW5nIGRvZXMgbm90IGV4aXN0BAd2b3RlS2V5CQEHa2V5Vm90ZQMFB2Fzc2V0SWQFDGN1cnJlbnRJbmRleAgFAWkGY2FsbGVyBA92b3RpbmdSZXN1bHRLZXkJAQ9rZXlWb3RpbmdSZXN1bHQCBQdhc3NldElkBQxjdXJyZW50SW5kZXgECGxhc3RWb3RlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUHdm90ZUtleQkBB3dyYXBFcnIBAhJ5b3UgaGF2ZSBub3Qgdm90ZWQEDWxhc3RWb3RlUGFydHMJALUJAgUIbGFzdFZvdGUFCXNlcGFyYXRvcgQHaW5GYXZvcgkAkQMCBQ1sYXN0Vm90ZVBhcnRzAAEECWd3eEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWxhc3RWb3RlUGFydHMAAgQKdm90aW5nSW5mbwkBEXZvdGluZ0V4aXN0Q2hlY2tzAgUHYXNzZXRJZAUMY3VycmVudEluZGV4AwkAAAIFCnZvdGluZ0luZm8FCnZvdGluZ0luZm8EBmNoZWNrcwkAzAgCAwMJAAACBQdpbkZhdm9yAgR0cnVlBgkAAAIFB2luRmF2b3ICBWZhbHNlBgkBCHRocm93RXJyAQIMaW52YWxpZCB2b3RlBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MED2xhc3RWb3RpbmdWYWx1ZQkBC3ZhbHVlT3JFbHNlAgkAoggBBQ92b3RpbmdSZXN1bHRLZXkFEmRlZmF1bHRWb3RpbmdWYWx1ZQQUbGFzdFZvdGluZ1ZhbHVlUGFydHMJALUJAgUPbGFzdFZvdGluZ1ZhbHVlBQlzZXBhcmF0b3IEFG5ld1ZvdGluZ1Jlc3VsdFZhbHVlAwkAAAIFB2luRmF2b3ICBHRydWUJAQt2b3RpbmdWYWx1ZQIJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUUbGFzdFZvdGluZ1ZhbHVlUGFydHMAAQUJZ3d4QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUUbGFzdFZvdGluZ1ZhbHVlUGFydHMAAgkBC3ZvdGluZ1ZhbHVlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFFGxhc3RWb3RpbmdWYWx1ZVBhcnRzAAEJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUUbGFzdFZvdGluZ1ZhbHVlUGFydHMAAgUJZ3d4QW1vdW50CQDMCAIJAQtEZWxldGVFbnRyeQEFB3ZvdGVLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPdm90aW5nUmVzdWx0S2V5BRRuZXdWb3RpbmdSZXN1bHRWYWx1ZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZpbmFsaXplAQdhc3NldElkBBZ2ZXJpZmljYXRpb25JblByb2dyZXNzCQELdmFsdWVPckVsc2UCCQCgCAEJARlrZXlWZXJpZmljYXRpb25JblByb2dyZXNzAQUHYXNzZXRJZAcEGGRldmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEba2V5RGV2ZXJpZmljYXRpb25JblByb2dyZXNzAQUHYXNzZXRJZAcED2N1cnJlbnRJbmRleEtleQkBD2tleUN1cnJlbnRJbmRleAEFB2Fzc2V0SWQEDGN1cnJlbnRJbmRleAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9jdXJyZW50SW5kZXhLZXkAAAQSdm90aW5nVGhyZXNob2xkQWRkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUVa2V5Vm90aW5nVGhyZXNob2xkQWRkCQEHd3JhcEVycgECGnZvdGluZ1RocmVzaG9sZEFkZCBub3Qgc2V0BBV2b3RpbmdUaHJlc2hvbGRSZW1vdmUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRhrZXlWb3RpbmdUaHJlc2hvbGRSZW1vdmUJAQd3cmFwRXJyAQIddm90aW5nVGhyZXNob2xkUmVtb3ZlIG5vdCBzZXQEDSR0MDEzNjkzMTQxMzIDBRZ2ZXJpZmljYXRpb25JblByb2dyZXNzCQCVCgMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGWtleVZlcmlmaWNhdGlvbkluUHJvZ3Jlc3MBBQdhc3NldElkCQDMCAIJAQxCb29sZWFuRW50cnkCCQELa2V5VmVyaWZpZWQBBQdhc3NldElkBgUDbmlsBgUSdm90aW5nVGhyZXNob2xkQWRkCQCVCgMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBG2tleURldmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwEFB2Fzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBC2tleVZlcmlmaWVkAQUHYXNzZXRJZAUDbmlsBgUVdm90aW5nVGhyZXNob2xkUmVtb3ZlBBVmaW5hbGl6ZVZvdGluZ0FjdGlvbnMIBQ0kdDAxMzY5MzE0MTMyAl8xBAh2ZXJpZmllZAgFDSR0MDEzNjkzMTQxMzICXzIECXRocmVzaG9sZAgFDSR0MDEzNjkzMTQxMzICXzMED2xhc3RWb3RpbmdWYWx1ZQkBC3ZhbHVlT3JFbHNlAgkAoggBCQEPa2V5Vm90aW5nUmVzdWx0AgUHYXNzZXRJZAUMY3VycmVudEluZGV4BRJkZWZhdWx0Vm90aW5nVmFsdWUEFGxhc3RWb3RpbmdWYWx1ZVBhcnRzCQC1CQIFD2xhc3RWb3RpbmdWYWx1ZQUJc2VwYXJhdG9yBAh2b3Rlc0ZvcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFFGxhc3RWb3RpbmdWYWx1ZVBhcnRzAAEEDHZvdGVzQWdhaW5zdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFFGxhc3RWb3RpbmdWYWx1ZVBhcnRzAAIECnZvdGVzVG90YWwJAGQCBQh2b3Rlc0ZvcgUMdm90ZXNBZ2FpbnN0BA92b3RpbmdFbmRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQESa2V5Vm90aW5nRW5kSGVpZ2h0AgUHYXNzZXRJZAUMY3VycmVudEluZGV4CQEHd3JhcEVycgECG3ZvdGluZyBlbmQgaGVpZ2h0IG5vdCBmb3VuZAQGY2hlY2tzCQDMCAIDAwUWdmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwYFGGRldmVyaWZpY2F0aW9uSW5Qcm9ncmVzcwYJAQh0aHJvd0VycgECE25vdGhpbmcgdG8gZmluYWxpemUJAMwIAgMJAGcCBQZoZWlnaHQFD3ZvdGluZ0VuZEhlaWdodAYJAQh0aHJvd0VycgECE3ZvdGluZyBub3QgZmluaXNoZWQJAMwIAgMJAGcCBQp2b3Rlc1RvdGFsBQl0aHJlc2hvbGQGCQEIdGhyb3dFcnIBAhBub3QgZW5vdWdoIHZvdGVzBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEGGZpbmFsaXplQ2FsbFJld2FyZEFjdGlvbgMJAGYCBQx2b3Rlc0FnYWluc3QFCHZvdGVzRm9yBBFzZXRWZXJpZmllZEludm9rZQkA/AcEBRNhc3NldHNTdG9yZUNvbnRyYWN0AgtzZXRWZXJpZmllZAkAzAgCBQdhc3NldElkCQDMCAIFCHZlcmlmaWVkBQNuaWwFA25pbAMJAAACBRFzZXRWZXJpZmllZEludm9rZQURc2V0VmVyaWZpZWRJbnZva2UEGGZpbmFsaXplQ2FsbFJld2FyZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRtrZXlGaW5hbGl6ZUNhbGxSZXdhcmRBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFGGZpbmFsaXplQ2FsbFJld2FyZEFtb3VudAUJd3hBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAzggCBRVmaW5hbGl6ZVZvdGluZ0FjdGlvbnMFGGZpbmFsaXplQ2FsbFJld2FyZEFjdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1jbGFpbVJFQURPTkxZAgdhc3NldElkBWluZGV4BA1jYWxsZXJBZGRyZXNzCAUBaQZjYWxsZXIEFnZvdGluZ1Jld2FyZEFzc2V0SWRTdHIJAKIIAQkBFmtleVZvdGluZ1Jld2FyZEFzc2V0SWQCBQdhc3NldElkBQVpbmRleAQMcmV3YXJkQW1vdW50AwkBCWlzRGVmaW5lZAEFFnZvdGluZ1Jld2FyZEFzc2V0SWRTdHIJAQ9jYWxjdWxhdGVSZXdhcmQDBQ1jYWxsZXJBZGRyZXNzBQdhc3NldElkBQVpbmRleAAACQCUCgIFA25pbAUMcmV3YXJkQW1vdW50AWkBBWNsYWltAgdhc3NldElkBWluZGV4BA1jYWxsZXJBZGRyZXNzCAUBaQZjYWxsZXIED2NsYWltSGlzdG9yeUtleQkBD2tleUNsYWltSGlzdG9yeQMFDWNhbGxlckFkZHJlc3MFB2Fzc2V0SWQFBWluZGV4BAxjbGFpbUhpc3RvcnkJAKIIAQUPY2xhaW1IaXN0b3J5S2V5BAZjaGVja3MJAMwIAgMJAAACBQxjbGFpbUhpc3RvcnkFBHVuaXQGCQEIdGhyb3dFcnIBAg9hbHJlYWR5IGNsYWltZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQMcmV3YXJkQW1vdW50AwkAZgIJAQ9jYWxjdWxhdGVSZXdhcmQDBQ1jYWxsZXJBZGRyZXNzBQdhc3NldElkBQVpbmRleAAACQEPY2FsY3VsYXRlUmV3YXJkAwUNY2FsbGVyQWRkcmVzcwUHYXNzZXRJZAUFaW5kZXgJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0EFnZvdGluZ1Jld2FyZEFzc2V0SWRTdHIJAKIIAQkBFmtleVZvdGluZ1Jld2FyZEFzc2V0SWQCBQdhc3NldElkBQVpbmRleAQMcmV3YXJkQWN0aW9uAwkBCWlzRGVmaW5lZAEFFnZvdGluZ1Jld2FyZEFzc2V0SWRTdHIEE3ZvdGluZ1Jld2FyZEFzc2V0SWQJANkEAQkBBXZhbHVlAQUWdm90aW5nUmV3YXJkQXNzZXRJZFN0cgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ1jYWxsZXJBZGRyZXNzBQxyZXdhcmRBbW91bnQFE3ZvdGluZ1Jld2FyZEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPY2xhaW1IaXN0b3J5S2V5CQERY2xhaW1IaXN0b3J5VmFsdWUBBQxyZXdhcmRBbW91bnQFA25pbAkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQUMcmV3YXJkQWN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuANO73aQ=", "height": 2593604, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: Bc95Do6JTLtq5bwhfkTyPGVPfHCKgJefqJ1gTkckU3wr Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let separator = "__"
5+
6+let MULT8 = 100000000
7+
8+func wrapErr (msg) = makeString(["voting_verified_v2.ride:", msg], " ")
9+
10+
11+func throwErr (msg) = throw(wrapErr(msg))
12+
13+
14+func asInt (val) = match val {
15+ case valInt: Int =>
16+ valInt
17+ case _ =>
18+ throw("Failed to cast into Integer")
19+}
20+
21+
22+func getIntegerOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
23+
24+
25+func getIntegerOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), wrapErr((key + " is not defined")))
26+
27+
28+func getStringOrEmpty (address,key) = valueOrElse(getString(address, key), "")
29+
30+
31+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), wrapErr((key + " is not defined")))
32+
33+
34+let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
35+
36+let keyEmissionContract = makeString(["%s", "emissionContract"], separator)
37+
38+let keyAssetsStoreContract = makeString(["%s", "assetsStoreContract"], separator)
39+
40+let boostingContract = addressFromStringValue(getStringValue(keyBoostingContract))
41+
42+let emissionContract = addressFromStringValue(getStringValue(keyEmissionContract))
43+
44+let assetsStoreContract = addressFromStringValue(getStringValue(keyAssetsStoreContract))
45+
46+let keyEmissionConfig = makeString(["%s", "config"], separator)
47+
48+let wxAssetIdStr = split(getStringOrFail(emissionContract, keyEmissionConfig), separator)[1]
49+
50+let wxAssetId = fromBase58String(wxAssetIdStr)
51+
52+let keyVotingThresholdAdd = makeString(["%s%s", "votingThreshold", "add"], separator)
53+
54+let keyVotingThresholdRemove = makeString(["%s%s", "votingThreshold", "remove"], separator)
55+
56+func keyPeriodLengthAdd (assetId,index) = makeString(["%s%s%d", "periodLengthAdd", assetId, toString(index)], separator)
57+
58+
59+let keyPeriodLengthRemove = makeString(["%s", "periodLengthRemove"], separator)
60+
61+func keyCurrentVotingHeightStart (assetId,index) = makeString(["%s%s%d", "currentVotingHeightStart", assetId, toString(index)], separator)
62+
63+
64+func keyVerified (assetId) = makeString(["%s%s", "verified", assetId], separator)
65+
66+
67+func keyVerificationInProgress (assetId) = makeString(["%s%s%s", "verification", "inProgress", assetId], separator)
68+
69+
70+func keyDeverificationInProgress (assetId) = makeString(["%s%s%s", "deverification", "inProgress", assetId], separator)
71+
72+
73+let keyMaxPeriodLength = makeString(["%s", "maxPeriodLength"], separator)
74+
75+let keyMinPeriodLength = makeString(["%s", "minPeriodLength"], separator)
76+
77+func keyVotingRewardAssetId (assetId,index) = makeString(["%s%s%d", "votingRewardAssetId", assetId, toString(index)], separator)
78+
79+
80+func keyTotalVotingReward (assetId,index) = makeString(["%s%s%d", "votingReward", assetId, toString(index)], separator)
81+
82+
83+let keyFinalizeCallRewardAmount = makeString(["%s", "finalizeCallRewardAmount"], separator)
84+
85+let keyMinSuggestRemoveBalance = makeString(["%s", "minSuggestRemoveBalance"], separator)
86+
87+func keyCurrentIndex (assetId) = makeString(["%s%s", "currentIndex", assetId], separator)
88+
89+
90+func keyVote (assetId,index,caller) = makeString(["%s%s%d%s", "vote", assetId, toString(index), toString(caller)], separator)
91+
92+
93+func voteValue (inFavor,gwxAmount) = makeString(["%s%d", toString(inFavor), toString(gwxAmount)], separator)
94+
95+
96+func keyVotingResult (assetId,index) = makeString(["%s%s%d", "votingResult", assetId, toString(index)], separator)
97+
98+
99+func votingValue (forAmount,againstAmount) = makeString(["%d%d", toString(forAmount), toString(againstAmount)], separator)
100+
101+
102+let defaultVotingValue = makeString(["%d%d", "0", "0"], separator)
103+
104+func keySuggestIssuer (assetId,index) = makeString(["%s%s%d", "suggestIssuer", assetId, toString(index)], separator)
105+
106+
107+func keyClaimHistory (userAddress,assetId,index) = makeString(["%s%s%s%d", "history", toString(userAddress), assetId, toString(index)], separator)
108+
109+
110+func claimHistoryValue (gwxAmount) = makeString(["%d%s", toString(gwxAmount)], separator)
111+
112+
113+func keyVotingEndHeight (assetId,index) = makeString(["%s%s%d", "votingEndHeight", assetId, toString(index)], separator)
114+
115+
116+let keyWxForSuggestAddAmountRequired = makeString(["%s", "wxForSuggestAddAmountRequired"], separator)
117+
118+let keyWxForSuggestRemoveAmountRequired = makeString(["%s", "wxForSuggestRemoveAmountRequired"], separator)
119+
120+let keyWxSuggestAddBurnAmount = makeString(["%s", "wxSuggestAddBurnAmount"], separator)
121+
122+func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
123+ let gwxAmount = invoke(boostingContract, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
124+ asInt(gwxAmount)
125+ }
126+
127+
128+func votingExistChecks (assetId,currentIndex) = {
129+ let verificationInProgress = valueOrElse(getBoolean(keyVerificationInProgress(assetId)), false)
130+ let deverificationInProgress = valueOrElse(getBoolean(keyDeverificationInProgress(assetId)), false)
131+ let suggestIssuer = valueOrErrorMessage(getString(keySuggestIssuer(assetId, currentIndex)), wrapErr("voting issuer not found"))
132+ let currentVotingHeightStart = valueOrErrorMessage(getInteger(keyCurrentVotingHeightStart(assetId, currentIndex)), wrapErr("voting start height not found"))
133+ let votingPeriodLenght = if (verificationInProgress)
134+ then valueOrErrorMessage(getInteger(keyPeriodLengthAdd(assetId, currentIndex)), wrapErr("voting period length not found"))
135+ else value(getInteger(keyPeriodLengthRemove))
136+ let checks = [if (if (verificationInProgress)
137+ then true
138+ else deverificationInProgress)
139+ then true
140+ else throwErr("no voting in progress"), if (((currentVotingHeightStart + votingPeriodLenght) > height))
141+ then true
142+ else throwErr("voting expired")]
143+ if ((checks == checks))
144+ then $Tuple5(verificationInProgress, deverificationInProgress, currentVotingHeightStart, votingPeriodLenght, suggestIssuer)
145+ else throw("Strict value is not equal to itself.")
146+ }
147+
148+
149+func calculateReward (voter,assetId,index) = {
150+ let voteKey = keyVote(assetId, index, voter)
151+ let lastVote = valueOrErrorMessage(getString(voteKey), wrapErr("you have not voted"))
152+ let lastVoteParts = split(lastVote, separator)
153+ let inFavor = lastVoteParts[1]
154+ let rewardAmount = if ((inFavor == "true"))
155+ then {
156+ let gwxAmount = parseIntValue(lastVoteParts[2])
157+ let lastVotingValue = valueOrErrorMessage(getString(keyVotingResult(assetId, index)), wrapErr("voting does not exist"))
158+ let lastVotingValueParts = split(lastVotingValue, separator)
159+ let totalVotesFor = parseIntValue(lastVotingValueParts[1])
160+ let partOfTheTotalVotesX8 = fraction(gwxAmount, MULT8, totalVotesFor)
161+ let totalVotingReward = valueOrElse(getInteger(keyTotalVotingReward(assetId, index)), 0)
162+ let rewardAmount = fraction(partOfTheTotalVotesX8, totalVotingReward, MULT8, FLOOR)
163+ rewardAmount
164+ }
165+ else 0
166+ rewardAmount
167+ }
168+
169+
170+@Callable(i)
171+func suggestAdd (assetId,periodLength,assetImage) = {
172+ let info = valueOrErrorMessage(assetInfo(fromBase58String(assetId)), "Invalid asset ID")
173+ if ((info == info))
174+ then {
175+ let currentIndexKey = keyCurrentIndex(assetId)
176+ let currentIndex = getInteger(currentIndexKey)
177+ let newIndex = if (isDefined(currentIndex))
178+ then (value(currentIndex) + 1)
179+ else 0
180+ let wxPayment = i.payments[0]
181+ let wxPaymentAssetId = value(wxPayment.assetId)
182+ let wxPaymentAmount = value(wxPayment.amount)
183+ let votingRewardActions = if ((size(i.payments) > 1))
184+ then {
185+ let votingRewardPayment = i.payments[1]
186+ let votingRewardPaymentAssetId = toBase58String(value(votingRewardPayment.assetId))
187+ let votingRewardPaymentAmount = value(votingRewardPayment.amount)
188+[StringEntry(keyVotingRewardAssetId(assetId, newIndex), votingRewardPaymentAssetId), IntegerEntry(keyTotalVotingReward(assetId, newIndex), votingRewardPaymentAmount)]
189+ }
190+ else nil
191+ let minPeriodLength = getIntegerValue(keyMinPeriodLength)
192+ let maxPeriodLength = getIntegerValue(keyMaxPeriodLength)
193+ let checks = [if (if ((periodLength >= minPeriodLength))
194+ then (maxPeriodLength >= periodLength)
195+ else false)
196+ then true
197+ else throwErr("invalid periodLength"), if ((getBoolean(keyVerified(assetId)) == unit))
198+ then true
199+ else throwErr("already verified"), if ((getBoolean(keyVerificationInProgress(assetId)) == unit))
200+ then true
201+ else throwErr("already in progress"), if ((wxPaymentAmount == value(getInteger(keyWxForSuggestAddAmountRequired))))
202+ then true
203+ else throwErr("invalid payment amount")]
204+ if ((checks == checks))
205+ then {
206+ let assetsStoreCreateOrUpdateInv = invoke(assetsStoreContract, "createOrUpdate", [assetId, assetImage, false], nil)
207+ if ((assetsStoreCreateOrUpdateInv == assetsStoreCreateOrUpdateInv))
208+ then {
209+ let votingEndHeight = (height + periodLength)
210+ ([IntegerEntry(currentIndexKey, newIndex), BooleanEntry(keyVerificationInProgress(assetId), true), IntegerEntry(keyCurrentVotingHeightStart(assetId, newIndex), height), IntegerEntry(keyPeriodLengthAdd(assetId, newIndex), periodLength), StringEntry(keySuggestIssuer(assetId, newIndex), toString(i.caller)), IntegerEntry(keyVotingEndHeight(assetId, newIndex), votingEndHeight), Burn(wxPaymentAssetId, getIntegerValue(keyWxSuggestAddBurnAmount))] ++ votingRewardActions)
211+ }
212+ else throw("Strict value is not equal to itself.")
213+ }
214+ else throw("Strict value is not equal to itself.")
215+ }
216+ else throw("Strict value is not equal to itself.")
217+ }
218+
219+
220+
221+@Callable(i)
222+func suggestRemove (assetId) = {
223+ let gwxAmountAtNow = getUserGwxAmountAtHeight(toString(i.caller), height)
224+ let minSuggestRemoveBalance = getIntegerValue(keyMinSuggestRemoveBalance)
225+ let isVerified = valueOrElse(getBoolean(keyVerified(assetId)), false)
226+ let checks = [if (isVerified)
227+ then true
228+ else throwErr(makeString([assetId, "not verified"], " ")), if ((gwxAmountAtNow >= minSuggestRemoveBalance))
229+ then true
230+ else throwErr("not enough gWXes")]
231+ if ((checks == checks))
232+ then {
233+ let currentIndexKey = keyCurrentIndex(assetId)
234+ let currentIndex = getInteger(currentIndexKey)
235+ let newIndex = if (isDefined(currentIndex))
236+ then (value(currentIndex) + 1)
237+ else 0
238+ let periodLength = valueOrErrorMessage(getInteger(keyPeriodLengthRemove), wrapErr("periodLengthRemove not set"))
239+ let votingEndHeight = (height + periodLength)
240+[IntegerEntry(currentIndexKey, newIndex), BooleanEntry(keyDeverificationInProgress(assetId), true), IntegerEntry(keyCurrentVotingHeightStart(assetId, newIndex), height), StringEntry(keySuggestIssuer(assetId, newIndex), toString(i.caller)), IntegerEntry(keyVotingEndHeight(assetId, newIndex), votingEndHeight)]
241+ }
242+ else throw("Strict value is not equal to itself.")
243+ }
244+
245+
246+
247+@Callable(i)
248+func vote (assetId,inFavor) = {
249+ let currentIndexKey = keyCurrentIndex(assetId)
250+ let currentIndex = valueOrErrorMessage(getInteger(currentIndexKey), wrapErr("voting does not exist"))
251+ let votingInfo = votingExistChecks(assetId, currentIndex)
252+ if ((votingInfo == votingInfo))
253+ then {
254+ let currentVotingHeightStart = votingInfo._3
255+ let votingPeriodLenght = votingInfo._4
256+ let gwxAmountAtEnd = getUserGwxAmountAtHeight(toString(i.caller), (currentVotingHeightStart + votingPeriodLenght))
257+ let voteKey = keyVote(assetId, currentIndex, i.caller)
258+ let votingResultKey = keyVotingResult(assetId, currentIndex)
259+ let checks = [if ((getString(voteKey) == unit))
260+ then true
261+ else throwErr("You have already voted"), if ((gwxAmountAtEnd > 0))
262+ then true
263+ else throw("You'll not have gWX at the end of voting")]
264+ if ((checks == checks))
265+ then {
266+ let lastVotingValue = valueOrElse(getString(votingResultKey), defaultVotingValue)
267+ let lastVotingValueParts = split(lastVotingValue, separator)
268+ let newVotingValue = if (inFavor)
269+ then votingValue((parseIntValue(lastVotingValueParts[1]) + gwxAmountAtEnd), parseIntValue(lastVotingValueParts[2]))
270+ else votingValue(parseIntValue(lastVotingValueParts[1]), (parseIntValue(lastVotingValueParts[2]) + gwxAmountAtEnd))
271+[StringEntry(voteKey, voteValue(inFavor, gwxAmountAtEnd)), StringEntry(votingResultKey, newVotingValue)]
272+ }
273+ else throw("Strict value is not equal to itself.")
274+ }
275+ else throw("Strict value is not equal to itself.")
276+ }
277+
278+
279+
280+@Callable(i)
281+func cancelVote (assetId) = {
282+ let currentIndexKey = keyCurrentIndex(assetId)
283+ let currentIndex = valueOrErrorMessage(getInteger(currentIndexKey), wrapErr("voting does not exist"))
284+ let voteKey = keyVote(assetId, currentIndex, i.caller)
285+ let votingResultKey = keyVotingResult(assetId, currentIndex)
286+ let lastVote = valueOrErrorMessage(getString(voteKey), wrapErr("you have not voted"))
287+ let lastVoteParts = split(lastVote, separator)
288+ let inFavor = lastVoteParts[1]
289+ let gwxAmount = parseIntValue(lastVoteParts[2])
290+ let votingInfo = votingExistChecks(assetId, currentIndex)
291+ if ((votingInfo == votingInfo))
292+ then {
293+ let checks = [if (if ((inFavor == "true"))
294+ then true
295+ else (inFavor == "false"))
296+ then true
297+ else throwErr("invalid vote")]
298+ if ((checks == checks))
299+ then {
300+ let lastVotingValue = valueOrElse(getString(votingResultKey), defaultVotingValue)
301+ let lastVotingValueParts = split(lastVotingValue, separator)
302+ let newVotingResultValue = if ((inFavor == "true"))
303+ then votingValue((parseIntValue(lastVotingValueParts[1]) - gwxAmount), parseIntValue(lastVotingValueParts[2]))
304+ else votingValue(parseIntValue(lastVotingValueParts[1]), (parseIntValue(lastVotingValueParts[2]) - gwxAmount))
305+[DeleteEntry(voteKey), StringEntry(votingResultKey, newVotingResultValue)]
306+ }
307+ else throw("Strict value is not equal to itself.")
308+ }
309+ else throw("Strict value is not equal to itself.")
310+ }
311+
312+
313+
314+@Callable(i)
315+func finalize (assetId) = {
316+ let verificationInProgress = valueOrElse(getBoolean(keyVerificationInProgress(assetId)), false)
317+ let deverificationInProgress = valueOrElse(getBoolean(keyDeverificationInProgress(assetId)), false)
318+ let currentIndexKey = keyCurrentIndex(assetId)
319+ let currentIndex = valueOrElse(getInteger(currentIndexKey), 0)
320+ let votingThresholdAdd = valueOrErrorMessage(getInteger(keyVotingThresholdAdd), wrapErr("votingThresholdAdd not set"))
321+ let votingThresholdRemove = valueOrErrorMessage(getInteger(keyVotingThresholdRemove), wrapErr("votingThresholdRemove not set"))
322+ let $t01369314132 = if (verificationInProgress)
323+ then $Tuple3([DeleteEntry(keyVerificationInProgress(assetId)), BooleanEntry(keyVerified(assetId), true)], true, votingThresholdAdd)
324+ else $Tuple3([DeleteEntry(keyDeverificationInProgress(assetId)), DeleteEntry(keyVerified(assetId))], true, votingThresholdRemove)
325+ let finalizeVotingActions = $t01369314132._1
326+ let verified = $t01369314132._2
327+ let threshold = $t01369314132._3
328+ let lastVotingValue = valueOrElse(getString(keyVotingResult(assetId, currentIndex)), defaultVotingValue)
329+ let lastVotingValueParts = split(lastVotingValue, separator)
330+ let votesFor = parseIntValue(lastVotingValueParts[1])
331+ let votesAgainst = parseIntValue(lastVotingValueParts[2])
332+ let votesTotal = (votesFor + votesAgainst)
333+ let votingEndHeight = valueOrErrorMessage(getInteger(keyVotingEndHeight(assetId, currentIndex)), wrapErr("voting end height not found"))
334+ let checks = [if (if (verificationInProgress)
335+ then true
336+ else deverificationInProgress)
337+ then true
338+ else throwErr("nothing to finalize"), if ((height >= votingEndHeight))
339+ then true
340+ else throwErr("voting not finished"), if ((votesTotal >= threshold))
341+ then true
342+ else throwErr("not enough votes")]
343+ if ((checks == checks))
344+ then {
345+ let finalizeCallRewardAction = if ((votesAgainst > votesFor))
346+ then {
347+ let setVerifiedInvoke = invoke(assetsStoreContract, "setVerified", [assetId, verified], nil)
348+ if ((setVerifiedInvoke == setVerifiedInvoke))
349+ then {
350+ let finalizeCallRewardAmount = valueOrElse(getInteger(keyFinalizeCallRewardAmount), 0)
351+[ScriptTransfer(i.caller, finalizeCallRewardAmount, wxAssetId)]
352+ }
353+ else throw("Strict value is not equal to itself.")
354+ }
355+ else nil
356+ (finalizeVotingActions ++ finalizeCallRewardAction)
357+ }
358+ else throw("Strict value is not equal to itself.")
359+ }
360+
361+
362+
363+@Callable(i)
364+func claimREADONLY (assetId,index) = {
365+ let callerAddress = i.caller
366+ let votingRewardAssetIdStr = getString(keyVotingRewardAssetId(assetId, index))
367+ let rewardAmount = if (isDefined(votingRewardAssetIdStr))
368+ then calculateReward(callerAddress, assetId, index)
369+ else 0
370+ $Tuple2(nil, rewardAmount)
371+ }
372+
373+
374+
375+@Callable(i)
376+func claim (assetId,index) = {
377+ let callerAddress = i.caller
378+ let claimHistoryKey = keyClaimHistory(callerAddress, assetId, index)
379+ let claimHistory = getString(claimHistoryKey)
380+ let checks = [if ((claimHistory == unit))
381+ then true
382+ else throwErr("already claimed")]
383+ if ((checks == checks))
384+ then {
385+ let rewardAmount = if ((calculateReward(callerAddress, assetId, index) > 0))
386+ then calculateReward(callerAddress, assetId, index)
387+ else throwErr("nothing to claim")
388+ let votingRewardAssetIdStr = getString(keyVotingRewardAssetId(assetId, index))
389+ let rewardAction = if (isDefined(votingRewardAssetIdStr))
390+ then {
391+ let votingRewardAssetId = fromBase58String(value(votingRewardAssetIdStr))
392+[ScriptTransfer(callerAddress, rewardAmount, votingRewardAssetId), StringEntry(claimHistoryKey, claimHistoryValue(rewardAmount))]
393+ }
394+ else throwErr("nothing to claim")
395+ rewardAction
396+ }
397+ else throw("Strict value is not equal to itself.")
398+ }
399+
400+

github/deemru/w8io/169f3d6 
34.94 ms