tx · B9brArfMmMSuGWrrU6Kzmyz4prYhbpG8ScVMUhVUjnwY 3NBqCWj3QHj8ziqSKZrPvM7T9W264VEcEKc: -0.05000000 Waves 2023.10.06 13:19 [2786632] smart account 3NBqCWj3QHj8ziqSKZrPvM7T9W264VEcEKc > SELF 0.00000000 Waves
{ "type": 13, "id": "B9brArfMmMSuGWrrU6Kzmyz4prYhbpG8ScVMUhVUjnwY", "fee": 5000000, "feeAssetId": null, "timestamp": 1696587667506, "version": 1, "sender": "3NBqCWj3QHj8ziqSKZrPvM7T9W264VEcEKc", "senderPublicKey": "4Hm29w6cNMhSZBRdRNzrmGB8CdYBF8YfNGuDZsBNUMNy", "proofs": [ "3GrR32TwAdTkMH2tTDKxV1PHiGHcmKw7498LYpcf2Nj581JDdBF8JCB7ER7XboiJjiYTpybgjPEbtZooZ8NUJwhh" ], "script": "base64:BgJjCAISDAoKCAEBAQEBAQgICBIECgIIARIECgIICBIECgIICBIDCgEIEgMKAQgSBQoDCAEBEgMKAQgSBAoCCAESAwoBCBIDCgEIEgMKAQgSBAoCCAgSBAoCCAgSAwoBCBIDCgEIMwEQd3JpdGVDb25zdFN0cmluZwIDa2V5BXZhbHVlAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBQNrZXkJAQtTdHJpbmdFbnRyeQIFA2tleQUFdmFsdWUJAAIBCQCsAgICFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5AQh3cml0ZUludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlAQhjaGFuZ2VCeQIDa2V5BXZhbHVlCQEId3JpdGVJbnQCBQNrZXkJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAABQV2YWx1ZQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIZd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAEHYXNzZXRJZAEDc3RyAwkAAAIFA3N0cgIFV0FWRVMFBHVuaXQJANkEAQUDc3RyABJjb25maWdBZGRyZXNzU3RvcmUCBmNvbmZpZwANY29uZmlnQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRJjb25maWdBZGRyZXNzU3RvcmUCImNoaWxkcmVuOiBjb25maWcgYWRkcmVzcyBub3QgZm91bmQCFmludmFsaWQgY29uZmlnIGFkZHJlc3MBB2FsbG93ZWQBAm9wCQD8BwQFDWNvbmZpZ0FkZHJlc3MCCW9wQWxsb3dlZAkAzAgCBQJvcAUDbmlsBQNuaWwABkhFSUdIVAUGaGVpZ2h0AApwd3JBc3NldElkCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAgxwb3dlckFzc2V0SWQCFnB3ciBhc3NldCBpZCBub3QgZm91bmQACHNsYXNoZXJzCQELdmFsdWVPckVsc2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MJAKwCAgkApQgBBQR0aGlzAglfc2xhc2hlcnMCAAANbWFpbkFkZHJlc3NlcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzAg5tYWluX2FkZHJlc3NlcwIAAQtwZXJpb2RTdG9yZQEFY2hpbGQJAKwCAgIHcGVyaW9kXwUFY2hpbGQBBnBlcmlvZAEFY2hpbGQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBC3BlcmlvZFN0b3JlAQUFY2hpbGQAAAEKb3duZXJTdG9yZQEFY2hpbGQJAKwCAgIGb3duZXJfBQVjaGlsZAENdHJlYXN1cnlTdG9yZQEFY2hpbGQJAKwCAgIJdHJlYXN1cnlfBQVjaGlsZAENbG9ja1RpbWVTdG9yZQEFY2hpbGQJAKwCAgIJbG9ja1RpbWVfBQVjaGlsZAETcGVyaW9kTG9ja1RpbWVTdG9yZQIFY2hpbGQGcGVyaW9kCQCsAgIJAKwCAgkArAICAgdwZXJpb2RfCQCkAwEFBnBlcmlvZAIKX2xvY2tUaW1lXwUFY2hpbGQBEXNraW5SZXF1aXJlZFN0b3JlAQVjaGlsZAkArAICAg5za2luX3JlcXVpcmVkXwUFY2hpbGQBDHNraW5NYXhTdG9yZQEFY2hpbGQJAKwCAgIJc2tpbl9tYXhfBQVjaGlsZAETaW52ZXN0bWVudHNNYXhTdG9yZQEFY2hpbGQJAKwCAgIQaW52ZXN0bWVudHNfbWF4XwUFY2hpbGQBEm1pbkNvbW1pdG1lbnRTdG9yZQEFY2hpbGQJAKwCAgIObWluX2NvbW1pdG1lbnQFBWNoaWxkAQ5za2luVG90YWxTdG9yZQEFY2hpbGQJAKwCAgILc2tpbl90b3RhbF8FBWNoaWxkAA1wd3JUb3RhbFN0b3JlAglwd3JfdG90YWwBGGludmVzdG1lbnRzUmVxdWlyZWRTdG9yZQEFY2hpbGQJAKwCAgIVaW52ZXN0bWVudHNfcmVxdWlyZWRfBQVjaGlsZAEVaW52ZXN0bWVudHNUb3RhbFN0b3JlAQVjaGlsZAkArAICAhJpbnZlc3RtZW50c190b3RhbF8FBWNoaWxkARtpbnZlc3RtZW50c1BlcmlvZFRvdGFsU3RvcmUBBWNoaWxkCQCsAgIJAKwCAgkArAICAgdwZXJpb2RfCQCkAwEJAQZwZXJpb2QBBQVjaGlsZAITX2ludmVzdG1lbnRzX3RvdGFsXwUFY2hpbGQBFWludmVzdG1lbnRzVG9rZW5TdG9yZQEFY2hpbGQJAKwCAgISaW52ZXN0bWVudHNfdG9rZW5fBQVjaGlsZAEQY29tbWl0bWVudHNTdG9yZQEFY2hpbGQJAKwCAgIMY29tbWl0bWVudHNfBQVjaGlsZAERY3JlYXRlSGVpZ2h0U3RvcmUBBWNoaWxkCQCsAgICDmNyZWF0ZV9oZWlnaHRfBQVjaGlsZAEQc3RhcnRIZWlnaHRTdG9yZQEFY2hpbGQJAKwCAgINc3RhcnRfaGVpZ2h0XwUFY2hpbGQBFnN0YXJ0UGVyaW9kSGVpZ2h0U3RvcmUCBWNoaWxkBnBlcmlvZAkArAICCQCsAgIJAKwCAgIHcGVyaW9kXwkApAMBBQZwZXJpb2QCDl9zdGFydF9oZWlnaHRfBQVjaGlsZAEbc3RhcnRQZXJpb2RBZnRlckhlaWdodFN0b3JlAgVjaGlsZAZwZXJpb2QJAKwCAgkArAICCQCsAgICB3BlcmlvZF8JAKQDAQUGcGVyaW9kAhRfc3RhcnRfYWZ0ZXJfaGVpZ2h0XwUFY2hpbGQBHXN0YXJ0Q3VycmVudFBlcmlvZEhlaWdodFN0b3JlAQVjaGlsZAkBFnN0YXJ0UGVyaW9kSGVpZ2h0U3RvcmUCBQVjaGlsZAkBBnBlcmlvZAEFBWNoaWxkARFjYW5jZWxIZWlnaHRTdG9yZQEFY2hpbGQJAKwCAgIOY2FuY2VsX2hlaWdodF8FBWNoaWxkARBpbnZlc3RtZW50c1Rva2VuAQVjaGlsZAkBB2Fzc2V0SWQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFWludmVzdG1lbnRzVG9rZW5TdG9yZQEFBWNoaWxkAh5pbnZlc3RtZW50cyBhc3NldCBpZCBub3QgZm91bmQBDXVzZXJTa2luU3RvcmUCBWNoaWxkBHVzZXIJAKwCAgkArAICCQCsAgICBXNraW5fBQVjaGlsZAIBXwUEdXNlcgEUdXNlclNraW5IaXN0b3J5U3RvcmUCBWNoaWxkBHVzZXIJAKwCAgkBDXVzZXJTa2luU3RvcmUCBQVjaGlsZAUEdXNlcgIIX2hpc3RvcnkBDWludmVzdG9yU3RvcmUCBWNoaWxkCGludmVzdG9yCQCsAgIJAKwCAgkArAICAglpbnZlc3Rvcl8FBWNoaWxkAgFfBQhpbnZlc3RvcgEQYXNzZXJ0Tm90U3RhcnRlZAEFY2hpbGQDCQEJaXNEZWZpbmVkAQkAnwgBCQEQc3RhcnRIZWlnaHRTdG9yZQEFBWNoaWxkCQACAQIPYWxyZWFkeSBzdGFydGVkBwESYXNzZXJ0Tm90Q2FuY2VsbGVkAQVjaGlsZAMJAQlpc0RlZmluZWQBCQCfCAEJARFjYW5jZWxIZWlnaHRTdG9yZQEFBWNoaWxkCQACAQIQYWxyZWFkeSBjYW5jZWxlZAcBFmFzc2VydE5vdFN0YXJ0ZWRQZXJpb2QBBWNoaWxkAwkAAAIJAQZwZXJpb2QBBQVjaGlsZAAACQEQYXNzZXJ0Tm90U3RhcnRlZAEFBWNoaWxkAwkBCWlzRGVmaW5lZAEJAJ8IAQkBHXN0YXJ0Q3VycmVudFBlcmlvZEhlaWdodFN0b3JlAQUFY2hpbGQJAAIBAhZwZXJpb2QgYWxyZWFkeSBzdGFydGVkBwEOdXNlckNvbW1pdG1lbnQCBWNoaWxkBHVzZXIJAJ8IAQkBDXVzZXJTa2luU3RvcmUCBQVjaGlsZAUEdXNlcgEPY3VycmVudFVzZXJTa2luAgVjaGlsZAR1c2VyCQELdmFsdWVPckVsc2UCCQEOdXNlckNvbW1pdG1lbnQCBQVjaGlsZAUEdXNlcgAAAQhsb2NrVGltZQIFY2hpbGQGcGVyaW9kCQELdmFsdWVPckVsc2UCCQCfCAEJARNwZXJpb2RMb2NrVGltZVN0b3JlAgUFY2hpbGQFBnBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAQ1sb2NrVGltZVN0b3JlAQUFY2hpbGQCEW5vIGNoaWxkIGxvY2tUaW1lAQx1bmxvY2tIZWlnaHQBBWNoaWxkBAFwCQEGcGVyaW9kAQUFY2hpbGQEC3BlcmlvZFN0YXJ0CQCfCAEJARZzdGFydFBlcmlvZEhlaWdodFN0b3JlAgUFY2hpbGQFAXADCQEJaXNEZWZpbmVkAQULcGVyaW9kU3RhcnQJAGQCCQEFdmFsdWUBBQtwZXJpb2RTdGFydAkBCGxvY2tUaW1lAgUFY2hpbGQFAXAECnByZXZQZXJpb2QJAGUCBQFwAAEECmNoaWxkU3RhcnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQEQc3RhcnRIZWlnaHRTdG9yZQEFBWNoaWxkAhVubyBjaGlsZCBzdGFydCBoZWlnaHQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEJARZzdGFydFBlcmlvZEhlaWdodFN0b3JlAgUFY2hpbGQFCnByZXZQZXJpb2QFCmNoaWxkU3RhcnQJAQhsb2NrVGltZQIFBWNoaWxkBQpwcmV2UGVyaW9kAQh0cmVhc3VyeQEFY2hpbGQJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBDXRyZWFzdXJ5U3RvcmUBBQVjaGlsZAUFY2hpbGQBA2ludAEDa2V5CQCkAwEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUDa2V5AAABA3N0cgEDa2V5CQELdmFsdWVPckVsc2UCCQCiCAEFA2tleQIAAQ1hZHZpc2VQcm9qZWN0AQVjaGlsZAQBcAkBBnBlcmlvZAEFBWNoaWxkBAlwZXJpb2RTdHIJAKQDAQUBcAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIIaGVpZ2h0OiAJAKQDAQUGSEVJR0hUAgssIHByb2plY3Q6IAUFY2hpbGQCCSwgb3duZXI6IAkBA3N0cgEJAQpvd25lclN0b3JlAQUFY2hpbGQCDCwgdHJlYXN1cnk6IAkBCHRyZWFzdXJ5AQUFY2hpbGQCDSwgbG9ja190aW1lOiAJAQNpbnQBCQENbG9ja1RpbWVTdG9yZQEFBWNoaWxkAhEsIHNraW5fcmVxdWlyZWQ6IAkBA2ludAEJARFza2luUmVxdWlyZWRTdG9yZQEFBWNoaWxkAgwsIHNraW5fbWF4OiAJAQNpbnQBCQEMc2tpbk1heFN0b3JlAQUFY2hpbGQCEiwgbWluX2NvbW1pdG1lbnQ6IAkBA2ludAEJARJtaW5Db21taXRtZW50U3RvcmUBBQVjaGlsZAIOLCBza2luX3RvdGFsOiAJAQNpbnQBCQEOc2tpblRvdGFsU3RvcmUBBQVjaGlsZAIYLCBpbnZlc3RtZW50c19yZXF1aXJlZDogCQEDaW50AQkBGGludmVzdG1lbnRzUmVxdWlyZWRTdG9yZQEFBWNoaWxkAhMsIGludmVzdG1lbnRzX21heDogCQEDaW50AQkBE2ludmVzdG1lbnRzTWF4U3RvcmUBBQVjaGlsZAIVLCBpbnZlc3RtZW50c190b3RhbDogCQEDaW50AQkBFWludmVzdG1lbnRzVG90YWxTdG9yZQEFBWNoaWxkAhUsIGludmVzdG1lbnRzX3Rva2VuOiAJAQNzdHIBCQEVaW52ZXN0bWVudHNUb2tlblN0b3JlAQUFY2hpbGQCDywgY29tbWl0bWVudHM6IAkBA3N0cgEJARBjb21taXRtZW50c1N0b3JlAQUFY2hpbGQCESwgY3JlYXRlX2hlaWdodDogCQEDaW50AQkBEWNyZWF0ZUhlaWdodFN0b3JlAQUFY2hpbGQCECwgc3RhcnRfaGVpZ2h0OiAJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEQc3RhcnRIZWlnaHRTdG9yZQEFBWNoaWxkAP///////////wECESwgY2FuY2VsX2hlaWdodDogCQCkAwEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEWNhbmNlbEhlaWdodFN0b3JlAQUFY2hpbGQA////////////AQIKLCBwZXJpb2Q6IAUJcGVyaW9kU3RyAgksIHBlcmlvZF8FCXBlcmlvZFN0cgIVX3N0YXJ0X2FmdGVyX2hlaWdodDogCQCkAwEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBG3N0YXJ0UGVyaW9kQWZ0ZXJIZWlnaHRTdG9yZQIFBWNoaWxkBQFwAP///////////wECCSwgcGVyaW9kXwUJcGVyaW9kU3RyAg9fc3RhcnRfaGVpZ2h0OiAJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEdc3RhcnRDdXJyZW50UGVyaW9kSGVpZ2h0U3RvcmUBBQVjaGlsZAD///////////8BAgksIHBlcmlvZF8FCXBlcmlvZFN0cgIMX2xvY2tfdGltZTogCQCkAwEJAQhsb2NrVGltZQIFBWNoaWxkBQFwAhEsIHVubG9ja19oZWlnaHQ6IAkApAMBCQEMdW5sb2NrSGVpZ2h0AQUFY2hpbGQCHCwgcGVyaW9kX2ludmVzdG1lbnRzX3RvdGFsOiAJAQNpbnQBCQEbaW52ZXN0bWVudHNQZXJpb2RUb3RhbFN0b3JlAQUFY2hpbGQBEWFkdmlzZVVzZXJQcm9qZWN0AgVjaGlsZAR1c2VyCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAghoZWlnaHQ6IAkApAMBBQZIRUlHSFQCCywgcHJvamVjdDogBQVjaGlsZAIHLCBza2luOgkApAMBCQEPY3VycmVudFVzZXJTa2luAgUFY2hpbGQFBHVzZXICCCwgcG93ZXI6CQCkAwEJAQt2YWx1ZU9yRWxzZQIJAQ51c2VyQ29tbWl0bWVudAIFBWNoaWxkBQR1c2VyAAACDywgaW52ZXN0bWVudHM6IAkBA2ludAEJAQ1pbnZlc3RvclN0b3JlAgUFY2hpbGQFBHVzZXIQAWkBCnByb2plY3RGb3IKBW93bmVyBHNraW4HbWF4U2tpbg1taW5Db21taXRtZW50CGxvY2tUaW1lC2ludmVzdG1lbnRzDm1heEludmVzdG1lbnRzEGludmVzdG1lbnRzVG9rZW4LY29tbWl0bWVudHMFY2hpbGQEAWEJAQdhbGxvd2VkAQIKcHJvamVjdEZvcgMJAAACBQFhBQFhAwkBASEBCQEIY29udGFpbnMCBQ1tYWluQWRkcmVzc2VzCQClCAEIBQFpBmNhbGxlcgkAAgECBmRlbmllZAQBdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBWNoaWxkAhhpbnZhbGlkIHRyZWFzdXJ5IGFkZHJlc3MDCQAAAgUBdAUBdAQFdG9rZW4JAQdhc3NldElkAQUQaW52ZXN0bWVudHNUb2tlbgMJAAACBQV0b2tlbgUFdG9rZW4DAwkAZgIFB21heFNraW4AAAkAZgIFBHNraW4FB21heFNraW4HCQACAQIPaW52YWxpZCBtYXhTa2luAwMJAGYCBQ5tYXhJbnZlc3RtZW50cwAACQBmAgULaW52ZXN0bWVudHMFDm1heEludmVzdG1lbnRzBwkAAgECFmludmFsaWQgbWF4SW52ZXN0bWVudHMJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCCQEKb3duZXJTdG9yZQEFBWNoaWxkBQVvd25lcgkAzAgCCQEId3JpdGVJbnQCCQERY3JlYXRlSGVpZ2h0U3RvcmUBBQVjaGlsZAUGSEVJR0hUCQDMCAIJAQh3cml0ZUludAIJARFza2luUmVxdWlyZWRTdG9yZQEFBWNoaWxkBQRza2luCQDMCAIJAQh3cml0ZUludAIJAQxza2luTWF4U3RvcmUBBQVjaGlsZAUHbWF4U2tpbgkAzAgCCQEId3JpdGVJbnQCCQESbWluQ29tbWl0bWVudFN0b3JlAQUFY2hpbGQFDW1pbkNvbW1pdG1lbnQJAMwIAgkBCHdyaXRlSW50AgkBDWxvY2tUaW1lU3RvcmUBBQVjaGlsZAUIbG9ja1RpbWUJAMwIAgkBCHdyaXRlSW50AgkBGGludmVzdG1lbnRzUmVxdWlyZWRTdG9yZQEFBWNoaWxkBQtpbnZlc3RtZW50cwkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIJARVpbnZlc3RtZW50c1Rva2VuU3RvcmUBBQVjaGlsZAUQaW52ZXN0bWVudHNUb2tlbgkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIJARBjb21taXRtZW50c1N0b3JlAQUFY2hpbGQFC2NvbW1pdG1lbnRzCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgkBDXRyZWFzdXJ5U3RvcmUBBQVjaGlsZAUFY2hpbGQJAMwIAgkBCHdyaXRlSW50AgkBE2ludmVzdG1lbnRzTWF4U3RvcmUBBQVjaGlsZAUObWF4SW52ZXN0bWVudHMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1pbmNyZXJhc2VTa2luAgVjaGlsZA1za2luSW5jcmVtZW50BAFhCQEHYWxsb3dlZAECDWluY3JlcmFzZVNraW4DCQAAAgUBYQUBYQQBcwMJARBhc3NlcnROb3RTdGFydGVkAQUFY2hpbGQJARJhc3NlcnROb3RDYW5jZWxsZWQBBQVjaGlsZAcDCQAAAgUBcwUBcwMJAGcCAAAFDXNraW5JbmNyZW1lbnQJAAIBAjJpbnZhbGlkIGFyZ3VtZW50OiBza2luSW5jcmVtZW50IHNob3VsZCBiZSBwb3NpdGl2ZQQFb3duZXIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAQpvd25lclN0b3JlAQUFY2hpbGQDCQECIT0CCQClCAEIBQFpBmNhbGxlcgUFb3duZXIJAAIBAgZkZW5pZWQJAMwIAgkBCGNoYW5nZUJ5AgkBEXNraW5SZXF1aXJlZFN0b3JlAQUFY2hpbGQFDXNraW5JbmNyZW1lbnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQljb21taXRGb3ICBWNoaWxkB2FkZHJlc3MEAWEJAQdhbGxvd2VkAQIJY29tbWl0Rm9yAwkAAAIFAWEFAWEEAXMJARZhc3NlcnROb3RTdGFydGVkUGVyaW9kAQUFY2hpbGQDCQAAAgUBcwUBcwQBcAkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFAXAHYXNzZXRJZAUKcHdyQXNzZXRJZAkAAgECL2ludmFsaWQgYXR0YWNoZWQgcGF5bWVudDogJHBvd2VyIHRva2VuIGV4cGVjdGVkBApjb21taXRtZW50CAUBcAZhbW91bnQEDW1pbkNvbW1pdG1lbnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQESbWluQ29tbWl0bWVudFN0b3JlAQUFY2hpbGQCE0NoaWxkIERBTyBub3QgZm91bmQDCQBmAgUNbWluQ29tbWl0bWVudAUKY29tbWl0bWVudAkAAgEJAKwCAgITTWluLiBjb21taXRtZW50IGlzIAkApAMBBQ1taW5Db21taXRtZW50BA9za2luVG90YWxTdG9yZTEJAQ5za2luVG90YWxTdG9yZQEFBWNoaWxkBAxuZXdTa2luVG90YWwJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFD3NraW5Ub3RhbFN0b3JlMQAABQpjb21taXRtZW50BAdza2luTWF4CQELdmFsdWVPckVsc2UCCQCfCAEJAQxza2luTWF4U3RvcmUBBQVjaGlsZAAAAwMJAGYCBQdza2luTWF4AAAJAGYCBQxuZXdTa2luVG90YWwFB3NraW5NYXgHCQACAQkArAICAhxUb3RhbCBtYXguIHNraW4gaXMgcmVhY2hlZDogCQCkAwEFB3NraW5NYXgJAMwIAgkBCGNoYW5nZUJ5AgkBDXVzZXJTa2luU3RvcmUCBQVjaGlsZAUHYWRkcmVzcwUKY29tbWl0bWVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPc2tpblRvdGFsU3RvcmUxBQxuZXdTa2luVG90YWwJAMwIAgkBCGNoYW5nZUJ5AgUNcHdyVG90YWxTdG9yZQUKY29tbWl0bWVudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNvbW1pdEZvck1pbmVyAgVjaGlsZAdhZGRyZXNzBAFhCQEHYWxsb3dlZAECDmNvbW1pdEZvck1pbmVyAwkAAAIFAWEFAWEDCQEBIQEJAQhjb250YWlucwIFDW1haW5BZGRyZXNzZXMJAKUIAQgFAWkGY2FsbGVyCQACAQIGZGVuaWVkBAFwCQCRAwIIBQFpCHBheW1lbnRzAAADAwkBAiE9AggFAXAHYXNzZXRJZAUKcHdyQXNzZXRJZAYJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECLGludmFsaWQgcGF5bWVudHM6IG9ubHkgJHBvd2VyIHRva2VuIGV4cGVjdGVkBApjb21taXRtZW50CAUBcAZhbW91bnQJAMwIAgkBCGNoYW5nZUJ5AgkBDXVzZXJTa2luU3RvcmUCBQVjaGlsZAUHYWRkcmVzcwUKY29tbWl0bWVudAkAzAgCCQEIY2hhbmdlQnkCCQEOc2tpblRvdGFsU3RvcmUBBQVjaGlsZAUKY29tbWl0bWVudAkAzAgCCQEIY2hhbmdlQnkCBQ1wd3JUb3RhbFN0b3JlBQpjb21taXRtZW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEGaW52ZXN0AQVjaGlsZAQBYQkBB2FsbG93ZWQBAgZpbnZlc3QDCQAAAgUBYQUBYQQBcwkBFmFzc2VydE5vdFN0YXJ0ZWRQZXJpb2QBBQVjaGlsZAMJAAACBQFzBQFzBAV0b2tlbgkBEGludmVzdG1lbnRzVG9rZW4BBQVjaGlsZAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUFdG9rZW4JAAIBAhxpbnZhbGlkIGludmVzdG1lbnRzIGFzc2V0IGlkBAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAdtYXhpbXVtCQELdmFsdWVPckVsc2UCCQCfCAEJARNpbnZlc3RtZW50c01heFN0b3JlAQUFY2hpbGQAAAoBBWRhdGFzAQFhCQDMCAIJAQhjaGFuZ2VCeQIJAQ1pbnZlc3RvclN0b3JlAgUFY2hpbGQJAKUIAQgFAWkGY2FsbGVyBQFhCQDMCAIJAQhjaGFuZ2VCeQIJARVpbnZlc3RtZW50c1RvdGFsU3RvcmUBBQVjaGlsZAUBYQkAzAgCCQEIY2hhbmdlQnkCCQEbaW52ZXN0bWVudHNQZXJpb2RUb3RhbFN0b3JlAQUFY2hpbGQFAWEFA25pbAMJAGYCBQdtYXhpbXVtAAAECnRvdGFsU3RvcmUJARVpbnZlc3RtZW50c1RvdGFsU3RvcmUBBQVjaGlsZAQFdG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKdG90YWxTdG9yZQAABAppbnZlc3RtZW5zCQCXAwEJAMwIAgUGYW1vdW50CQDMCAIJAGUCBQdtYXhpbXVtBQV0b3RhbAUDbmlsAwkAZwIAAAUKaW52ZXN0bWVucwkAAgEJAKwCAgIjVG90YWwgbWF4LiBpbnZlc3RtZW50cyBpcyByZWFjaGVkOiAJAKQDAQUHbWF4aW11bQQKY2hhcmdlQmFjawkAZQIFBmFtb3VudAUKaW52ZXN0bWVucwMJAGYCBQpjaGFyZ2VCYWNrAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQpjaGFyZ2VCYWNrBQV0b2tlbgkBBWRhdGFzAQUKaW52ZXN0bWVucwkBBWRhdGFzAQUKaW52ZXN0bWVucwkBBWRhdGFzAQUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXN0YXJ0AQVjaGlsZAQGcGF1c2VkCQEHYWxsb3dlZAECBXN0YXJ0AwkAAAIFBnBhdXNlZAUGcGF1c2VkBAFzAwkBEGFzc2VydE5vdFN0YXJ0ZWQBBQVjaGlsZAkBEmFzc2VydE5vdENhbmNlbGxlZAEFBWNoaWxkBwMJAAACBQFzBQFzBAl0b3RhbFNraW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDnNraW5Ub3RhbFN0b3JlAQUFY2hpbGQAAAQMc2tpblJlcXVpcmVkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBEXNraW5SZXF1aXJlZFN0b3JlAQUFY2hpbGQCFGNoaWxkIG5vdCByZWdpc3RlcmVkAwkAZgIFDHNraW5SZXF1aXJlZAUJdG90YWxTa2luCQACAQIbbm90IGVub3VnaCBza2luIGluIHRoZSBnYW1lBBB0b3RhbEludmVzdG1lbnRzCQELdmFsdWVPckVsc2UCCQCfCAEJARVpbnZlc3RtZW50c1RvdGFsU3RvcmUBBQVjaGlsZAAAAwkAZgIJARFAZXh0ck5hdGl2ZSgxMDU1KQEJARhpbnZlc3RtZW50c1JlcXVpcmVkU3RvcmUBBQVjaGlsZAUQdG90YWxJbnZlc3RtZW50cwkAAgECFm5vdCBlbm91Z2ggaW52ZXN0bWVudHMJAMwIAgkBDEludGVnZXJFbnRyeQIJARBzdGFydEhlaWdodFN0b3JlAQUFY2hpbGQFBkhFSUdIVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEIdHJlYXN1cnkBBQVjaGlsZAUQdG90YWxJbnZlc3RtZW50cwkBEGludmVzdG1lbnRzVG9rZW4BBQVjaGlsZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmluaXROZXh0UGVyaW9kAwVjaGlsZBNibG9ja0JldHdlZW5QZXJpb2RzCGxvY2tUaW1lBAZwYXVzZWQJAQdhbGxvd2VkAQIOaW5pdE5leHRQZXJpb2QDCQAAAgUGcGF1c2VkBQZwYXVzZWQDAwkBAiE9AgkApQgBCAUBaQZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAQpvd25lclN0b3JlAQUFY2hpbGQJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwcJAAIBAgZkZW5pZWQDCQBmAgAABRNibG9ja0JldHdlZW5QZXJpb2RzCQACAQIuYmxvY2tCZXR3ZWVuUGVyaW9kcyBzaG91bGQgYmUgcG9zaXRpdmUgb3IgemVybwMJAGYCAAEFCGxvY2tUaW1lCQACAQIbbG9ja1RpbWUgc2hvdWxkIGJlIHBvc2l0aXZlBA11bmxvY2tIZWlnaHRfCQEMdW5sb2NrSGVpZ2h0AQUFY2hpbGQDCQBmAgUNdW5sb2NrSGVpZ2h0XwUGSEVJR0hUCQACAQIeY3VycmVudCBwZXJpb2QgaXMgc3RpbGwgYWN0aXZlBAFwCQEGcGVyaW9kAQUFY2hpbGQDAwkAZgIFAXAAAAkBASEBCQEJaXNEZWZpbmVkAQkBFnN0YXJ0UGVyaW9kSGVpZ2h0U3RvcmUCBQVjaGlsZAUBcAcJAAIBAh9uZXh0IHBlcmlvZCBhbHJlYWR5IGluaXRpYWxpemVkBAluZXdQZXJpb2QJAGQCBQFwAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtwZXJpb2RTdG9yZQEFBWNoaWxkBQluZXdQZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIJARtzdGFydFBlcmlvZEFmdGVySGVpZ2h0U3RvcmUCBQVjaGlsZAUJbmV3UGVyaW9kCQBkAgUNdW5sb2NrSGVpZ2h0XwUTYmxvY2tCZXR3ZWVuUGVyaW9kcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE3BlcmlvZExvY2tUaW1lU3RvcmUCBQVjaGlsZAUJbmV3UGVyaW9kBQhsb2NrVGltZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3N0YXJ0UGVyaW9kAQVjaGlsZAQGcGF1c2VkCQEHYWxsb3dlZAECC3N0YXJ0UGVyaW9kAwkAAAIFBnBhdXNlZAUGcGF1c2VkBAFzCQEWYXNzZXJ0Tm90U3RhcnRlZFBlcmlvZAEFBWNoaWxkAwkAAAIFAXMFAXMEB3BlcmlvZF8JAQZwZXJpb2QBBQVjaGlsZAQPc3RhcnRBZnRlclN0b3JlCQEbc3RhcnRQZXJpb2RBZnRlckhlaWdodFN0b3JlAgUFY2hpbGQFB3BlcmlvZF8ECnN0YXJ0QWZ0ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ9zdGFydEFmdGVyU3RvcmUJAKwCAgIPa2V5IG5vdCBmb3VuZDogBQ9zdGFydEFmdGVyU3RvcmUDCQBmAgUKc3RhcnRBZnRlcgUGSEVJR0hUCQACAQIJdG9vIGVhcmx5BAl0b3RhbFNraW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDnNraW5Ub3RhbFN0b3JlAQUFY2hpbGQAAAQMc2tpblJlcXVpcmVkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBEXNraW5SZXF1aXJlZFN0b3JlAQUFY2hpbGQCFGNoaWxkIG5vdCByZWdpc3RlcmVkAwkAZgIFDHNraW5SZXF1aXJlZAUJdG90YWxTa2luCQACAQIbbm90IGVub3VnaCBza2luIGluIHRoZSBnYW1lBBFwZXJpb2RJbnZlc3RtZW50cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEbaW52ZXN0bWVudHNQZXJpb2RUb3RhbFN0b3JlAQUFY2hpbGQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHXN0YXJ0Q3VycmVudFBlcmlvZEhlaWdodFN0b3JlAQUFY2hpbGQFBkhFSUdIVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQVjaGlsZAURcGVyaW9kSW52ZXN0bWVudHMJARBpbnZlc3RtZW50c1Rva2VuAQUFY2hpbGQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzbGFzaAIFY2hpbGQGYW1vdW50BAZwYXVzZWQJAQdhbGxvd2VkAQIBLwMJAAACBQZwYXVzZWQFBnBhdXNlZAMJAQEhAQkBCGNvbnRhaW5zAgUIc2xhc2hlcnMJAKUIAQgFAWkGY2FsbGVyCQACAQIGZGVuaWVkAwkBASEBCQEJaXNEZWZpbmVkAQkAnwgBCQEQc3RhcnRIZWlnaHRTdG9yZQEFBWNoaWxkCQACAQILbm90IHN0YXJ0ZWQJAMwIAgkBCGNoYW5nZUJ5AgkBDnNraW5Ub3RhbFN0b3JlAQUFY2hpbGQJAQEtAQUGYW1vdW50CQDMCAIJAQRCdXJuAgUKcHdyQXNzZXRJZAUGYW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIY29tcGxldGUBBWNoaWxkBAZwYXVzZWQJAQdhbGxvd2VkAQIIY29tcGxldGUDCQAAAgUGcGF1c2VkBQZwYXVzZWQEDXVubG9ja0hlaWdodF8JAQx1bmxvY2tIZWlnaHQBBQVjaGlsZAMJAGYCBQ11bmxvY2tIZWlnaHRfBQZIRUlHSFQJAAIBAgxzdGlsbCBsb2NrZWQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBARza2luCQEPY3VycmVudFVzZXJTa2luAgUFY2hpbGQFBHVzZXIDCQAAAgUEc2tpbgAACQACAQIbeW91IGhhZCBubyBza2luIGluIHRoZSBnYW1lBAV0b3RhbAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBDnNraW5Ub3RhbFN0b3JlAQUFY2hpbGQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQRza2luBQpwd3JBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ11c2VyU2tpblN0b3JlAgUFY2hpbGQFBHVzZXIJAMwIAgkBCGNoYW5nZUJ5AgkBDnNraW5Ub3RhbFN0b3JlAQUFY2hpbGQJAQEtAQUEc2tpbgkAzAgCCQEIY2hhbmdlQnkCBQ1wd3JUb3RhbFN0b3JlCQEBLQEFBHNraW4JAMwIAgkBDEludGVnZXJFbnRyeQIJARR1c2VyU2tpbkhpc3RvcnlTdG9yZQIFBWNoaWxkBQR1c2VyBQRza2luBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEGY2FuY2VsAQVjaGlsZAQGcGF1c2VkCQEHYWxsb3dlZAECBmNhbmNlbAMJAAACBQZwYXVzZWQFBnBhdXNlZAQBcwMJARBhc3NlcnROb3RTdGFydGVkAQUFY2hpbGQGCQESYXNzZXJ0Tm90Q2FuY2VsbGVkAQUFY2hpbGQDCQAAAgUBcwUBcwMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEKb3duZXJTdG9yZQEFBWNoaWxkCQACAQIUZGVuaWVkLiBub3QgYW4gb3duZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARFjYW5jZWxIZWlnaHRTdG9yZQEFBWNoaWxkBQZIRUlHSFQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQp1bmRvSW52ZXN0AQVjaGlsZAQGcGF1c2VkCQEHYWxsb3dlZAECCnVuZG9JbnZlc3QDCQAAAgUGcGF1c2VkBQZwYXVzZWQEAXMJARBhc3NlcnROb3RTdGFydGVkAQUFY2hpbGQDCQAAAgUBcwUBcwQRaW52ZXN0bWVudHNTdG9yZTEJAQ1pbnZlc3RvclN0b3JlAgUFY2hpbGQJAKUIAQgFAWkGY2FsbGVyBAtpbnZlc3RtZW50cwkBC3ZhbHVlT3JFbHNlAgkAnwgBBRFpbnZlc3RtZW50c1N0b3JlMQAAAwkAAAIFC2ludmVzdG1lbnRzAAAJAAIBAg5ubyBpbnZlc3RtZW50cwkAzAgCCQELRGVsZXRlRW50cnkBBRFpbnZlc3RtZW50c1N0b3JlMQkAzAgCCQEIY2hhbmdlQnkCCQEVaW52ZXN0bWVudHNUb3RhbFN0b3JlAQUFY2hpbGQJAQEtAQULaW52ZXN0bWVudHMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtpbnZlc3RtZW50cwkBEGludmVzdG1lbnRzVG9rZW4BBQVjaGlsZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXVuZG9Db21taXRGb3ICBWNoaWxkB2FkZHJlc3MEBnBhdXNlZAkBB2FsbG93ZWQBAg11bmRvQ29tbWl0Rm9yAwkAAAIFBnBhdXNlZAUGcGF1c2VkAwkBASEBCQEIY29udGFpbnMCBQ1tYWluQWRkcmVzc2VzCQClCAEIBQFpBmNhbGxlcgkAAgECBmRlbmllZAQBcwkBEGFzc2VydE5vdFN0YXJ0ZWQBBQVjaGlsZAMJAAACBQFzBQFzBA51c2VyU2tpblN0b3JlMQkBDXVzZXJTa2luU3RvcmUCBQVjaGlsZAUHYWRkcmVzcwQEc2tpbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ51c2VyU2tpblN0b3JlMQAAAwkAAAIFBHNraW4AAAkAAgECB25vIHNraW4JAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBBQ51c2VyU2tpblN0b3JlMQkAzAgCCQEIY2hhbmdlQnkCCQEOc2tpblRvdGFsU3RvcmUBBQVjaGlsZAkBAS0BBQRza2luCQDMCAIJAQhjaGFuZ2VCeQIFDXB3clRvdGFsU3RvcmUJAQEtAQUEc2tpbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBHNraW4FCnB3ckFzc2V0SWQFA25pbAUEc2tpbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQl1c2VyUG93ZXICBWNoaWxkBHVzZXIJAJQKAgUDbmlsCQELdmFsdWVPckVsc2UCCQEOdXNlckNvbW1pdG1lbnQCBQVjaGlsZAUEdXNlcgAAAWkBCnRvdGFsUG93ZXIBBWNoaWxkCQCUCgIFA25pbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAQ5za2luVG90YWxTdG9yZQEFBWNoaWxkAht0b3RhbFBvd2VyOiBjaGlsZCBub3QgZm91bmQBaQEEaW5pdAEEY29uZgkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIFEmNvbmZpZ0FkZHJlc3NTdG9yZQUEY29uZgUDbmlsAHKlyJo=", "chainId": 84, "height": 2786632, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | func writeConstString (key,value) = if (!(isDefined(getString(this, key)))) | |
5 | + | then StringEntry(key, value) | |
6 | + | else throw(("already initialized: " + key)) | |
7 | + | ||
8 | + | ||
9 | + | func writeInt (key,value) = if ((0 > value)) | |
10 | + | then throw(((("writing negative value " + toString(value)) + " for key ") + key)) | |
11 | + | else IntegerEntry(key, value) | |
12 | + | ||
13 | + | ||
14 | + | func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value)) | |
15 | + | ||
16 | + | ||
17 | + | func asInt (value) = match value { | |
18 | + | case int: Int => | |
19 | + | int | |
20 | + | case _ => | |
21 | + | throw("wrong type, expected: Int") | |
22 | + | } | |
23 | + | ||
24 | + | ||
25 | + | func assetId (str) = if ((str == "WAVES")) | |
26 | + | then unit | |
27 | + | else fromBase58String(str) | |
28 | + | ||
29 | + | ||
30 | + | let configAddressStore = "config" | |
31 | + | ||
32 | + | let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "children: config address not found")), "invalid config address") | |
33 | + | ||
34 | + | func allowed (op) = invoke(configAddress, "opAllowed", [op], nil) | |
35 | + | ||
36 | + | ||
37 | + | let HEIGHT = height | |
38 | + | ||
39 | + | let pwrAssetId = fromBase58String(valueOrErrorMessage(getString(configAddress, "powerAssetId"), "pwr asset id not found")) | |
40 | + | ||
41 | + | let slashers = valueOrElse(getString(configAddress, (toString(this) + "_slashers")), "") | |
42 | + | ||
43 | + | let mainAddresses = valueOrElse(getString(configAddress, "main_addresses"), "") | |
44 | + | ||
45 | + | func periodStore (child) = ("period_" + child) | |
46 | + | ||
47 | + | ||
48 | + | func period (child) = valueOrElse(getInteger(periodStore(child)), 0) | |
49 | + | ||
50 | + | ||
51 | + | func ownerStore (child) = ("owner_" + child) | |
52 | + | ||
53 | + | ||
54 | + | func treasuryStore (child) = ("treasury_" + child) | |
55 | + | ||
56 | + | ||
57 | + | func lockTimeStore (child) = ("lockTime_" + child) | |
58 | + | ||
59 | + | ||
60 | + | func periodLockTimeStore (child,period) = ((("period_" + toString(period)) + "_lockTime_") + child) | |
61 | + | ||
62 | + | ||
63 | + | func skinRequiredStore (child) = ("skin_required_" + child) | |
64 | + | ||
65 | + | ||
66 | + | func skinMaxStore (child) = ("skin_max_" + child) | |
67 | + | ||
68 | + | ||
69 | + | func investmentsMaxStore (child) = ("investments_max_" + child) | |
70 | + | ||
71 | + | ||
72 | + | func minCommitmentStore (child) = ("min_commitment" + child) | |
73 | + | ||
74 | + | ||
75 | + | func skinTotalStore (child) = ("skin_total_" + child) | |
76 | + | ||
77 | + | ||
78 | + | let pwrTotalStore = "pwr_total" | |
79 | + | ||
80 | + | func investmentsRequiredStore (child) = ("investments_required_" + child) | |
81 | + | ||
82 | + | ||
83 | + | func investmentsTotalStore (child) = ("investments_total_" + child) | |
84 | + | ||
85 | + | ||
86 | + | func investmentsPeriodTotalStore (child) = ((("period_" + toString(period(child))) + "_investments_total_") + child) | |
87 | + | ||
88 | + | ||
89 | + | func investmentsTokenStore (child) = ("investments_token_" + child) | |
90 | + | ||
91 | + | ||
92 | + | func commitmentsStore (child) = ("commitments_" + child) | |
93 | + | ||
94 | + | ||
95 | + | func createHeightStore (child) = ("create_height_" + child) | |
96 | + | ||
97 | + | ||
98 | + | func startHeightStore (child) = ("start_height_" + child) | |
99 | + | ||
100 | + | ||
101 | + | func startPeriodHeightStore (child,period) = ((("period_" + toString(period)) + "_start_height_") + child) | |
102 | + | ||
103 | + | ||
104 | + | func startPeriodAfterHeightStore (child,period) = ((("period_" + toString(period)) + "_start_after_height_") + child) | |
105 | + | ||
106 | + | ||
107 | + | func startCurrentPeriodHeightStore (child) = startPeriodHeightStore(child, period(child)) | |
108 | + | ||
109 | + | ||
110 | + | func cancelHeightStore (child) = ("cancel_height_" + child) | |
111 | + | ||
112 | + | ||
113 | + | func investmentsToken (child) = assetId(valueOrErrorMessage(getString(investmentsTokenStore(child)), "investments asset id not found")) | |
114 | + | ||
115 | + | ||
116 | + | func userSkinStore (child,user) = ((("skin_" + child) + "_") + user) | |
117 | + | ||
118 | + | ||
119 | + | func userSkinHistoryStore (child,user) = (userSkinStore(child, user) + "_history") | |
120 | + | ||
121 | + | ||
122 | + | func investorStore (child,investor) = ((("investor_" + child) + "_") + investor) | |
123 | + | ||
124 | + | ||
125 | + | func assertNotStarted (child) = if (isDefined(getInteger(startHeightStore(child)))) | |
126 | + | then throw("already started") | |
127 | + | else false | |
128 | + | ||
129 | + | ||
130 | + | func assertNotCancelled (child) = if (isDefined(getInteger(cancelHeightStore(child)))) | |
131 | + | then throw("already canceled") | |
132 | + | else false | |
133 | + | ||
134 | + | ||
135 | + | func assertNotStartedPeriod (child) = if ((period(child) == 0)) | |
136 | + | then assertNotStarted(child) | |
137 | + | else if (isDefined(getInteger(startCurrentPeriodHeightStore(child)))) | |
138 | + | then throw("period already started") | |
139 | + | else false | |
140 | + | ||
141 | + | ||
142 | + | func userCommitment (child,user) = getInteger(userSkinStore(child, user)) | |
143 | + | ||
144 | + | ||
145 | + | func currentUserSkin (child,user) = valueOrElse(userCommitment(child, user), 0) | |
146 | + | ||
147 | + | ||
148 | + | func lockTime (child,period) = valueOrElse(getInteger(periodLockTimeStore(child, period)), valueOrErrorMessage(getInteger(lockTimeStore(child)), "no child lockTime")) | |
149 | + | ||
150 | + | ||
151 | + | func unlockHeight (child) = { | |
152 | + | let p = period(child) | |
153 | + | let periodStart = getInteger(startPeriodHeightStore(child, p)) | |
154 | + | if (isDefined(periodStart)) | |
155 | + | then (value(periodStart) + lockTime(child, p)) | |
156 | + | else { | |
157 | + | let prevPeriod = (p - 1) | |
158 | + | let childStart = valueOrErrorMessage(getInteger(startHeightStore(child)), "no child start height") | |
159 | + | (valueOrElse(getInteger(startPeriodHeightStore(child, prevPeriod)), childStart) + lockTime(child, prevPeriod)) | |
160 | + | } | |
161 | + | } | |
162 | + | ||
163 | + | ||
164 | + | func treasury (child) = valueOrElse(getString(treasuryStore(child)), child) | |
165 | + | ||
166 | + | ||
167 | + | func int (key) = toString(valueOrElse(getInteger(key), 0)) | |
168 | + | ||
169 | + | ||
170 | + | func str (key) = valueOrElse(getString(key), "") | |
171 | + | ||
172 | + | ||
173 | + | func adviseProject (child) = { | |
174 | + | let p = period(child) | |
175 | + | let periodStr = toString(p) | |
176 | + | ((((((((((((((((((((((((((((((((((((((((((((((((((("height: " + toString(HEIGHT)) + ", project: ") + child) + ", owner: ") + str(ownerStore(child))) + ", treasury: ") + treasury(child)) + ", lock_time: ") + int(lockTimeStore(child))) + ", skin_required: ") + int(skinRequiredStore(child))) + ", skin_max: ") + int(skinMaxStore(child))) + ", min_commitment: ") + int(minCommitmentStore(child))) + ", skin_total: ") + int(skinTotalStore(child))) + ", investments_required: ") + int(investmentsRequiredStore(child))) + ", investments_max: ") + int(investmentsMaxStore(child))) + ", investments_total: ") + int(investmentsTotalStore(child))) + ", investments_token: ") + str(investmentsTokenStore(child))) + ", commitments: ") + str(commitmentsStore(child))) + ", create_height: ") + int(createHeightStore(child))) + ", start_height: ") + toString(valueOrElse(getInteger(startHeightStore(child)), -1))) + ", cancel_height: ") + toString(valueOrElse(getInteger(cancelHeightStore(child)), -1))) + ", period: ") + periodStr) + ", period_") + periodStr) + "_start_after_height: ") + toString(valueOrElse(getInteger(startPeriodAfterHeightStore(child, p)), -1))) + ", period_") + periodStr) + "_start_height: ") + toString(valueOrElse(getInteger(startCurrentPeriodHeightStore(child)), -1))) + ", period_") + periodStr) + "_lock_time: ") + toString(lockTime(child, p))) + ", unlock_height: ") + toString(unlockHeight(child))) + ", period_investments_total: ") + int(investmentsPeriodTotalStore(child))) | |
177 | + | } | |
178 | + | ||
179 | + | ||
180 | + | func adviseUserProject (child,user) = ((((((((("height: " + toString(HEIGHT)) + ", project: ") + child) + ", skin:") + toString(currentUserSkin(child, user))) + ", power:") + toString(valueOrElse(userCommitment(child, user), 0))) + ", investments: ") + int(investorStore(child, user))) | |
181 | + | ||
182 | + | ||
183 | + | @Callable(i) | |
184 | + | func projectFor (owner,skin,maxSkin,minCommitment,lockTime,investments,maxInvestments,investmentsToken,commitments,child) = { | |
185 | + | let a = allowed("projectFor") | |
186 | + | if ((a == a)) | |
187 | + | then if (!(contains(mainAddresses, toString(i.caller)))) | |
188 | + | then throw("denied") | |
189 | + | else { | |
190 | + | let t = valueOrErrorMessage(addressFromString(child), "invalid treasury address") | |
191 | + | if ((t == t)) | |
192 | + | then { | |
193 | + | let token = assetId(investmentsToken) | |
194 | + | if ((token == token)) | |
195 | + | then if (if ((maxSkin > 0)) | |
196 | + | then (skin > maxSkin) | |
197 | + | else false) | |
198 | + | then throw("invalid maxSkin") | |
199 | + | else if (if ((maxInvestments > 0)) | |
200 | + | then (investments > maxInvestments) | |
201 | + | else false) | |
202 | + | then throw("invalid maxInvestments") | |
203 | + | else [writeConstString(ownerStore(child), owner), writeInt(createHeightStore(child), HEIGHT), writeInt(skinRequiredStore(child), skin), writeInt(skinMaxStore(child), maxSkin), writeInt(minCommitmentStore(child), minCommitment), writeInt(lockTimeStore(child), lockTime), writeInt(investmentsRequiredStore(child), investments), writeConstString(investmentsTokenStore(child), investmentsToken), writeConstString(commitmentsStore(child), commitments), writeConstString(treasuryStore(child), child), writeInt(investmentsMaxStore(child), maxInvestments)] | |
204 | + | else throw("Strict value is not equal to itself.") | |
205 | + | } | |
206 | + | else throw("Strict value is not equal to itself.") | |
207 | + | } | |
208 | + | else throw("Strict value is not equal to itself.") | |
209 | + | } | |
210 | + | ||
211 | + | ||
212 | + | ||
213 | + | @Callable(i) | |
214 | + | func increraseSkin (child,skinIncrement) = { | |
215 | + | let a = allowed("increraseSkin") | |
216 | + | if ((a == a)) | |
217 | + | then { | |
218 | + | let s = if (assertNotStarted(child)) | |
219 | + | then assertNotCancelled(child) | |
220 | + | else false | |
221 | + | if ((s == s)) | |
222 | + | then if ((0 >= skinIncrement)) | |
223 | + | then throw("invalid argument: skinIncrement should be positive") | |
224 | + | else { | |
225 | + | let owner = getStringValue(ownerStore(child)) | |
226 | + | if ((toString(i.caller) != owner)) | |
227 | + | then throw("denied") | |
228 | + | else [changeBy(skinRequiredStore(child), skinIncrement)] | |
229 | + | } | |
230 | + | else throw("Strict value is not equal to itself.") | |
231 | + | } | |
232 | + | else throw("Strict value is not equal to itself.") | |
233 | + | } | |
234 | + | ||
235 | + | ||
236 | + | ||
237 | + | @Callable(i) | |
238 | + | func commitFor (child,address) = { | |
239 | + | let a = allowed("commitFor") | |
240 | + | if ((a == a)) | |
241 | + | then { | |
242 | + | let s = assertNotStartedPeriod(child) | |
243 | + | if ((s == s)) | |
244 | + | then { | |
245 | + | let p = i.payments[0] | |
246 | + | if ((p.assetId != pwrAssetId)) | |
247 | + | then throw("invalid attached payment: $power token expected") | |
248 | + | else { | |
249 | + | let commitment = p.amount | |
250 | + | let minCommitment = valueOrErrorMessage(getInteger(minCommitmentStore(child)), "Child DAO not found") | |
251 | + | if ((minCommitment > commitment)) | |
252 | + | then throw(("Min. commitment is " + toString(minCommitment))) | |
253 | + | else { | |
254 | + | let skinTotalStore1 = skinTotalStore(child) | |
255 | + | let newSkinTotal = (valueOrElse(getInteger(skinTotalStore1), 0) + commitment) | |
256 | + | let skinMax = valueOrElse(getInteger(skinMaxStore(child)), 0) | |
257 | + | if (if ((skinMax > 0)) | |
258 | + | then (newSkinTotal > skinMax) | |
259 | + | else false) | |
260 | + | then throw(("Total max. skin is reached: " + toString(skinMax))) | |
261 | + | else [changeBy(userSkinStore(child, address), commitment), IntegerEntry(skinTotalStore1, newSkinTotal), changeBy(pwrTotalStore, commitment)] | |
262 | + | } | |
263 | + | } | |
264 | + | } | |
265 | + | else throw("Strict value is not equal to itself.") | |
266 | + | } | |
267 | + | else throw("Strict value is not equal to itself.") | |
268 | + | } | |
269 | + | ||
270 | + | ||
271 | + | ||
272 | + | @Callable(i) | |
273 | + | func commitForMiner (child,address) = { | |
274 | + | let a = allowed("commitForMiner") | |
275 | + | if ((a == a)) | |
276 | + | then if (!(contains(mainAddresses, toString(i.caller)))) | |
277 | + | then throw("denied") | |
278 | + | else { | |
279 | + | let p = i.payments[0] | |
280 | + | if (if ((p.assetId != pwrAssetId)) | |
281 | + | then true | |
282 | + | else (size(i.payments) != 1)) | |
283 | + | then throw("invalid payments: only $power token expected") | |
284 | + | else { | |
285 | + | let commitment = p.amount | |
286 | + | [changeBy(userSkinStore(child, address), commitment), changeBy(skinTotalStore(child), commitment), changeBy(pwrTotalStore, commitment)] | |
287 | + | } | |
288 | + | } | |
289 | + | else throw("Strict value is not equal to itself.") | |
290 | + | } | |
291 | + | ||
292 | + | ||
293 | + | ||
294 | + | @Callable(i) | |
295 | + | func invest (child) = { | |
296 | + | let a = allowed("invest") | |
297 | + | if ((a == a)) | |
298 | + | then { | |
299 | + | let s = assertNotStartedPeriod(child) | |
300 | + | if ((s == s)) | |
301 | + | then { | |
302 | + | let token = investmentsToken(child) | |
303 | + | if ((i.payments[0].assetId != token)) | |
304 | + | then throw("invalid investments asset id") | |
305 | + | else { | |
306 | + | let amount = i.payments[0].amount | |
307 | + | let maximum = valueOrElse(getInteger(investmentsMaxStore(child)), 0) | |
308 | + | func datas (a) = [changeBy(investorStore(child, toString(i.caller)), a), changeBy(investmentsTotalStore(child), a), changeBy(investmentsPeriodTotalStore(child), a)] | |
309 | + | ||
310 | + | if ((maximum > 0)) | |
311 | + | then { | |
312 | + | let totalStore = investmentsTotalStore(child) | |
313 | + | let total = valueOrElse(getInteger(totalStore), 0) | |
314 | + | let investmens = min([amount, (maximum - total)]) | |
315 | + | if ((0 >= investmens)) | |
316 | + | then throw(("Total max. investments is reached: " + toString(maximum))) | |
317 | + | else { | |
318 | + | let chargeBack = (amount - investmens) | |
319 | + | if ((chargeBack > 0)) | |
320 | + | then [ScriptTransfer(i.caller, chargeBack, token), datas(investmens)] | |
321 | + | else datas(investmens) | |
322 | + | } | |
323 | + | } | |
324 | + | else datas(amount) | |
325 | + | } | |
326 | + | } | |
327 | + | else throw("Strict value is not equal to itself.") | |
328 | + | } | |
329 | + | else throw("Strict value is not equal to itself.") | |
330 | + | } | |
331 | + | ||
332 | + | ||
333 | + | ||
334 | + | @Callable(i) | |
335 | + | func start (child) = { | |
336 | + | let paused = allowed("start") | |
337 | + | if ((paused == paused)) | |
338 | + | then { | |
339 | + | let s = if (assertNotStarted(child)) | |
340 | + | then assertNotCancelled(child) | |
341 | + | else false | |
342 | + | if ((s == s)) | |
343 | + | then { | |
344 | + | let totalSkin = valueOrElse(getInteger(skinTotalStore(child)), 0) | |
345 | + | let skinRequired = valueOrErrorMessage(getInteger(skinRequiredStore(child)), "child not registered") | |
346 | + | if ((skinRequired > totalSkin)) | |
347 | + | then throw("not enough skin in the game") | |
348 | + | else { | |
349 | + | let totalInvestments = valueOrElse(getInteger(investmentsTotalStore(child)), 0) | |
350 | + | if ((getIntegerValue(investmentsRequiredStore(child)) > totalInvestments)) | |
351 | + | then throw("not enough investments") | |
352 | + | else [IntegerEntry(startHeightStore(child), HEIGHT), ScriptTransfer(addressFromStringValue(treasury(child)), totalInvestments, investmentsToken(child))] | |
353 | + | } | |
354 | + | } | |
355 | + | else throw("Strict value is not equal to itself.") | |
356 | + | } | |
357 | + | else throw("Strict value is not equal to itself.") | |
358 | + | } | |
359 | + | ||
360 | + | ||
361 | + | ||
362 | + | @Callable(i) | |
363 | + | func initNextPeriod (child,blockBetweenPeriods,lockTime) = { | |
364 | + | let paused = allowed("initNextPeriod") | |
365 | + | if ((paused == paused)) | |
366 | + | then if (if ((toString(i.caller) != getStringValue(ownerStore(child)))) | |
367 | + | then (i.caller != this) | |
368 | + | else false) | |
369 | + | then throw("denied") | |
370 | + | else if ((0 > blockBetweenPeriods)) | |
371 | + | then throw("blockBetweenPeriods should be positive or zero") | |
372 | + | else if ((1 > lockTime)) | |
373 | + | then throw("lockTime should be positive") | |
374 | + | else { | |
375 | + | let unlockHeight_ = unlockHeight(child) | |
376 | + | if ((unlockHeight_ > HEIGHT)) | |
377 | + | then throw("current period is still active") | |
378 | + | else { | |
379 | + | let p = period(child) | |
380 | + | if (if ((p > 0)) | |
381 | + | then !(isDefined(startPeriodHeightStore(child, p))) | |
382 | + | else false) | |
383 | + | then throw("next period already initialized") | |
384 | + | else { | |
385 | + | let newPeriod = (p + 1) | |
386 | + | [IntegerEntry(periodStore(child), newPeriod), IntegerEntry(startPeriodAfterHeightStore(child, newPeriod), (unlockHeight_ + blockBetweenPeriods)), IntegerEntry(periodLockTimeStore(child, newPeriod), lockTime)] | |
387 | + | } | |
388 | + | } | |
389 | + | } | |
390 | + | else throw("Strict value is not equal to itself.") | |
391 | + | } | |
392 | + | ||
393 | + | ||
394 | + | ||
395 | + | @Callable(i) | |
396 | + | func startPeriod (child) = { | |
397 | + | let paused = allowed("startPeriod") | |
398 | + | if ((paused == paused)) | |
399 | + | then { | |
400 | + | let s = assertNotStartedPeriod(child) | |
401 | + | if ((s == s)) | |
402 | + | then { | |
403 | + | let period_ = period(child) | |
404 | + | let startAfterStore = startPeriodAfterHeightStore(child, period_) | |
405 | + | let startAfter = valueOrErrorMessage(getInteger(startAfterStore), ("key not found: " + startAfterStore)) | |
406 | + | if ((startAfter > HEIGHT)) | |
407 | + | then throw("too early") | |
408 | + | else { | |
409 | + | let totalSkin = valueOrElse(getInteger(skinTotalStore(child)), 0) | |
410 | + | let skinRequired = valueOrErrorMessage(getInteger(skinRequiredStore(child)), "child not registered") | |
411 | + | if ((skinRequired > totalSkin)) | |
412 | + | then throw("not enough skin in the game") | |
413 | + | else { | |
414 | + | let periodInvestments = valueOrElse(getInteger(investmentsPeriodTotalStore(child)), 0) | |
415 | + | [IntegerEntry(startCurrentPeriodHeightStore(child), HEIGHT), ScriptTransfer(addressFromStringValue(child), periodInvestments, investmentsToken(child))] | |
416 | + | } | |
417 | + | } | |
418 | + | } | |
419 | + | else throw("Strict value is not equal to itself.") | |
420 | + | } | |
421 | + | else throw("Strict value is not equal to itself.") | |
422 | + | } | |
423 | + | ||
424 | + | ||
425 | + | ||
426 | + | @Callable(i) | |
427 | + | func slash (child,amount) = { | |
428 | + | let paused = allowed("/") | |
429 | + | if ((paused == paused)) | |
430 | + | then if (!(contains(slashers, toString(i.caller)))) | |
431 | + | then throw("denied") | |
432 | + | else if (!(isDefined(getInteger(startHeightStore(child))))) | |
433 | + | then throw("not started") | |
434 | + | else [changeBy(skinTotalStore(child), -(amount)), Burn(pwrAssetId, amount)] | |
435 | + | else throw("Strict value is not equal to itself.") | |
436 | + | } | |
437 | + | ||
438 | + | ||
439 | + | ||
440 | + | @Callable(i) | |
441 | + | func complete (child) = { | |
442 | + | let paused = allowed("complete") | |
443 | + | if ((paused == paused)) | |
444 | + | then { | |
445 | + | let unlockHeight_ = unlockHeight(child) | |
446 | + | if ((unlockHeight_ > HEIGHT)) | |
447 | + | then throw("still locked") | |
448 | + | else { | |
449 | + | let user = toString(i.caller) | |
450 | + | let skin = currentUserSkin(child, user) | |
451 | + | if ((skin == 0)) | |
452 | + | then throw("you had no skin in the game") | |
453 | + | else { | |
454 | + | let total = getIntegerValue(skinTotalStore(child)) | |
455 | + | [ScriptTransfer(i.caller, skin, pwrAssetId), DeleteEntry(userSkinStore(child, user)), changeBy(skinTotalStore(child), -(skin)), changeBy(pwrTotalStore, -(skin)), IntegerEntry(userSkinHistoryStore(child, user), skin)] | |
456 | + | } | |
457 | + | } | |
458 | + | } | |
459 | + | else throw("Strict value is not equal to itself.") | |
460 | + | } | |
461 | + | ||
462 | + | ||
463 | + | ||
464 | + | @Callable(i) | |
465 | + | func cancel (child) = { | |
466 | + | let paused = allowed("cancel") | |
467 | + | if ((paused == paused)) | |
468 | + | then { | |
469 | + | let s = if (assertNotStarted(child)) | |
470 | + | then true | |
471 | + | else assertNotCancelled(child) | |
472 | + | if ((s == s)) | |
473 | + | then if ((toString(i.caller) != getStringValue(ownerStore(child)))) | |
474 | + | then throw("denied. not an owner") | |
475 | + | else [IntegerEntry(cancelHeightStore(child), HEIGHT)] | |
476 | + | else throw("Strict value is not equal to itself.") | |
477 | + | } | |
478 | + | else throw("Strict value is not equal to itself.") | |
479 | + | } | |
480 | + | ||
481 | + | ||
482 | + | ||
483 | + | @Callable(i) | |
484 | + | func undoInvest (child) = { | |
485 | + | let paused = allowed("undoInvest") | |
486 | + | if ((paused == paused)) | |
487 | + | then { | |
488 | + | let s = assertNotStarted(child) | |
489 | + | if ((s == s)) | |
490 | + | then { | |
491 | + | let investmentsStore1 = investorStore(child, toString(i.caller)) | |
492 | + | let investments = valueOrElse(getInteger(investmentsStore1), 0) | |
493 | + | if ((investments == 0)) | |
494 | + | then throw("no investments") | |
495 | + | else [DeleteEntry(investmentsStore1), changeBy(investmentsTotalStore(child), -(investments)), ScriptTransfer(i.caller, investments, investmentsToken(child))] | |
496 | + | } | |
497 | + | else throw("Strict value is not equal to itself.") | |
498 | + | } | |
499 | + | else throw("Strict value is not equal to itself.") | |
500 | + | } | |
501 | + | ||
502 | + | ||
503 | + | ||
504 | + | @Callable(i) | |
505 | + | func undoCommitFor (child,address) = { | |
506 | + | let paused = allowed("undoCommitFor") | |
507 | + | if ((paused == paused)) | |
508 | + | then if (!(contains(mainAddresses, toString(i.caller)))) | |
509 | + | then throw("denied") | |
510 | + | else { | |
511 | + | let s = assertNotStarted(child) | |
512 | + | if ((s == s)) | |
513 | + | then { | |
514 | + | let userSkinStore1 = userSkinStore(child, address) | |
515 | + | let skin = valueOrElse(getInteger(userSkinStore1), 0) | |
516 | + | if ((skin == 0)) | |
517 | + | then throw("no skin") | |
518 | + | else $Tuple2([DeleteEntry(userSkinStore1), changeBy(skinTotalStore(child), -(skin)), changeBy(pwrTotalStore, -(skin)), ScriptTransfer(i.caller, skin, pwrAssetId)], skin) | |
519 | + | } | |
520 | + | else throw("Strict value is not equal to itself.") | |
521 | + | } | |
522 | + | else throw("Strict value is not equal to itself.") | |
523 | + | } | |
524 | + | ||
525 | + | ||
526 | + | ||
527 | + | @Callable(i) | |
528 | + | func userPower (child,user) = $Tuple2(nil, valueOrElse(userCommitment(child, user), 0)) | |
529 | + | ||
530 | + | ||
531 | + | ||
532 | + | @Callable(i) | |
533 | + | func totalPower (child) = $Tuple2(nil, valueOrErrorMessage(getInteger(skinTotalStore(child)), "totalPower: child not found")) | |
534 | + | ||
535 | + | ||
536 | + | ||
537 | + | @Callable(i) | |
538 | + | func init (conf) = [writeConstString(configAddressStore, conf)] | |
539 | + | ||
540 | + |
github/deemru/w8io/fabc49c 31.74 ms ◑