tx · mpWiQ8WiKfHDQK1nxjaSEZA5xcuTdD6DA1EdSvi3gJ6

3PBLPmkM3ThytNj6QeJyLTX154if8S6Cea5:  -0.01800000 Waves

2023.11.09 18:12 [3901808] smart account 3PBLPmkM3ThytNj6QeJyLTX154if8S6Cea5 > SELF 0.00000000 Waves

{ "type": 13, "id": "mpWiQ8WiKfHDQK1nxjaSEZA5xcuTdD6DA1EdSvi3gJ6", "fee": 1800000, "feeAssetId": null, "timestamp": 1699542818959, "version": 1, "sender": "3PBLPmkM3ThytNj6QeJyLTX154if8S6Cea5", "senderPublicKey": "4EgWP2ePsBhKdAXQtnLEV8kwUiDaJmz4McAiVAS4CVjo", "proofs": [ "4X8XANzi1CqyE4aTdNLhzsCkDm2BskrMEqJorH9JvWyQzsjZeP5NDkfAh67Va1ztHFPcn7osVVyoj3BebhpTM8o2" ], "script": "base64:BgJ2CAISDAoKCAEBAQEBAQgICBIECgIIARIECgIICBIECgIICBIECgIICBIFCgMICAESAwoBCBIDCgEIEgMKAQgSBQoDCAEBEgMKAQgSBAoCCAESBAoCCAgSAwoBCBIDCgEIEgQKAggIEgQKAggIEgMKAQgSAwoBCDkBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEId3JpdGVJbnQCA2tleQV2YWx1ZQMJAGYCAAAFBXZhbHVlCQACAQkArAICCQCsAgIJAKwCAgIXd3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSAJAKQDAQUFdmFsdWUCCSBmb3Iga2V5IAUDa2V5CQEMSW50ZWdlckVudHJ5AgUDa2V5BQV2YWx1ZQEIY2hhbmdlQnkCA2tleQV2YWx1ZQkBCHdyaXRlSW50AgUDa2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAUFdmFsdWUBBWFzSW50AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAFA2ludAkAAgECGXdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBB2Fzc2V0SWQBA3N0cgMJAAACBQNzdHICBVdBVkVTBQR1bml0CQDZBAEFA3N0cgASY29uZmlnQWRkcmVzc1N0b3JlAgZjb25maWcADWNvbmZpZ0FkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUSY29uZmlnQWRkcmVzc1N0b3JlAiJjaGlsZHJlbjogY29uZmlnIGFkZHJlc3Mgbm90IGZvdW5kAhZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzAQdhbGxvd2VkAQJvcAkA/AcEBQ1jb25maWdBZGRyZXNzAglvcEFsbG93ZWQJAMwIAgUCb3AFA25pbAUDbmlsAAZIRUlHSFQFBmhlaWdodAAKcHdyQXNzZXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIMcG93ZXJBc3NldElkAhZwd3IgYXNzZXQgaWQgbm90IGZvdW5kAAhzbGFzaGVycwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzCQCsAgIJAKUIAQUEdGhpcwIJX3NsYXNoZXJzAgAADW1haW5BZGRyZXNzZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIObWFpbl9hZGRyZXNzZXMCAAELcGVyaW9kU3RvcmUBBWNoaWxkCQCsAgICB3BlcmlvZF8FBWNoaWxkAQZwZXJpb2QBBWNoaWxkCQELdmFsdWVPckVsc2UCCQCfCAEJAQtwZXJpb2RTdG9yZQEFBWNoaWxkAAABCm93bmVyU3RvcmUBBWNoaWxkCQCsAgICBm93bmVyXwUFY2hpbGQBDXRyZWFzdXJ5U3RvcmUBBWNoaWxkCQCsAgICCXRyZWFzdXJ5XwUFY2hpbGQBDWxvY2tUaW1lU3RvcmUBBWNoaWxkCQCsAgICCWxvY2tUaW1lXwUFY2hpbGQBE3BlcmlvZExvY2tUaW1lU3RvcmUCBWNoaWxkBnBlcmlvZAkArAICCQCsAgIJAKwCAgIHcGVyaW9kXwkApAMBBQZwZXJpb2QCCl9sb2NrVGltZV8FBWNoaWxkARFza2luUmVxdWlyZWRTdG9yZQEFY2hpbGQJAKwCAgIOc2tpbl9yZXF1aXJlZF8FBWNoaWxkAQxza2luTWF4U3RvcmUBBWNoaWxkCQCsAgICCXNraW5fbWF4XwUFY2hpbGQBE2ludmVzdG1lbnRzTWF4U3RvcmUBBWNoaWxkCQCsAgICEGludmVzdG1lbnRzX21heF8FBWNoaWxkARJtaW5Db21taXRtZW50U3RvcmUBBWNoaWxkCQCsAgICDm1pbl9jb21taXRtZW50BQVjaGlsZAEOc2tpblRvdGFsU3RvcmUBBWNoaWxkCQCsAgICC3NraW5fdG90YWxfBQVjaGlsZAANcHdyVG90YWxTdG9yZQIJcHdyX3RvdGFsARhpbnZlc3RtZW50c1JlcXVpcmVkU3RvcmUBBWNoaWxkCQCsAgICFWludmVzdG1lbnRzX3JlcXVpcmVkXwUFY2hpbGQBFWludmVzdG1lbnRzVG90YWxTdG9yZQEFY2hpbGQJAKwCAgISaW52ZXN0bWVudHNfdG90YWxfBQVjaGlsZAEbaW52ZXN0bWVudHNQZXJpb2RUb3RhbFN0b3JlAQVjaGlsZAkArAICCQCsAgIJAKwCAgIHcGVyaW9kXwkApAMBCQEGcGVyaW9kAQUFY2hpbGQCE19pbnZlc3RtZW50c190b3RhbF8FBWNoaWxkARVpbnZlc3RtZW50c1Rva2VuU3RvcmUBBWNoaWxkCQCsAgICEmludmVzdG1lbnRzX3Rva2VuXwUFY2hpbGQBEGNvbW1pdG1lbnRzU3RvcmUBBWNoaWxkCQCsAgICDGNvbW1pdG1lbnRzXwUFY2hpbGQBEWNyZWF0ZUhlaWdodFN0b3JlAQVjaGlsZAkArAICAg5jcmVhdGVfaGVpZ2h0XwUFY2hpbGQBEHN0YXJ0SGVpZ2h0U3RvcmUBBWNoaWxkCQCsAgICDXN0YXJ0X2hlaWdodF8FBWNoaWxkARZzdGFydFBlcmlvZEhlaWdodFN0b3JlAgVjaGlsZAZwZXJpb2QJAKwCAgkArAICCQCsAgICB3BlcmlvZF8JAKQDAQUGcGVyaW9kAg5fc3RhcnRfaGVpZ2h0XwUFY2hpbGQBG3N0YXJ0UGVyaW9kQWZ0ZXJIZWlnaHRTdG9yZQIFY2hpbGQGcGVyaW9kCQCsAgIJAKwCAgkArAICAgdwZXJpb2RfCQCkAwEFBnBlcmlvZAIUX3N0YXJ0X2FmdGVyX2hlaWdodF8FBWNoaWxkAR1zdGFydEN1cnJlbnRQZXJpb2RIZWlnaHRTdG9yZQEFY2hpbGQJARZzdGFydFBlcmlvZEhlaWdodFN0b3JlAgUFY2hpbGQJAQZwZXJpb2QBBQVjaGlsZAERY2FuY2VsSGVpZ2h0U3RvcmUBBWNoaWxkCQCsAgICDmNhbmNlbF9oZWlnaHRfBQVjaGlsZAEQaW52ZXN0bWVudHNUb2tlbgEFY2hpbGQJAQdhc3NldElkAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARVpbnZlc3RtZW50c1Rva2VuU3RvcmUBBQVjaGlsZAIeaW52ZXN0bWVudHMgYXNzZXQgaWQgbm90IGZvdW5kAQ11c2VyU2tpblN0b3JlAgVjaGlsZAR1c2VyCQCsAgIJAKwCAgkArAICAgVza2luXwUFY2hpbGQCAV8FBHVzZXIBGXVzZXJTa2luVW5sb2NrUGVyaW9kU3RvcmUCBWNoaWxkBHVzZXIJAKwCAgkArAICCQCsAgICE3NraW5fdW5sb2NrX3BlcmlvZF8FBWNoaWxkAgFfBQR1c2VyARt1c2VyU2tpbkV4aXRlZEluUGVyaW9kU3RvcmUDBWNoaWxkBHVzZXIGcGVyaW9kCQCsAgIJAKwCAgkArAICCQENdXNlclNraW5TdG9yZQIFBWNoaWxkBQR1c2VyAghfcGVyaW9kXwkApAMBBQZwZXJpb2QCB19leGl0ZWQBDWludmVzdG9yU3RvcmUCBWNoaWxkCGludmVzdG9yCQCsAgIJAKwCAgkArAICAglpbnZlc3Rvcl8FBWNoaWxkAgFfBQhpbnZlc3RvcgEZY29tbWl0QWZ0ZXJBZGRyZXNzZXNTdG9yZQEFY2hpbGQJAKwCAgIXY29tbWl0X2FmdGVyX2FkZHJlc3Nlc18FBWNoaWxkARVpbnZlc3RBZnRlclN0YXJ0U3RvcmUBBWNoaWxkCQCsAgICF2Nhbl9pbnZlc3RfYWZ0ZXJfc3RhcnRfBQVjaGlsZAEQYXNzZXJ0Tm90U3RhcnRlZAEFY2hpbGQDCQEJaXNEZWZpbmVkAQkAnwgBCQEQc3RhcnRIZWlnaHRTdG9yZQEFBWNoaWxkCQACAQIPYWxyZWFkeSBzdGFydGVkBwEPYXNzZXJ0SXNTdGFydGVkAQVjaGlsZAMJAAACCQEJaXNEZWZpbmVkAQkAnwgBCQEQc3RhcnRIZWlnaHRTdG9yZQEFBWNoaWxkBwkAAgECD25vdCB5ZXQgc3RhcnRlZAcBEmFzc2VydE5vdENhbmNlbGxlZAEFY2hpbGQDCQEJaXNEZWZpbmVkAQkAnwgBCQERY2FuY2VsSGVpZ2h0U3RvcmUBBQVjaGlsZAkAAgECEGFscmVhZHkgY2FuY2VsZWQHARZhc3NlcnROb3RTdGFydGVkUGVyaW9kAQVjaGlsZAMJAAACCQEGcGVyaW9kAQUFY2hpbGQAAAkBEGFzc2VydE5vdFN0YXJ0ZWQBBQVjaGlsZAMJAQlpc0RlZmluZWQBCQCfCAEJAR1zdGFydEN1cnJlbnRQZXJpb2RIZWlnaHRTdG9yZQEFBWNoaWxkCQACAQIWcGVyaW9kIGFscmVhZHkgc3RhcnRlZAcBDnVzZXJDb21taXRtZW50AgVjaGlsZAR1c2VyCQCfCAEJAQ11c2VyU2tpblN0b3JlAgUFY2hpbGQFBHVzZXIBD2N1cnJlbnRVc2VyU2tpbgIFY2hpbGQEdXNlcgkBC3ZhbHVlT3JFbHNlAgkBDnVzZXJDb21taXRtZW50AgUFY2hpbGQFBHVzZXIAAAEIbG9ja1RpbWUCBWNoaWxkBnBlcmlvZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETcGVyaW9kTG9ja1RpbWVTdG9yZQIFBWNoaWxkBQZwZXJpb2QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQENbG9ja1RpbWVTdG9yZQEFBWNoaWxkAhFubyBjaGlsZCBsb2NrVGltZQEPY29tcGxldGVkUGVyaW9kAQVjaGlsZAQBcAkBBnBlcmlvZAEFBWNoaWxkAwkAAAIFAXAAAAAABAtwZXJpb2RTdGFydAkAnwgBCQEWc3RhcnRQZXJpb2RIZWlnaHRTdG9yZQIFBWNoaWxkBQFwAwkBCWlzRGVmaW5lZAEFC3BlcmlvZFN0YXJ0BQFwCQBlAgUBcAABAQx1bmxvY2tIZWlnaHQBBWNoaWxkBAFwCQEPY29tcGxldGVkUGVyaW9kAQUFY2hpbGQECmNoaWxkU3RhcnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQEQc3RhcnRIZWlnaHRTdG9yZQEFBWNoaWxkAhVubyBjaGlsZCBzdGFydCBoZWlnaHQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEJARZzdGFydFBlcmlvZEhlaWdodFN0b3JlAgUFY2hpbGQFAXAFCmNoaWxkU3RhcnQJAQhsb2NrVGltZQIFBWNoaWxkBQFwAQh0cmVhc3VyeQEFY2hpbGQJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBDXRyZWFzdXJ5U3RvcmUBBQVjaGlsZAUFY2hpbGQBA2ludAEDa2V5CQCkAwEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUDa2V5AAABA3N0cgEDa2V5CQELdmFsdWVPckVsc2UCCQCiCAEFA2tleQIAAQ1hZHZpc2VQcm9qZWN0AQVjaGlsZAQBcAkBBnBlcmlvZAEFBWNoaWxkBAlwZXJpb2RTdHIJAKQDAQUBcAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIIaGVpZ2h0OiAJAKQDAQUGSEVJR0hUAgssIHByb2plY3Q6IAUFY2hpbGQCCSwgb3duZXI6IAkBA3N0cgEJAQpvd25lclN0b3JlAQUFY2hpbGQCDCwgdHJlYXN1cnk6IAkBCHRyZWFzdXJ5AQUFY2hpbGQCDSwgbG9ja190aW1lOiAJAQNpbnQBCQENbG9ja1RpbWVTdG9yZQEFBWNoaWxkAhEsIHNraW5fcmVxdWlyZWQ6IAkBA2ludAEJARFza2luUmVxdWlyZWRTdG9yZQEFBWNoaWxkAgwsIHNraW5fbWF4OiAJAQNpbnQBCQEMc2tpbk1heFN0b3JlAQUFY2hpbGQCEiwgbWluX2NvbW1pdG1lbnQ6IAkBA2ludAEJARJtaW5Db21taXRtZW50U3RvcmUBBQVjaGlsZAIOLCBza2luX3RvdGFsOiAJAQNpbnQBCQEOc2tpblRvdGFsU3RvcmUBBQVjaGlsZAIYLCBpbnZlc3RtZW50c19yZXF1aXJlZDogCQEDaW50AQkBGGludmVzdG1lbnRzUmVxdWlyZWRTdG9yZQEFBWNoaWxkAhMsIGludmVzdG1lbnRzX21heDogCQEDaW50AQkBE2ludmVzdG1lbnRzTWF4U3RvcmUBBQVjaGlsZAIVLCBpbnZlc3RtZW50c190b3RhbDogCQEDaW50AQkBFWludmVzdG1lbnRzVG90YWxTdG9yZQEFBWNoaWxkAhUsIGludmVzdG1lbnRzX3Rva2VuOiAJAQNzdHIBCQEVaW52ZXN0bWVudHNUb2tlblN0b3JlAQUFY2hpbGQCDywgY29tbWl0bWVudHM6IAkBA3N0cgEJARBjb21taXRtZW50c1N0b3JlAQUFY2hpbGQCESwgY3JlYXRlX2hlaWdodDogCQEDaW50AQkBEWNyZWF0ZUhlaWdodFN0b3JlAQUFY2hpbGQCECwgc3RhcnRfaGVpZ2h0OiAJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEQc3RhcnRIZWlnaHRTdG9yZQEFBWNoaWxkAP///////////wECESwgY2FuY2VsX2hlaWdodDogCQCkAwEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEWNhbmNlbEhlaWdodFN0b3JlAQUFY2hpbGQA////////////AQIKLCBwZXJpb2Q6IAUJcGVyaW9kU3RyAgksIHBlcmlvZF8FCXBlcmlvZFN0cgIVX3N0YXJ0X2FmdGVyX2hlaWdodDogCQCkAwEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBG3N0YXJ0UGVyaW9kQWZ0ZXJIZWlnaHRTdG9yZQIFBWNoaWxkBQFwAP///////////wECCSwgcGVyaW9kXwUJcGVyaW9kU3RyAg9fc3RhcnRfaGVpZ2h0OiAJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEdc3RhcnRDdXJyZW50UGVyaW9kSGVpZ2h0U3RvcmUBBQVjaGlsZAD///////////8BAgksIHBlcmlvZF8FCXBlcmlvZFN0cgIMX2xvY2tfdGltZTogCQCkAwEJAQhsb2NrVGltZQIFBWNoaWxkBQFwAhEsIHVubG9ja19oZWlnaHQ6IAkApAMBCQEMdW5sb2NrSGVpZ2h0AQUFY2hpbGQCHCwgcGVyaW9kX2ludmVzdG1lbnRzX3RvdGFsOiAJAQNpbnQBCQEbaW52ZXN0bWVudHNQZXJpb2RUb3RhbFN0b3JlAQUFY2hpbGQBEWFkdmlzZVVzZXJQcm9qZWN0AgVjaGlsZAR1c2VyCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAghoZWlnaHQ6IAkApAMBBQZIRUlHSFQCCywgcHJvamVjdDogBQVjaGlsZAIHLCBza2luOgkApAMBCQEPY3VycmVudFVzZXJTa2luAgUFY2hpbGQFBHVzZXICCCwgcG93ZXI6CQCkAwEJAQt2YWx1ZU9yRWxzZQIJAQ51c2VyQ29tbWl0bWVudAIFBWNoaWxkBQR1c2VyAAACDywgaW52ZXN0bWVudHM6IAkBA2ludAEJAQ1pbnZlc3RvclN0b3JlAgUFY2hpbGQFBHVzZXIBG2NvbW1pdEFmdGVyU3RhcnRGb3JJbnRlcm5hbAQBaQVjaGlsZAdhZGRyZXNzFGFkZGl0aW9uYWxMb2NrUm91bmRzBAFhCQEHYWxsb3dlZAECE2NvbW1pdEFmdGVyU3RhcnRGb3IDCQAAAgUBYQUBYQMJAGYCAAAFFGFkZGl0aW9uYWxMb2NrUm91bmRzCQACAQIcaW52YWxpZCBhZGRpdGlvbmFsTG9ja1JvdW5kcwMJAQEhAQkBCGNvbnRhaW5zAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEZY29tbWl0QWZ0ZXJBZGRyZXNzZXNTdG9yZQEFBWNoaWxkAgAJAKUIAQgFAWkGY2FsbGVyCQACAQIGZGVuaWVkBAFwCQCRAwIIBQFpCHBheW1lbnRzAAADAwkBAiE9AggFAXAHYXNzZXRJZAUKcHdyQXNzZXRJZAYJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECKmludmFsaWQgcGF5bWVudHM6IG9ubHkgJFBXUiB0b2tlbiBleHBlY3RlZAQKY29tbWl0bWVudAgFAXAGYW1vdW50BARjbWRzCQDMCAIJAQhjaGFuZ2VCeQIJAQ11c2VyU2tpblN0b3JlAgUFY2hpbGQFB2FkZHJlc3MFCmNvbW1pdG1lbnQJAMwIAgkBCGNoYW5nZUJ5AgkBDnNraW5Ub3RhbFN0b3JlAQUFY2hpbGQFCmNvbW1pdG1lbnQJAMwIAgkBCGNoYW5nZUJ5AgUNcHdyVG90YWxTdG9yZQUKY29tbWl0bWVudAUDbmlsAwkAZgIFFGFkZGl0aW9uYWxMb2NrUm91bmRzAAAEC3VubG9ja1JvdW5kCQBkAgkBBnBlcmlvZAEFBWNoaWxkBRRhZGRpdGlvbmFsTG9ja1JvdW5kcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGXVzZXJTa2luVW5sb2NrUGVyaW9kU3RvcmUCBQVjaGlsZAUHYWRkcmVzcwULdW5sb2NrUm91bmQFBGNtZHMFBGNtZHMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4TAWkBCnByb2plY3RGb3IKBW93bmVyBHNraW4HbWF4U2tpbg1taW5Db21taXRtZW50CGxvY2tUaW1lC2ludmVzdG1lbnRzDm1heEludmVzdG1lbnRzEGludmVzdG1lbnRzVG9rZW4LY29tbWl0bWVudHMFY2hpbGQEAWEJAQdhbGxvd2VkAQIKcHJvamVjdEZvcgMJAAACBQFhBQFhAwkBASEBCQEIY29udGFpbnMCBQ1tYWluQWRkcmVzc2VzCQClCAEIBQFpBmNhbGxlcgkAAgECBmRlbmllZAQBdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBWNoaWxkAhhpbnZhbGlkIHRyZWFzdXJ5IGFkZHJlc3MDCQAAAgUBdAUBdAQFdG9rZW4JAQdhc3NldElkAQUQaW52ZXN0bWVudHNUb2tlbgMJAAACBQV0b2tlbgUFdG9rZW4DAwkAZgIFB21heFNraW4AAAkAZgIFBHNraW4FB21heFNraW4HCQACAQIPaW52YWxpZCBtYXhTa2luAwMJAGYCBQ5tYXhJbnZlc3RtZW50cwAACQBmAgULaW52ZXN0bWVudHMFDm1heEludmVzdG1lbnRzBwkAAgECFmludmFsaWQgbWF4SW52ZXN0bWVudHMJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCCQEKb3duZXJTdG9yZQEFBWNoaWxkBQVvd25lcgkAzAgCCQEId3JpdGVJbnQCCQERY3JlYXRlSGVpZ2h0U3RvcmUBBQVjaGlsZAUGSEVJR0hUCQDMCAIJAQh3cml0ZUludAIJARFza2luUmVxdWlyZWRTdG9yZQEFBWNoaWxkBQRza2luCQDMCAIJAQh3cml0ZUludAIJAQxza2luTWF4U3RvcmUBBQVjaGlsZAUHbWF4U2tpbgkAzAgCCQEId3JpdGVJbnQCCQESbWluQ29tbWl0bWVudFN0b3JlAQUFY2hpbGQFDW1pbkNvbW1pdG1lbnQJAMwIAgkBCHdyaXRlSW50AgkBDWxvY2tUaW1lU3RvcmUBBQVjaGlsZAUIbG9ja1RpbWUJAMwIAgkBCHdyaXRlSW50AgkBGGludmVzdG1lbnRzUmVxdWlyZWRTdG9yZQEFBWNoaWxkBQtpbnZlc3RtZW50cwkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIJARVpbnZlc3RtZW50c1Rva2VuU3RvcmUBBQVjaGlsZAUQaW52ZXN0bWVudHNUb2tlbgkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIJARBjb21taXRtZW50c1N0b3JlAQUFY2hpbGQFC2NvbW1pdG1lbnRzCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgkBDXRyZWFzdXJ5U3RvcmUBBQVjaGlsZAUFY2hpbGQJAMwIAgkBCHdyaXRlSW50AgkBE2ludmVzdG1lbnRzTWF4U3RvcmUBBQVjaGlsZAUObWF4SW52ZXN0bWVudHMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1pbmNyZXJhc2VTa2luAgVjaGlsZA1za2luSW5jcmVtZW50BAFhCQEHYWxsb3dlZAECDWluY3JlcmFzZVNraW4DCQAAAgUBYQUBYQQBcwMJARBhc3NlcnROb3RTdGFydGVkAQUFY2hpbGQJARJhc3NlcnROb3RDYW5jZWxsZWQBBQVjaGlsZAcDCQAAAgUBcwUBcwMJAGcCAAAFDXNraW5JbmNyZW1lbnQJAAIBAjJpbnZhbGlkIGFyZ3VtZW50OiBza2luSW5jcmVtZW50IHNob3VsZCBiZSBwb3NpdGl2ZQQFb3duZXIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAQpvd25lclN0b3JlAQUFY2hpbGQDCQECIT0CCQClCAEIBQFpBmNhbGxlcgUFb3duZXIJAAIBAgZkZW5pZWQJAMwIAgkBCGNoYW5nZUJ5AgkBEXNraW5SZXF1aXJlZFN0b3JlAQUFY2hpbGQFDXNraW5JbmNyZW1lbnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQljb21taXRGb3ICBWNoaWxkB2FkZHJlc3MEAWEJAQdhbGxvd2VkAQIJY29tbWl0Rm9yAwkAAAIFAWEFAWEEAXMJARZhc3NlcnROb3RTdGFydGVkUGVyaW9kAQUFY2hpbGQDCQAAAgUBcwUBcwQBcAkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFAXAHYXNzZXRJZAUKcHdyQXNzZXRJZAkAAgECL2ludmFsaWQgYXR0YWNoZWQgcGF5bWVudDogJHBvd2VyIHRva2VuIGV4cGVjdGVkBApjb21taXRtZW50CAUBcAZhbW91bnQEDW1pbkNvbW1pdG1lbnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQESbWluQ29tbWl0bWVudFN0b3JlAQUFY2hpbGQCE0NoaWxkIERBTyBub3QgZm91bmQDCQBmAgUNbWluQ29tbWl0bWVudAUKY29tbWl0bWVudAkAAgEJAKwCAgITTWluLiBjb21taXRtZW50IGlzIAkApAMBBQ1taW5Db21taXRtZW50BA9za2luVG90YWxTdG9yZTEJAQ5za2luVG90YWxTdG9yZQEFBWNoaWxkBAxuZXdTa2luVG90YWwJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFD3NraW5Ub3RhbFN0b3JlMQAABQpjb21taXRtZW50BAdza2luTWF4CQELdmFsdWVPckVsc2UCCQCfCAEJAQxza2luTWF4U3RvcmUBBQVjaGlsZAAAAwMJAGYCBQdza2luTWF4AAAJAGYCBQxuZXdTa2luVG90YWwFB3NraW5NYXgHCQACAQkArAICAhxUb3RhbCBtYXguIHNraW4gaXMgcmVhY2hlZDogCQCkAwEFB3NraW5NYXgJAMwIAgkBCGNoYW5nZUJ5AgkBDXVzZXJTa2luU3RvcmUCBQVjaGlsZAUHYWRkcmVzcwUKY29tbWl0bWVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPc2tpblRvdGFsU3RvcmUxBQxuZXdTa2luVG90YWwJAMwIAgkBCGNoYW5nZUJ5AgUNcHdyVG90YWxTdG9yZQUKY29tbWl0bWVudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNvbW1pdEZvck1pbmVyAgVjaGlsZAdhZGRyZXNzBAFhCQEHYWxsb3dlZAECDmNvbW1pdEZvck1pbmVyAwkAAAIFAWEFAWEDCQEBIQEJAQhjb250YWlucwIFDW1haW5BZGRyZXNzZXMJAKUIAQgFAWkGY2FsbGVyCQACAQIGZGVuaWVkBAFwCQCRAwIIBQFpCHBheW1lbnRzAAADAwkBAiE9AggFAXAHYXNzZXRJZAUKcHdyQXNzZXRJZAYJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECKmludmFsaWQgcGF5bWVudHM6IG9ubHkgJFBXUiB0b2tlbiBleHBlY3RlZAQKY29tbWl0bWVudAgFAXAGYW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIJAQ11c2VyU2tpblN0b3JlAgUFY2hpbGQFB2FkZHJlc3MFCmNvbW1pdG1lbnQJAMwIAgkBCGNoYW5nZUJ5AgkBDnNraW5Ub3RhbFN0b3JlAQUFY2hpbGQFCmNvbW1pdG1lbnQJAMwIAgkBCGNoYW5nZUJ5AgUNcHdyVG90YWxTdG9yZQUKY29tbWl0bWVudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2NvbW1pdEFmdGVyU3RhcnRGb3ICBWNoaWxkB2FkZHJlc3MJARtjb21taXRBZnRlclN0YXJ0Rm9ySW50ZXJuYWwEBQFpBQVjaGlsZAUHYWRkcmVzcwAAAWkBIGNvbW1pdEFmdGVyU3RhcnRXaXRoTG9ja1JvdW5kRm9yAwVjaGlsZAdhZGRyZXNzFGFkZGl0aW9uYWxMb2NrUm91bmRzCQEbY29tbWl0QWZ0ZXJTdGFydEZvckludGVybmFsBAUBaQUFY2hpbGQFB2FkZHJlc3MFFGFkZGl0aW9uYWxMb2NrUm91bmRzAWkBBmludmVzdAEFY2hpbGQEAWEJAQdhbGxvd2VkAQIGaW52ZXN0AwkAAAIFAWEFAWEEAXMJARZhc3NlcnROb3RTdGFydGVkUGVyaW9kAQUFY2hpbGQDCQAAAgUBcwUBcwQFdG9rZW4JARBpbnZlc3RtZW50c1Rva2VuAQUFY2hpbGQDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFBXRva2VuCQACAQIcaW52YWxpZCBpbnZlc3RtZW50cyBhc3NldCBpZAQGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQHbWF4aW11bQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETaW52ZXN0bWVudHNNYXhTdG9yZQEFBWNoaWxkAAAKAQVkYXRhcwEBYQkAzAgCCQEIY2hhbmdlQnkCCQENaW52ZXN0b3JTdG9yZQIFBWNoaWxkCQClCAEIBQFpBmNhbGxlcgUBYQkAzAgCCQEIY2hhbmdlQnkCCQEVaW52ZXN0bWVudHNUb3RhbFN0b3JlAQUFY2hpbGQFAWEJAMwIAgkBCGNoYW5nZUJ5AgkBG2ludmVzdG1lbnRzUGVyaW9kVG90YWxTdG9yZQEFBWNoaWxkBQFhBQNuaWwDCQBmAgUHbWF4aW11bQAABAp0b3RhbFN0b3JlCQEVaW52ZXN0bWVudHNUb3RhbFN0b3JlAQUFY2hpbGQEBXRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFCnRvdGFsU3RvcmUAAAQKaW52ZXN0bWVucwkAlwMBCQDMCAIFBmFtb3VudAkAzAgCCQBlAgUHbWF4aW11bQUFdG90YWwFA25pbAMJAGcCAAAFCmludmVzdG1lbnMJAAIBCQCsAgICI1RvdGFsIG1heC4gaW52ZXN0bWVudHMgaXMgcmVhY2hlZDogCQCkAwEFB21heGltdW0ECmNoYXJnZUJhY2sJAGUCBQZhbW91bnQFCmludmVzdG1lbnMDCQBmAgUKY2hhcmdlQmFjawAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKY2hhcmdlQmFjawUFdG9rZW4JAQVkYXRhcwEFCmludmVzdG1lbnMJAQVkYXRhcwEFCmludmVzdG1lbnMJAQVkYXRhcwEFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBpbnZlc3RBZnRlclN0YXJ0AQVjaGlsZAQBYQkBB2FsbG93ZWQBAhBpbnZlc3RBZnRlclN0YXJ0AwkAAAIFAWEFAWEDCQAAAgkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEVaW52ZXN0QWZ0ZXJTdGFydFN0b3JlAQUFY2hpbGQHBwkAAgECGWRlbmllZCAoaW52ZXN0QWZ0ZXJTdGFydCkEAXMJAQ9hc3NlcnRJc1N0YXJ0ZWQBBQVjaGlsZAMJAAACBQFzBQFzAwkAZgIJAQZwZXJpb2QBBQVjaGlsZAAACQACAQIWaW5pdGlhbCByb3VuZCBpcyBlbmRlZAQFdG9rZW4JARBpbnZlc3RtZW50c1Rva2VuAQUFY2hpbGQDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFBXRva2VuCQACAQIcaW52YWxpZCBpbnZlc3RtZW50cyBhc3NldCBpZAQGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEIY2hhbmdlQnkCCQENaW52ZXN0b3JTdG9yZQIFBWNoaWxkCQClCAEIBQFpBmNhbGxlcgUGYW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIJARVpbnZlc3RtZW50c1RvdGFsU3RvcmUBBQVjaGlsZAUGYW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIJARtpbnZlc3RtZW50c1BlcmlvZFRvdGFsU3RvcmUBBQVjaGlsZAUGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQh0cmVhc3VyeQEFBWNoaWxkBQZhbW91bnQJARBpbnZlc3RtZW50c1Rva2VuAQUFY2hpbGQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFydAEFY2hpbGQEBnBhdXNlZAkBB2FsbG93ZWQBAgVzdGFydAMJAAACBQZwYXVzZWQFBnBhdXNlZAQBcwMJARBhc3NlcnROb3RTdGFydGVkAQUFY2hpbGQJARJhc3NlcnROb3RDYW5jZWxsZWQBBQVjaGlsZAcDCQAAAgUBcwUBcwQJdG90YWxTa2luCQELdmFsdWVPckVsc2UCCQCfCAEJAQ5za2luVG90YWxTdG9yZQEFBWNoaWxkAAAEDHNraW5SZXF1aXJlZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJARFza2luUmVxdWlyZWRTdG9yZQEFBWNoaWxkAhRjaGlsZCBub3QgcmVnaXN0ZXJlZAMJAGYCBQxza2luUmVxdWlyZWQFCXRvdGFsU2tpbgkAAgECG25vdCBlbm91Z2ggc2tpbiBpbiB0aGUgZ2FtZQQQdG90YWxJbnZlc3RtZW50cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEVaW52ZXN0bWVudHNUb3RhbFN0b3JlAQUFY2hpbGQAAAMJAGYCCQERQGV4dHJOYXRpdmUoMTA1NSkBCQEYaW52ZXN0bWVudHNSZXF1aXJlZFN0b3JlAQUFY2hpbGQFEHRvdGFsSW52ZXN0bWVudHMJAAIBAhZub3QgZW5vdWdoIGludmVzdG1lbnRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQc3RhcnRIZWlnaHRTdG9yZQEFBWNoaWxkBQZIRUlHSFQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBCHRyZWFzdXJ5AQUFY2hpbGQFEHRvdGFsSW52ZXN0bWVudHMJARBpbnZlc3RtZW50c1Rva2VuAQUFY2hpbGQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5pbml0TmV4dFBlcmlvZAMFY2hpbGQTYmxvY2tCZXR3ZWVuUGVyaW9kcwhsb2NrVGltZQQGcGF1c2VkCQEHYWxsb3dlZAECDmluaXROZXh0UGVyaW9kAwkAAAIFBnBhdXNlZAUGcGF1c2VkAwMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEKb3duZXJTdG9yZQEFBWNoaWxkCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMHCQACAQIGZGVuaWVkAwkAZgIAAAUTYmxvY2tCZXR3ZWVuUGVyaW9kcwkAAgECLmJsb2NrQmV0d2VlblBlcmlvZHMgc2hvdWxkIGJlIHBvc2l0aXZlIG9yIHplcm8DCQBmAgABBQhsb2NrVGltZQkAAgECG2xvY2tUaW1lIHNob3VsZCBiZSBwb3NpdGl2ZQQNdW5sb2NrSGVpZ2h0XwkBDHVubG9ja0hlaWdodAEFBWNoaWxkAwkAZgIFDXVubG9ja0hlaWdodF8FBkhFSUdIVAkAAgECHmN1cnJlbnQgcGVyaW9kIGlzIHN0aWxsIGFjdGl2ZQQBcAkBBnBlcmlvZAEFBWNoaWxkAwMJAGYCBQFwAAAJAQEhAQkBCWlzRGVmaW5lZAEJARZzdGFydFBlcmlvZEhlaWdodFN0b3JlAgUFY2hpbGQFAXAHCQACAQIfbmV4dCBwZXJpb2QgYWxyZWFkeSBpbml0aWFsaXplZAQJbmV3UGVyaW9kCQBkAgUBcAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQELcGVyaW9kU3RvcmUBBQVjaGlsZAUJbmV3UGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEbc3RhcnRQZXJpb2RBZnRlckhlaWdodFN0b3JlAgUFY2hpbGQFCW5ld1BlcmlvZAkAZAIFDXVubG9ja0hlaWdodF8FE2Jsb2NrQmV0d2VlblBlcmlvZHMJAMwIAgkBDEludGVnZXJFbnRyeQIJARNwZXJpb2RMb2NrVGltZVN0b3JlAgUFY2hpbGQFCW5ld1BlcmlvZAUIbG9ja1RpbWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzdGFydFBlcmlvZAEFY2hpbGQEBnBhdXNlZAkBB2FsbG93ZWQBAgtzdGFydFBlcmlvZAMJAAACBQZwYXVzZWQFBnBhdXNlZAQBcwkBFmFzc2VydE5vdFN0YXJ0ZWRQZXJpb2QBBQVjaGlsZAMJAAACBQFzBQFzBAdwZXJpb2RfCQEGcGVyaW9kAQUFY2hpbGQED3N0YXJ0QWZ0ZXJTdG9yZQkBG3N0YXJ0UGVyaW9kQWZ0ZXJIZWlnaHRTdG9yZQIFBWNoaWxkBQdwZXJpb2RfBApzdGFydEFmdGVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUPc3RhcnRBZnRlclN0b3JlCQCsAgICD2tleSBub3QgZm91bmQ6IAUPc3RhcnRBZnRlclN0b3JlAwkAZgIFCnN0YXJ0QWZ0ZXIFBkhFSUdIVAkAAgECCXRvbyBlYXJseQQJdG90YWxTa2luCQELdmFsdWVPckVsc2UCCQCfCAEJAQ5za2luVG90YWxTdG9yZQEFBWNoaWxkAAAEDHNraW5SZXF1aXJlZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJARFza2luUmVxdWlyZWRTdG9yZQEFBWNoaWxkAhRjaGlsZCBub3QgcmVnaXN0ZXJlZAMJAGYCBQxza2luUmVxdWlyZWQFCXRvdGFsU2tpbgkAAgECG25vdCBlbm91Z2ggc2tpbiBpbiB0aGUgZ2FtZQQRcGVyaW9kSW52ZXN0bWVudHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBG2ludmVzdG1lbnRzUGVyaW9kVG90YWxTdG9yZQEFBWNoaWxkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAR1zdGFydEN1cnJlbnRQZXJpb2RIZWlnaHRTdG9yZQEFBWNoaWxkBQZIRUlHSFQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUFY2hpbGQFEXBlcmlvZEludmVzdG1lbnRzCQEQaW52ZXN0bWVudHNUb2tlbgEFBWNoaWxkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFc2xhc2gCBWNoaWxkBmFtb3VudAQGcGF1c2VkCQEHYWxsb3dlZAECAS8DCQAAAgUGcGF1c2VkBQZwYXVzZWQDCQEBIQEJAQhjb250YWlucwIFCHNsYXNoZXJzCQClCAEIBQFpBmNhbGxlcgkAAgECBmRlbmllZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJ8IAQkBEHN0YXJ0SGVpZ2h0U3RvcmUBBQVjaGlsZAkAAgECC25vdCBzdGFydGVkCQDMCAIJAQhjaGFuZ2VCeQIJAQ5za2luVG90YWxTdG9yZQEFBWNoaWxkCQEBLQEFBmFtb3VudAkAzAgCCQEEQnVybgIFCnB3ckFzc2V0SWQFBmFtb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2NvbXBsZXRlRm9yAgVjaGlsZAR1c2VyAwkBASEBCQEIY29udGFpbnMCBQ1tYWluQWRkcmVzc2VzCQClCAEIBQFpBmNhbGxlcgkAAgECBmRlbmllZAQNdW5sb2NrSGVpZ2h0XwkBDHVubG9ja0hlaWdodAEFBWNoaWxkAwkAZgIFDXVubG9ja0hlaWdodF8FBkhFSUdIVAkAAgECDHN0aWxsIGxvY2tlZAQLZW5kZWRQZXJpb2QJAQ9jb21wbGV0ZWRQZXJpb2QBBQVjaGlsZAQLdW5sb2NrUm91bmQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGXVzZXJTa2luVW5sb2NrUGVyaW9kU3RvcmUCBQVjaGlsZAUEdXNlcgAAAwkAZgIFC3VubG9ja1JvdW5kBQtlbmRlZFBlcmlvZAkAAgEJAKwCAgkArAICAhJ5b3UgY2FuIHVubG9jayBvbiAJAKQDAQULdW5sb2NrUm91bmQCBiByb3VuZAQEc2tpbgkBD2N1cnJlbnRVc2VyU2tpbgIFBWNoaWxkBQR1c2VyAwkAAAIFBHNraW4AAAkAAgECG3lvdSBoYWQgbm8gc2tpbiBpbiB0aGUgZ2FtZQkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUEc2tpbgUKcHdyQXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENdXNlclNraW5TdG9yZQIFBWNoaWxkBQR1c2VyCQDMCAIJAQhjaGFuZ2VCeQIJAQ5za2luVG90YWxTdG9yZQEFBWNoaWxkCQEBLQEFBHNraW4JAMwIAgkBCGNoYW5nZUJ5AgUNcHdyVG90YWxTdG9yZQkBAS0BBQRza2luCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEbdXNlclNraW5FeGl0ZWRJblBlcmlvZFN0b3JlAwUFY2hpbGQFBHVzZXIFC2VuZGVkUGVyaW9kBQRza2luBQNuaWwFBHNraW4BaQEGY2FuY2VsAQVjaGlsZAQGcGF1c2VkCQEHYWxsb3dlZAECBmNhbmNlbAMJAAACBQZwYXVzZWQFBnBhdXNlZAQBcwMJARBhc3NlcnROb3RTdGFydGVkAQUFY2hpbGQGCQESYXNzZXJ0Tm90Q2FuY2VsbGVkAQUFY2hpbGQDCQAAAgUBcwUBcwMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEKb3duZXJTdG9yZQEFBWNoaWxkCQACAQIUZGVuaWVkLiBub3QgYW4gb3duZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARFjYW5jZWxIZWlnaHRTdG9yZQEFBWNoaWxkBQZIRUlHSFQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQp1bmRvSW52ZXN0AQVjaGlsZAQGcGF1c2VkCQEHYWxsb3dlZAECCnVuZG9JbnZlc3QDCQAAAgUGcGF1c2VkBQZwYXVzZWQEAXMJARBhc3NlcnROb3RTdGFydGVkAQUFY2hpbGQDCQAAAgUBcwUBcwQRaW52ZXN0bWVudHNTdG9yZTEJAQ1pbnZlc3RvclN0b3JlAgUFY2hpbGQJAKUIAQgFAWkGY2FsbGVyBAtpbnZlc3RtZW50cwkBC3ZhbHVlT3JFbHNlAgkAnwgBBRFpbnZlc3RtZW50c1N0b3JlMQAAAwkAAAIFC2ludmVzdG1lbnRzAAAJAAIBAg5ubyBpbnZlc3RtZW50cwkAzAgCCQELRGVsZXRlRW50cnkBBRFpbnZlc3RtZW50c1N0b3JlMQkAzAgCCQEIY2hhbmdlQnkCCQEVaW52ZXN0bWVudHNUb3RhbFN0b3JlAQUFY2hpbGQJAQEtAQULaW52ZXN0bWVudHMJAMwIAgkBCGNoYW5nZUJ5AgkBG2ludmVzdG1lbnRzUGVyaW9kVG90YWxTdG9yZQEFBWNoaWxkCQEBLQEFC2ludmVzdG1lbnRzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULaW52ZXN0bWVudHMJARBpbnZlc3RtZW50c1Rva2VuAQUFY2hpbGQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ11bmRvQ29tbWl0Rm9yAgVjaGlsZAdhZGRyZXNzBAZwYXVzZWQJAQdhbGxvd2VkAQINdW5kb0NvbW1pdEZvcgMJAAACBQZwYXVzZWQFBnBhdXNlZAMJAQEhAQkBCGNvbnRhaW5zAgUNbWFpbkFkZHJlc3NlcwkApQgBCAUBaQZjYWxsZXIJAAIBAgZkZW5pZWQEAXMJARBhc3NlcnROb3RTdGFydGVkAQUFY2hpbGQDCQAAAgUBcwUBcwQOdXNlclNraW5TdG9yZTEJAQ11c2VyU2tpblN0b3JlAgUFY2hpbGQFB2FkZHJlc3MEBHNraW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdXNlclNraW5TdG9yZTEAAAMJAAACBQRza2luAAAJAAIBAgdubyBza2luCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQUOdXNlclNraW5TdG9yZTEJAMwIAgkBCGNoYW5nZUJ5AgkBDnNraW5Ub3RhbFN0b3JlAQUFY2hpbGQJAQEtAQUEc2tpbgkAzAgCCQEIY2hhbmdlQnkCBQ1wd3JUb3RhbFN0b3JlCQEBLQEFBHNraW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQRza2luBQpwd3JBc3NldElkBQNuaWwFBHNraW4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJdXNlclBvd2VyAgVjaGlsZAR1c2VyCQCUCgIFA25pbAkBC3ZhbHVlT3JFbHNlAgkBDnVzZXJDb21taXRtZW50AgUFY2hpbGQFBHVzZXIAAAFpAQp0b3RhbFBvd2VyAQVjaGlsZAkAlAoCBQNuaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQEOc2tpblRvdGFsU3RvcmUBBQVjaGlsZAIbdG90YWxQb3dlcjogY2hpbGQgbm90IGZvdW5kAWkBBGluaXQBBGNvbmYJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCBRJjb25maWdBZGRyZXNzU3RvcmUFBGNvbmYFA25pbAECdHgBBnZlcmlmeQADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAEg8GKHv9R16MlwabI242flIiL9OmGDBLo644vvHwqxRxuFVo+z", "chainId": 87, "height": 3901808, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: A4tWHUoQtnC53eb1FHM4fpR4mMKhXSkXhYYoFHkx733R Next: 619eRPj1JL33bmZL5q45gGjYjFDFu1MgsMiemyr3wfFf Diff:
OldNewDifferences
623623 func init (conf) = [writeConstString(configAddressStore, conf)]
624624
625625
626+@Verifier(tx)
627+func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
628+ then true
629+ else sigVerify(tx.bodyBytes, tx.proofs[0], base58'HBMzK5kHm3StNpmZvRDyiW2p7vvi1EaR3xNgjMV4t3Ye')
630+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
55 then StringEntry(key, value)
66 else throw(("already initialized: " + key))
77
88
99 func writeInt (key,value) = if ((0 > value))
1010 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
1111 else IntegerEntry(key, value)
1212
1313
1414 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
1515
1616
1717 func asInt (value) = match value {
1818 case int: Int =>
1919 int
2020 case _ =>
2121 throw("wrong type, expected: Int")
2222 }
2323
2424
2525 func assetId (str) = if ((str == "WAVES"))
2626 then unit
2727 else fromBase58String(str)
2828
2929
3030 let configAddressStore = "config"
3131
3232 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "children: config address not found")), "invalid config address")
3333
3434 func allowed (op) = invoke(configAddress, "opAllowed", [op], nil)
3535
3636
3737 let HEIGHT = height
3838
3939 let pwrAssetId = fromBase58String(valueOrErrorMessage(getString(configAddress, "powerAssetId"), "pwr asset id not found"))
4040
4141 let slashers = valueOrElse(getString(configAddress, (toString(this) + "_slashers")), "")
4242
4343 let mainAddresses = valueOrElse(getString(configAddress, "main_addresses"), "")
4444
4545 func periodStore (child) = ("period_" + child)
4646
4747
4848 func period (child) = valueOrElse(getInteger(periodStore(child)), 0)
4949
5050
5151 func ownerStore (child) = ("owner_" + child)
5252
5353
5454 func treasuryStore (child) = ("treasury_" + child)
5555
5656
5757 func lockTimeStore (child) = ("lockTime_" + child)
5858
5959
6060 func periodLockTimeStore (child,period) = ((("period_" + toString(period)) + "_lockTime_") + child)
6161
6262
6363 func skinRequiredStore (child) = ("skin_required_" + child)
6464
6565
6666 func skinMaxStore (child) = ("skin_max_" + child)
6767
6868
6969 func investmentsMaxStore (child) = ("investments_max_" + child)
7070
7171
7272 func minCommitmentStore (child) = ("min_commitment" + child)
7373
7474
7575 func skinTotalStore (child) = ("skin_total_" + child)
7676
7777
7878 let pwrTotalStore = "pwr_total"
7979
8080 func investmentsRequiredStore (child) = ("investments_required_" + child)
8181
8282
8383 func investmentsTotalStore (child) = ("investments_total_" + child)
8484
8585
8686 func investmentsPeriodTotalStore (child) = ((("period_" + toString(period(child))) + "_investments_total_") + child)
8787
8888
8989 func investmentsTokenStore (child) = ("investments_token_" + child)
9090
9191
9292 func commitmentsStore (child) = ("commitments_" + child)
9393
9494
9595 func createHeightStore (child) = ("create_height_" + child)
9696
9797
9898 func startHeightStore (child) = ("start_height_" + child)
9999
100100
101101 func startPeriodHeightStore (child,period) = ((("period_" + toString(period)) + "_start_height_") + child)
102102
103103
104104 func startPeriodAfterHeightStore (child,period) = ((("period_" + toString(period)) + "_start_after_height_") + child)
105105
106106
107107 func startCurrentPeriodHeightStore (child) = startPeriodHeightStore(child, period(child))
108108
109109
110110 func cancelHeightStore (child) = ("cancel_height_" + child)
111111
112112
113113 func investmentsToken (child) = assetId(valueOrErrorMessage(getString(investmentsTokenStore(child)), "investments asset id not found"))
114114
115115
116116 func userSkinStore (child,user) = ((("skin_" + child) + "_") + user)
117117
118118
119119 func userSkinUnlockPeriodStore (child,user) = ((("skin_unlock_period_" + child) + "_") + user)
120120
121121
122122 func userSkinExitedInPeriodStore (child,user,period) = (((userSkinStore(child, user) + "_period_") + toString(period)) + "_exited")
123123
124124
125125 func investorStore (child,investor) = ((("investor_" + child) + "_") + investor)
126126
127127
128128 func commitAfterAddressesStore (child) = ("commit_after_addresses_" + child)
129129
130130
131131 func investAfterStartStore (child) = ("can_invest_after_start_" + child)
132132
133133
134134 func assertNotStarted (child) = if (isDefined(getInteger(startHeightStore(child))))
135135 then throw("already started")
136136 else false
137137
138138
139139 func assertIsStarted (child) = if ((isDefined(getInteger(startHeightStore(child))) == false))
140140 then throw("not yet started")
141141 else false
142142
143143
144144 func assertNotCancelled (child) = if (isDefined(getInteger(cancelHeightStore(child))))
145145 then throw("already canceled")
146146 else false
147147
148148
149149 func assertNotStartedPeriod (child) = if ((period(child) == 0))
150150 then assertNotStarted(child)
151151 else if (isDefined(getInteger(startCurrentPeriodHeightStore(child))))
152152 then throw("period already started")
153153 else false
154154
155155
156156 func userCommitment (child,user) = getInteger(userSkinStore(child, user))
157157
158158
159159 func currentUserSkin (child,user) = valueOrElse(userCommitment(child, user), 0)
160160
161161
162162 func lockTime (child,period) = valueOrElse(getInteger(periodLockTimeStore(child, period)), valueOrErrorMessage(getInteger(lockTimeStore(child)), "no child lockTime"))
163163
164164
165165 func completedPeriod (child) = {
166166 let p = period(child)
167167 if ((p == 0))
168168 then 0
169169 else {
170170 let periodStart = getInteger(startPeriodHeightStore(child, p))
171171 if (isDefined(periodStart))
172172 then p
173173 else (p - 1)
174174 }
175175 }
176176
177177
178178 func unlockHeight (child) = {
179179 let p = completedPeriod(child)
180180 let childStart = valueOrErrorMessage(getInteger(startHeightStore(child)), "no child start height")
181181 (valueOrElse(getInteger(startPeriodHeightStore(child, p)), childStart) + lockTime(child, p))
182182 }
183183
184184
185185 func treasury (child) = valueOrElse(getString(treasuryStore(child)), child)
186186
187187
188188 func int (key) = toString(valueOrElse(getInteger(key), 0))
189189
190190
191191 func str (key) = valueOrElse(getString(key), "")
192192
193193
194194 func adviseProject (child) = {
195195 let p = period(child)
196196 let periodStr = toString(p)
197197 ((((((((((((((((((((((((((((((((((((((((((((((((((("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)))
198198 }
199199
200200
201201 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)))
202202
203203
204204 func commitAfterStartForInternal (i,child,address,additionalLockRounds) = {
205205 let a = allowed("commitAfterStartFor")
206206 if ((a == a))
207207 then if ((0 > additionalLockRounds))
208208 then throw("invalid additionalLockRounds")
209209 else if (!(contains(valueOrElse(getString(commitAfterAddressesStore(child)), ""), toString(i.caller))))
210210 then throw("denied")
211211 else {
212212 let p = i.payments[0]
213213 if (if ((p.assetId != pwrAssetId))
214214 then true
215215 else (size(i.payments) != 1))
216216 then throw("invalid payments: only $PWR token expected")
217217 else {
218218 let commitment = p.amount
219219 let cmds = [changeBy(userSkinStore(child, address), commitment), changeBy(skinTotalStore(child), commitment), changeBy(pwrTotalStore, commitment)]
220220 if ((additionalLockRounds > 0))
221221 then {
222222 let unlockRound = (period(child) + additionalLockRounds)
223223 IntegerEntry(userSkinUnlockPeriodStore(child, address), unlockRound) :: cmds
224224 }
225225 else cmds
226226 }
227227 }
228228 else throw("Strict value is not equal to itself.")
229229 }
230230
231231
232232 @Callable(i)
233233 func projectFor (owner,skin,maxSkin,minCommitment,lockTime,investments,maxInvestments,investmentsToken,commitments,child) = {
234234 let a = allowed("projectFor")
235235 if ((a == a))
236236 then if (!(contains(mainAddresses, toString(i.caller))))
237237 then throw("denied")
238238 else {
239239 let t = valueOrErrorMessage(addressFromString(child), "invalid treasury address")
240240 if ((t == t))
241241 then {
242242 let token = assetId(investmentsToken)
243243 if ((token == token))
244244 then if (if ((maxSkin > 0))
245245 then (skin > maxSkin)
246246 else false)
247247 then throw("invalid maxSkin")
248248 else if (if ((maxInvestments > 0))
249249 then (investments > maxInvestments)
250250 else false)
251251 then throw("invalid maxInvestments")
252252 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)]
253253 else throw("Strict value is not equal to itself.")
254254 }
255255 else throw("Strict value is not equal to itself.")
256256 }
257257 else throw("Strict value is not equal to itself.")
258258 }
259259
260260
261261
262262 @Callable(i)
263263 func increraseSkin (child,skinIncrement) = {
264264 let a = allowed("increraseSkin")
265265 if ((a == a))
266266 then {
267267 let s = if (assertNotStarted(child))
268268 then assertNotCancelled(child)
269269 else false
270270 if ((s == s))
271271 then if ((0 >= skinIncrement))
272272 then throw("invalid argument: skinIncrement should be positive")
273273 else {
274274 let owner = getStringValue(ownerStore(child))
275275 if ((toString(i.caller) != owner))
276276 then throw("denied")
277277 else [changeBy(skinRequiredStore(child), skinIncrement)]
278278 }
279279 else throw("Strict value is not equal to itself.")
280280 }
281281 else throw("Strict value is not equal to itself.")
282282 }
283283
284284
285285
286286 @Callable(i)
287287 func commitFor (child,address) = {
288288 let a = allowed("commitFor")
289289 if ((a == a))
290290 then {
291291 let s = assertNotStartedPeriod(child)
292292 if ((s == s))
293293 then {
294294 let p = i.payments[0]
295295 if ((p.assetId != pwrAssetId))
296296 then throw("invalid attached payment: $power token expected")
297297 else {
298298 let commitment = p.amount
299299 let minCommitment = valueOrErrorMessage(getInteger(minCommitmentStore(child)), "Child DAO not found")
300300 if ((minCommitment > commitment))
301301 then throw(("Min. commitment is " + toString(minCommitment)))
302302 else {
303303 let skinTotalStore1 = skinTotalStore(child)
304304 let newSkinTotal = (valueOrElse(getInteger(skinTotalStore1), 0) + commitment)
305305 let skinMax = valueOrElse(getInteger(skinMaxStore(child)), 0)
306306 if (if ((skinMax > 0))
307307 then (newSkinTotal > skinMax)
308308 else false)
309309 then throw(("Total max. skin is reached: " + toString(skinMax)))
310310 else [changeBy(userSkinStore(child, address), commitment), IntegerEntry(skinTotalStore1, newSkinTotal), changeBy(pwrTotalStore, commitment)]
311311 }
312312 }
313313 }
314314 else throw("Strict value is not equal to itself.")
315315 }
316316 else throw("Strict value is not equal to itself.")
317317 }
318318
319319
320320
321321 @Callable(i)
322322 func commitForMiner (child,address) = {
323323 let a = allowed("commitForMiner")
324324 if ((a == a))
325325 then if (!(contains(mainAddresses, toString(i.caller))))
326326 then throw("denied")
327327 else {
328328 let p = i.payments[0]
329329 if (if ((p.assetId != pwrAssetId))
330330 then true
331331 else (size(i.payments) != 1))
332332 then throw("invalid payments: only $PWR token expected")
333333 else {
334334 let commitment = p.amount
335335 [changeBy(userSkinStore(child, address), commitment), changeBy(skinTotalStore(child), commitment), changeBy(pwrTotalStore, commitment)]
336336 }
337337 }
338338 else throw("Strict value is not equal to itself.")
339339 }
340340
341341
342342
343343 @Callable(i)
344344 func commitAfterStartFor (child,address) = commitAfterStartForInternal(i, child, address, 0)
345345
346346
347347
348348 @Callable(i)
349349 func commitAfterStartWithLockRoundFor (child,address,additionalLockRounds) = commitAfterStartForInternal(i, child, address, additionalLockRounds)
350350
351351
352352
353353 @Callable(i)
354354 func invest (child) = {
355355 let a = allowed("invest")
356356 if ((a == a))
357357 then {
358358 let s = assertNotStartedPeriod(child)
359359 if ((s == s))
360360 then {
361361 let token = investmentsToken(child)
362362 if ((i.payments[0].assetId != token))
363363 then throw("invalid investments asset id")
364364 else {
365365 let amount = i.payments[0].amount
366366 let maximum = valueOrElse(getInteger(investmentsMaxStore(child)), 0)
367367 func datas (a) = [changeBy(investorStore(child, toString(i.caller)), a), changeBy(investmentsTotalStore(child), a), changeBy(investmentsPeriodTotalStore(child), a)]
368368
369369 if ((maximum > 0))
370370 then {
371371 let totalStore = investmentsTotalStore(child)
372372 let total = valueOrElse(getInteger(totalStore), 0)
373373 let investmens = min([amount, (maximum - total)])
374374 if ((0 >= investmens))
375375 then throw(("Total max. investments is reached: " + toString(maximum)))
376376 else {
377377 let chargeBack = (amount - investmens)
378378 if ((chargeBack > 0))
379379 then [ScriptTransfer(i.caller, chargeBack, token), datas(investmens)]
380380 else datas(investmens)
381381 }
382382 }
383383 else datas(amount)
384384 }
385385 }
386386 else throw("Strict value is not equal to itself.")
387387 }
388388 else throw("Strict value is not equal to itself.")
389389 }
390390
391391
392392
393393 @Callable(i)
394394 func investAfterStart (child) = {
395395 let a = allowed("investAfterStart")
396396 if ((a == a))
397397 then if ((valueOrElse(getBoolean(investAfterStartStore(child)), false) == false))
398398 then throw("denied (investAfterStart)")
399399 else {
400400 let s = assertIsStarted(child)
401401 if ((s == s))
402402 then if ((period(child) > 0))
403403 then throw("initial round is ended")
404404 else {
405405 let token = investmentsToken(child)
406406 if ((i.payments[0].assetId != token))
407407 then throw("invalid investments asset id")
408408 else {
409409 let amount = i.payments[0].amount
410410 [changeBy(investorStore(child, toString(i.caller)), amount), changeBy(investmentsTotalStore(child), amount), changeBy(investmentsPeriodTotalStore(child), amount), ScriptTransfer(addressFromStringValue(treasury(child)), amount, investmentsToken(child))]
411411 }
412412 }
413413 else throw("Strict value is not equal to itself.")
414414 }
415415 else throw("Strict value is not equal to itself.")
416416 }
417417
418418
419419
420420 @Callable(i)
421421 func start (child) = {
422422 let paused = allowed("start")
423423 if ((paused == paused))
424424 then {
425425 let s = if (assertNotStarted(child))
426426 then assertNotCancelled(child)
427427 else false
428428 if ((s == s))
429429 then {
430430 let totalSkin = valueOrElse(getInteger(skinTotalStore(child)), 0)
431431 let skinRequired = valueOrErrorMessage(getInteger(skinRequiredStore(child)), "child not registered")
432432 if ((skinRequired > totalSkin))
433433 then throw("not enough skin in the game")
434434 else {
435435 let totalInvestments = valueOrElse(getInteger(investmentsTotalStore(child)), 0)
436436 if ((getIntegerValue(investmentsRequiredStore(child)) > totalInvestments))
437437 then throw("not enough investments")
438438 else [IntegerEntry(startHeightStore(child), HEIGHT), ScriptTransfer(addressFromStringValue(treasury(child)), totalInvestments, investmentsToken(child))]
439439 }
440440 }
441441 else throw("Strict value is not equal to itself.")
442442 }
443443 else throw("Strict value is not equal to itself.")
444444 }
445445
446446
447447
448448 @Callable(i)
449449 func initNextPeriod (child,blockBetweenPeriods,lockTime) = {
450450 let paused = allowed("initNextPeriod")
451451 if ((paused == paused))
452452 then if (if ((toString(i.caller) != getStringValue(ownerStore(child))))
453453 then (i.caller != this)
454454 else false)
455455 then throw("denied")
456456 else if ((0 > blockBetweenPeriods))
457457 then throw("blockBetweenPeriods should be positive or zero")
458458 else if ((1 > lockTime))
459459 then throw("lockTime should be positive")
460460 else {
461461 let unlockHeight_ = unlockHeight(child)
462462 if ((unlockHeight_ > HEIGHT))
463463 then throw("current period is still active")
464464 else {
465465 let p = period(child)
466466 if (if ((p > 0))
467467 then !(isDefined(startPeriodHeightStore(child, p)))
468468 else false)
469469 then throw("next period already initialized")
470470 else {
471471 let newPeriod = (p + 1)
472472 [IntegerEntry(periodStore(child), newPeriod), IntegerEntry(startPeriodAfterHeightStore(child, newPeriod), (unlockHeight_ + blockBetweenPeriods)), IntegerEntry(periodLockTimeStore(child, newPeriod), lockTime)]
473473 }
474474 }
475475 }
476476 else throw("Strict value is not equal to itself.")
477477 }
478478
479479
480480
481481 @Callable(i)
482482 func startPeriod (child) = {
483483 let paused = allowed("startPeriod")
484484 if ((paused == paused))
485485 then {
486486 let s = assertNotStartedPeriod(child)
487487 if ((s == s))
488488 then {
489489 let period_ = period(child)
490490 let startAfterStore = startPeriodAfterHeightStore(child, period_)
491491 let startAfter = valueOrErrorMessage(getInteger(startAfterStore), ("key not found: " + startAfterStore))
492492 if ((startAfter > HEIGHT))
493493 then throw("too early")
494494 else {
495495 let totalSkin = valueOrElse(getInteger(skinTotalStore(child)), 0)
496496 let skinRequired = valueOrErrorMessage(getInteger(skinRequiredStore(child)), "child not registered")
497497 if ((skinRequired > totalSkin))
498498 then throw("not enough skin in the game")
499499 else {
500500 let periodInvestments = valueOrElse(getInteger(investmentsPeriodTotalStore(child)), 0)
501501 [IntegerEntry(startCurrentPeriodHeightStore(child), HEIGHT), ScriptTransfer(addressFromStringValue(child), periodInvestments, investmentsToken(child))]
502502 }
503503 }
504504 }
505505 else throw("Strict value is not equal to itself.")
506506 }
507507 else throw("Strict value is not equal to itself.")
508508 }
509509
510510
511511
512512 @Callable(i)
513513 func slash (child,amount) = {
514514 let paused = allowed("/")
515515 if ((paused == paused))
516516 then if (!(contains(slashers, toString(i.caller))))
517517 then throw("denied")
518518 else if (!(isDefined(getInteger(startHeightStore(child)))))
519519 then throw("not started")
520520 else [changeBy(skinTotalStore(child), -(amount)), Burn(pwrAssetId, amount)]
521521 else throw("Strict value is not equal to itself.")
522522 }
523523
524524
525525
526526 @Callable(i)
527527 func completeFor (child,user) = if (!(contains(mainAddresses, toString(i.caller))))
528528 then throw("denied")
529529 else {
530530 let unlockHeight_ = unlockHeight(child)
531531 if ((unlockHeight_ > HEIGHT))
532532 then throw("still locked")
533533 else {
534534 let endedPeriod = completedPeriod(child)
535535 let unlockRound = valueOrElse(getInteger(userSkinUnlockPeriodStore(child, user)), 0)
536536 if ((unlockRound > endedPeriod))
537537 then throw((("you can unlock on " + toString(unlockRound)) + " round"))
538538 else {
539539 let skin = currentUserSkin(child, user)
540540 if ((skin == 0))
541541 then throw("you had no skin in the game")
542542 else $Tuple2([ScriptTransfer(i.caller, skin, pwrAssetId), DeleteEntry(userSkinStore(child, user)), changeBy(skinTotalStore(child), -(skin)), changeBy(pwrTotalStore, -(skin)), IntegerEntry(userSkinExitedInPeriodStore(child, user, endedPeriod), skin)], skin)
543543 }
544544 }
545545 }
546546
547547
548548
549549 @Callable(i)
550550 func cancel (child) = {
551551 let paused = allowed("cancel")
552552 if ((paused == paused))
553553 then {
554554 let s = if (assertNotStarted(child))
555555 then true
556556 else assertNotCancelled(child)
557557 if ((s == s))
558558 then if ((toString(i.caller) != getStringValue(ownerStore(child))))
559559 then throw("denied. not an owner")
560560 else [IntegerEntry(cancelHeightStore(child), HEIGHT)]
561561 else throw("Strict value is not equal to itself.")
562562 }
563563 else throw("Strict value is not equal to itself.")
564564 }
565565
566566
567567
568568 @Callable(i)
569569 func undoInvest (child) = {
570570 let paused = allowed("undoInvest")
571571 if ((paused == paused))
572572 then {
573573 let s = assertNotStarted(child)
574574 if ((s == s))
575575 then {
576576 let investmentsStore1 = investorStore(child, toString(i.caller))
577577 let investments = valueOrElse(getInteger(investmentsStore1), 0)
578578 if ((investments == 0))
579579 then throw("no investments")
580580 else [DeleteEntry(investmentsStore1), changeBy(investmentsTotalStore(child), -(investments)), changeBy(investmentsPeriodTotalStore(child), -(investments)), ScriptTransfer(i.caller, investments, investmentsToken(child))]
581581 }
582582 else throw("Strict value is not equal to itself.")
583583 }
584584 else throw("Strict value is not equal to itself.")
585585 }
586586
587587
588588
589589 @Callable(i)
590590 func undoCommitFor (child,address) = {
591591 let paused = allowed("undoCommitFor")
592592 if ((paused == paused))
593593 then if (!(contains(mainAddresses, toString(i.caller))))
594594 then throw("denied")
595595 else {
596596 let s = assertNotStarted(child)
597597 if ((s == s))
598598 then {
599599 let userSkinStore1 = userSkinStore(child, address)
600600 let skin = valueOrElse(getInteger(userSkinStore1), 0)
601601 if ((skin == 0))
602602 then throw("no skin")
603603 else $Tuple2([DeleteEntry(userSkinStore1), changeBy(skinTotalStore(child), -(skin)), changeBy(pwrTotalStore, -(skin)), ScriptTransfer(i.caller, skin, pwrAssetId)], skin)
604604 }
605605 else throw("Strict value is not equal to itself.")
606606 }
607607 else throw("Strict value is not equal to itself.")
608608 }
609609
610610
611611
612612 @Callable(i)
613613 func userPower (child,user) = $Tuple2(nil, valueOrElse(userCommitment(child, user), 0))
614614
615615
616616
617617 @Callable(i)
618618 func totalPower (child) = $Tuple2(nil, valueOrErrorMessage(getInteger(skinTotalStore(child)), "totalPower: child not found"))
619619
620620
621621
622622 @Callable(i)
623623 func init (conf) = [writeConstString(configAddressStore, conf)]
624624
625625
626+@Verifier(tx)
627+func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
628+ then true
629+ else sigVerify(tx.bodyBytes, tx.proofs[0], base58'HBMzK5kHm3StNpmZvRDyiW2p7vvi1EaR3xNgjMV4t3Ye')
630+

github/deemru/w8io/3ef1775 
60.99 ms