tx · HJuFQwm75ntfMjjBx4Fdx9BXxUQUDXZFZAXbwwnDbGpP

3N8xXaYjE27Aa79d5hHrhHu9HaFoTBmhDEj:  -0.01000000 Waves

2023.01.19 10:45 [2411524] smart account 3N8xXaYjE27Aa79d5hHrhHu9HaFoTBmhDEj > SELF 0.00000000 Waves

{ "type": 13, "id": "HJuFQwm75ntfMjjBx4Fdx9BXxUQUDXZFZAXbwwnDbGpP", "fee": 1000000, "feeAssetId": null, "timestamp": 1674114352746, "version": 2, "chainId": 84, "sender": "3N8xXaYjE27Aa79d5hHrhHu9HaFoTBmhDEj", "senderPublicKey": "A2m227AHcq7gWfSU59Q3UJaqkEa7SccFYmJuWHbFrrKE", "proofs": [ "3bY8pWWa687fgwJWdFHVsf4vMWyciRUEBX1taQr9WB8DLoBpYuQnuqk6nbvLzAg9EJUHBSSLAfHvbM9d5pcWQGuM" ], "script": "base64:BgJMCAISBAoCCAgSBAoCBAgSAwoBBBIICgYICAgIAQgSCAoGCAgICAEIEgQKAggIEgUKAwgICBIDCgEIEgYKBAgIAQESBAoCCAgSAwoBCCcAB1ZFUlNJT04CAzEuNQEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwEPZ2V0SW50ZWdlckJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAAABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEADmRhcHBSdW5uaW5nS2V5AhRjb25mX2RhcHBfaXNfcnVubmluZwARbWFpbnRlbmFuY2VNU0dLZXkCFGNvbmZfbWFpbnRlbmFuY2VfbXNnABJ3aGl0ZWxpc3RlZG9ubHlLZXkCFWNvbmZfd2hpdGVsaXN0ZWRfb25seQALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUOZGFwcFJ1bm5pbmdLZXkGAA5tYWludGVuYW5jZU1TRwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRFtYWludGVuYW5jZU1TR0tleQIAAA93aGl0ZWxpc3RlZG9ubHkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUSd2hpdGVsaXN0ZWRvbmx5S2V5BgANd2hpdGVsaXN0RGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhNjb25mX3doaXRlbGlzdF9kYXBwAAt1c2VyQWxsb3dlZAIHQUxMT1dFRAAOdXNlclJlZ2lzdGVyZWQCClJFR0lTVEVSRUQADHVzZXJWZXJpZmllZAIIVkVSSUZJRUQADXVzZXJTdXNwZW5kZWQCCVNVU1BFTkRFRAALdXNlclJlbW92ZWQCB1JFTU9WRUQAEnVzZXJDaGFuZ2VSZXF1aXJlZAIPQ0hBTkdFX1JFUVVJUkVEABB1c2VyVW5yZWdpc3RlcmVkAgxVTlJFR0lTVEVSRUQACXVzZXJSZXNldAIFUkVTRVQBC2tleVVzZXJBZGRyAQZjYWxsZXIJAKwCAgIFdXNlcl8FBmNhbGxlcgELa2V5VXNlck5hbWUBBmNhbGxlcgkArAICAgp1c2VyX25hbWVfBQZjYWxsZXIBC2tleVVzZXJEZXNjAQZjYWxsZXIJAKwCAgIKdXNlcl9kZXNjXwUGY2FsbGVyAQ1rZXlVc2VyU29jaWFsAQZjYWxsZXIJAKwCAgIMdXNlcl9zb2NpYWxfBQZjYWxsZXIBDGtleVVzZXJUaHVtYgEGY2FsbGVyCQCsAgICC3VzZXJfdGh1bWJfBQZjYWxsZXIBDWtleVVzZXJTdGF0dXMBBmNhbGxlcgkArAICAgx1c2VyX3N0YXR1c18FBmNhbGxlcgEQa2V5VXNlclJveWFsdGllcwEGY2FsbGVyCQCsAgICD3VzZXJfcm95YWx0aWVzXwUGY2FsbGVyAQtrZXlVc2VyRGF0ZQEGY2FsbGVyCQCsAgICCnVzZXJfZGF0ZV8FBmNhbGxlcgEMa2V5VXNlckVSQzIwAQZjYWxsZXIJAKwCAgILdXNlcl9FUkMyMF8FBmNhbGxlcgESa2V5QXJ0aXN0QWdlbnRBZGRyAQphcnRpc3RBZGRyCQCsAgICDWFydGlzdF9hZ2VudF8FCmFydGlzdEFkZHIBEmtleUFnZW50QXJ0aXN0QWRkcgIJYWdlbnRBZGRyCmFydGlzdEFkZHIJAKwCAgkArAICCQCsAgICBmFnZW50XwUJYWdlbnRBZGRyAgFfBQphcnRpc3RBZGRyAQ9rZXlQcmltYXJ5U2hhcmUBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARFrZXlTZWNvbmRhcnlTaGFyZQEKYXJ0aXN0QWRkcgkArAICAhdhcnRpc3RfYWdlbnRfc2Vjb25kYXJ5XwUKYXJ0aXN0QWRkcgELdmFsaWRhdGVDSUQBA2NpZAMJAQhjb250YWlucwIFA2NpZAIBLwMDCQBmAgBMCQCxAgEFA2NpZAkAAAIJALECAQkAkQMCCQC1CQIFA2NpZAIBLwAAADsHCQBmAgAQCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAQcHAQ12YWxpZFVzZXJEYXRhBQZjYWxsZXIEbmFtZQtkZXNjcmlwdGlvbgV0aHVtYgppc0FuVXBkYXRlBAh2YWxpZENJRAMJAQIhPQIJALECAQUFdGh1bWIAAAkBC3ZhbGlkYXRlQ0lEAQUFdGh1bWIGAwkBASEBBQh2YWxpZENJRAkAAgECHENJRCBkb24ndCBtYXRjaCByZXF1aXJlbWVudCEDAwkAAAIFBG5hbWUCAAYJAAACBQtkZXNjcmlwdGlvbgIACQACAQIkTmFtZSBhbmQgZGVzY3JpcHRpb24gY2Fubm90IGJlIGVtcHR5AwkAZgIJALECAQULZGVzY3JpcHRpb24A2AQJAAIBAhk2MDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwkAZgIJALECAQUEbmFtZQAtCQACAQIRNDUgQ2hhci4gbWF4IG5hbWUEBnN0YXR1cwkBDmdldFN0cmluZ0J5S2V5AQkBDWtleVVzZXJTdGF0dXMBBQZjYWxsZXIDAwkAAAIFBnN0YXR1cwUNdXNlclN1c3BlbmRlZAYJAAACBQZzdGF0dXMFC3VzZXJSZW1vdmVkCQACAQIbQWNjb3VudCBzdXNwZW5kZWQvIHJlbW92ZWQuAwMJAQEhAQUKaXNBblVwZGF0ZQkAAAIFBnN0YXR1cwUOdXNlclJlZ2lzdGVyZWQHCQACAQISQWxyZWFkeSByZWdpc3RlcmVkAwMDCQEBIQEFCmlzQW5VcGRhdGUJAAACBQZzdGF0dXMCAAcFD3doaXRlbGlzdGVkb25seQcJAAIBAiNDYW4ndCByZWdpc3RlciwgZ2V0IGFwcHJvdmVkIGZpcnN0LgMDAwUKaXNBblVwZGF0ZQkAAAIFBnN0YXR1cwIABwYDBQppc0FuVXBkYXRlCQAAAgUGc3RhdHVzBQt1c2VyQWxsb3dlZAcJAAIBAg5SZWdpc3RlciBmaXJzdAYBEXZhbGlkYXRlTmV3U3RhdHVzAwZzdGF0dXMHYWRkcmVzcw1jdXJyZW50U3RhdHVzBAlhbGxTdGF0dXMJAMwIAgUMdXNlclZlcmlmaWVkCQDMCAIFDnVzZXJSZWdpc3RlcmVkCQDMCAIFDXVzZXJTdXNwZW5kZWQJAMwIAgULdXNlclJlbW92ZWQJAMwIAgULdXNlckFsbG93ZWQJAMwIAgUSdXNlckNoYW5nZVJlcXVpcmVkBQNuaWwEC3N0YXR1c1RvU2V0AwkBD2NvbnRhaW5zRWxlbWVudAIFCWFsbFN0YXR1cwUGc3RhdHVzBQZzdGF0dXMDAwkAAAIFBnN0YXR1cwUJdXNlclJlc2V0CQAAAgUNY3VycmVudFN0YXR1cwULdXNlckFsbG93ZWQHAgAJAAIBAg5Vbmtub3duIHN0YXR1cwQQdXNlcklzUmVnaXN0ZXJlZAkBD2dldEludGVnZXJCeUtleQEJAQtrZXlVc2VyRGF0ZQEFB2FkZHJlc3MDAwkAAAIFEHVzZXJJc1JlZ2lzdGVyZWQAAAkBAiE9AgULc3RhdHVzVG9TZXQFC3VzZXJBbGxvd2VkBwkAAgECMVlvdSBjYW50IHNldCB0aGlzIHN0YXR1cywgdXNlciBpcyBub3QgcmVnaXN0ZXJlZC4DAwkAAAIFDWN1cnJlbnRTdGF0dXMFC3VzZXJBbGxvd2VkCQAAAgULc3RhdHVzVG9TZXQFC3VzZXJBbGxvd2VkBwkAAgECFFVzZXIgYWxyZWFkeSBhbGxvd2VkAwMJAAACBQ1jdXJyZW50U3RhdHVzBQ51c2VyUmVnaXN0ZXJlZAkAAAIFC3N0YXR1c1RvU2V0BQt1c2VyQWxsb3dlZAcJAAIBAiFVc2VyIGFscmVhZHkgYWxsb3dlZCAmIHJlZ2lzdGVyZWQDAwkAAAIFDWN1cnJlbnRTdGF0dXMFDHVzZXJWZXJpZmllZAkAAAIFC3N0YXR1c1RvU2V0BQt1c2VyQWxsb3dlZAcJAAIBAh9Vc2VyIGFscmVhZHkgYWxsb3dlZCAmIHZlcmlmaWVkBQtzdGF0dXNUb1NldAEIbWFrZUpTT04DBG5hbWUFdGh1bWIEZGF0ZQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPeyJ1c2VyX25hbWUiOiAiBQRuYW1lAhEiLCAidXNlcl90aHVtYiI6IgUFdGh1bWICDyIsInVzZXJfZGF0ZSI6IgUEZGF0ZQICIn0BCGFzU3RyaW5nAQJidgQHJG1hdGNoMAUCYnYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANidjAFByRtYXRjaDAFA2J2MAkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAEJZ2V0Q2FsbGVyAgFpBnB1YktleQQGY2FsbGVyAwkAAAIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQTZ2V0X3Nwb25zb3JlZF93YXZlcwMJAQIhPQIFBnB1YktleQIACQD8BwQFDXdoaXRlbGlzdERhcHACCXVzZUZyZWVUeAkAzAgCCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkFA25pbAUDbmlsBQR1bml0AwkAAAIFE2dldF9zcG9uc29yZWRfd2F2ZXMFE2dldF9zcG9uc29yZWRfd2F2ZXMFBmNhbGxlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgsGaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzBmludm9rZQEKYXBwUnVubmluZwIGaXNMaXZlB21lc3NhZ2UEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDmRhcHBSdW5uaW5nS2V5BQZpc0xpdmUJAMwIAgkBC1N0cmluZ0VudHJ5AgURbWFpbnRlbmFuY2VNU0dLZXkFB21lc3NhZ2UFA25pbAkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMGaW52b2tlARByZWdpc3RyYXRpb25Nb2RlAQZXTG9ubHkEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIJAMwIAgkBDEJvb2xlYW5FbnRyeQIFEndoaXRlbGlzdGVkb25seUtleQUGV0xvbmx5BQNuaWwJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzBmludm9rZQEMcmVnaXN0ZXJVc2VyBgRuYW1lC2Rlc2NyaXB0aW9uBXRodW1iBnNvY2lhbAlyb3lhbHRpZXMGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBAZjYWxsZXIJAQlnZXRDYWxsZXICBQZpbnZva2UFBnB1YktleQQCaWQJANgEAQgFBmludm9rZQ10cmFuc2FjdGlvbklkBAl0aW1lc3RhbXAIBQlsYXN0QmxvY2sJdGltZXN0YW1wAwkBASEBCQENdmFsaWRVc2VyRGF0YQUFBmNhbGxlcgUEbmFtZQULZGVzY3JpcHRpb24FBXRodW1iBwkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBARqc29uCQEIbWFrZUpTT04DCQDaBAEJAJsDAQUEbmFtZQkA2gQBCQCbAwEFBXRodW1iCQCkAwEFCXRpbWVzdGFtcAMDCQBmAgAABQlyb3lhbHRpZXMGCQBmAgUJcm95YWx0aWVzAOgHCQACAQIzUm95YWx0aWVzIGNhbm5vdCBiZSBsZXNzIHRoYW4gMCUgb3IgaGlnaGVyIHRoYW4gMTAlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQELa2V5VXNlckRhdGUBBQZjYWxsZXIFCXRpbWVzdGFtcAkAzAgCCQELU3RyaW5nRW50cnkCCQELa2V5VXNlckFkZHIBBQZjYWxsZXIJAKwCAgkArAICBQJpZAIBXwkApAMBBQl0aW1lc3RhbXAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBC2tleVVzZXJOYW1lAQUGY2FsbGVyBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQtrZXlVc2VyRGVzYwEFBmNhbGxlcgULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleVVzZXJTb2NpYWwBBQZjYWxsZXIFBnNvY2lhbAkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5VXNlclRodW1iAQUGY2FsbGVyBQV0aHVtYgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5VXNlclN0YXR1cwEFBmNhbGxlcgUOdXNlclJlZ2lzdGVyZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlVc2VyUm95YWx0aWVzAQUGY2FsbGVyBQlyb3lhbHRpZXMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICAghBTExPV0VEXwUGY2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQ51c2VyUmVnaXN0ZXJlZAIBXwUGY2FsbGVyBQRqc29uBQNuaWwGaW52b2tlAQp1cGRhdGVVc2VyBgRuYW1lC2Rlc2NyaXB0aW9uBXRodW1iBnNvY2lhbAlyb3lhbHRpZXMGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBAZjYWxsZXIJAQlnZXRDYWxsZXICBQZpbnZva2UFBnB1YktleQQGc3RhdHVzCQEOZ2V0U3RyaW5nQnlLZXkBCQENa2V5VXNlclN0YXR1cwEFBmNhbGxlcgMJAQEhAQkBDXZhbGlkVXNlckRhdGEFBQZjYWxsZXIFBG5hbWUFC2Rlc2NyaXB0aW9uBQV0aHVtYgYJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwQEZGF0ZQkBD2dldEludGVnZXJCeUtleQEJAQtrZXlVc2VyRGF0ZQEFBmNhbGxlcgQEanNvbgkBCG1ha2VKU09OAwkA2gQBCQCbAwEFBG5hbWUJANoEAQkAmwMBBQV0aHVtYgkApAMBBQRkYXRlAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBC2tleVVzZXJOYW1lAQUGY2FsbGVyBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQtrZXlVc2VyRGVzYwEFBmNhbGxlcgULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleVVzZXJTb2NpYWwBBQZjYWxsZXIFBnNvY2lhbAkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5VXNlclRodW1iAQUGY2FsbGVyBQV0aHVtYgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleVVzZXJSb3lhbHRpZXMBBQZjYWxsZXIFCXJveWFsdGllcwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUGc3RhdHVzAgFfBQZjYWxsZXIFBGpzb24FA25pbAZpbnZva2UBDHNldEVSQzIwVXNlcgIFZXJjMjAGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBAZjYWxsZXIJAQlnZXRDYWxsZXICBQZpbnZva2UFBnB1YktleQQGc3RhdHVzCQEOZ2V0U3RyaW5nQnlLZXkBCQENa2V5VXNlclN0YXR1cwEFBmNhbGxlcgMDCQECIT0CBQZzdGF0dXMFDnVzZXJSZWdpc3RlcmVkCQECIT0CBQZzdGF0dXMFDHVzZXJWZXJpZmllZAcJAAIBAiBOb3QgYWxsb3dlZCB0byBzZXQgRVJDMjAgYWRkcmVzcwQIZmlyc3RUd28JAK8CAgUFZXJjMjAAAgMDCQECIT0CBQhmaXJzdFR3bwICMHgGCQECIT0CCQCxAgEFBWVyYzIwACoJAAIBAhxUaGlzIGlzIG5vdCBhbiBlcmMyMCBhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlVc2VyRVJDMjABBQZjYWxsZXIFBWVyYzIwBQNuaWwGaW52b2tlARBjaGFuZ2VVc2VyU3RhdHVzAwdhZGRyZXNzBnN0YXR1cwRub3RlBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIEDWN1cnJlbnRTdGF0dXMJAQ5nZXRTdHJpbmdCeUtleQEJAQ1rZXlVc2VyU3RhdHVzAQUHYWRkcmVzcwQLc3RhdHVzVG9TZXQJARF2YWxpZGF0ZU5ld1N0YXR1cwMFBnN0YXR1cwUHYWRkcmVzcwUNY3VycmVudFN0YXR1cwQEbmFtZQkA2gQBCQCbAwEJAQ5nZXRTdHJpbmdCeUtleQEJAQtrZXlVc2VyTmFtZQEFB2FkZHJlc3MEBXRodW1iCQDaBAEJAJsDAQkBDmdldFN0cmluZ0J5S2V5AQkBDGtleVVzZXJUaHVtYgEFB2FkZHJlc3MEBGRhdGUJAQ9nZXRJbnRlZ2VyQnlLZXkBCQELa2V5VXNlckRhdGUBBQdhZGRyZXNzBARqc29uCQEIbWFrZUpTT04DBQRuYW1lBQV0aHVtYgkApAMBBQRkYXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5VXNlclN0YXR1cwEFB2FkZHJlc3MFC3N0YXR1c1RvU2V0CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICBQ1jdXJyZW50U3RhdHVzAgFfBQdhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQtzdGF0dXNUb1NldAIBXwUHYWRkcmVzcwUEanNvbgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICCnVzZXJfbm90ZV8FB2FkZHJlc3MFBG5vdGUFA25pbAkAAgECIU5vdCBhbGxvd2VkIHRvIGNoYW5nZSB1c2VyIHN0YXR1cwZpbnZva2UBCmRlbGV0ZVVzZXIBB2FkZHJlc3MEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgQNY3VycmVudFN0YXR1cwkBDmdldFN0cmluZ0J5S2V5AQkBDWtleVVzZXJTdGF0dXMBBQdhZGRyZXNzAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgkAzAgCCQELRGVsZXRlRW50cnkBCQELa2V5VXNlckRhdGUBBQdhZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQtrZXlVc2VyQWRkcgEFB2FkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBC2tleVVzZXJOYW1lAQUHYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQELa2V5VXNlckRlc2MBBQdhZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlVc2VyU29jaWFsAQUHYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5VXNlclRodW1iAQUHYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICCnVzZXJfbm90ZV8FB2FkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIFDWN1cnJlbnRTdGF0dXMCAV8FB2FkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEGtleVVzZXJSb3lhbHRpZXMBBQdhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlVc2VyU3RhdHVzAQUHYWRkcmVzcwULdXNlclJlbW92ZWQFA25pbAkAAgECC05vdCBhbGxvd2VkAWkBCHNldEFnZW50BAphcnRpc3RBZGRyCWFnZW50QWRkcgxwcmltYXJ5U2hhcmUOc2Vjb25kYXJ5U2hhcmUDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwMJAQIhPQIJALECAQUKYXJ0aXN0QWRkcgAjBgkBAiE9AgkAsQIBBQlhZ2VudEFkZHIAIwkAAgECDVdyb25nIGFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleUFydGlzdEFnZW50QWRkcgEFCmFydGlzdEFkZHIFCWFnZW50QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5QWdlbnRBcnRpc3RBZGRyAgUJYWdlbnRBZGRyBQphcnRpc3RBZGRyBQphcnRpc3RBZGRyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5UHJpbWFyeVNoYXJlAQUKYXJ0aXN0QWRkcgUMcHJpbWFyeVNoYXJlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERa2V5U2Vjb25kYXJ5U2hhcmUBBQphcnRpc3RBZGRyBQ5zZWNvbmRhcnlTaGFyZQUDbmlsCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQp1bnNldEFnZW50AgphcnRpc3RBZGRyCWFnZW50QWRkcgMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDAwkBAiE9AgkAsQIBBQphcnRpc3RBZGRyACMGCQECIT0CCQCxAgEFCWFnZW50QWRkcgAjCQACAQINV3JvbmcgYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5QXJ0aXN0QWdlbnRBZGRyAQUKYXJ0aXN0QWRkcgkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5QWdlbnRBcnRpc3RBZGRyAgUJYWdlbnRBZGRyBQphcnRpc3RBZGRyCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ9rZXlQcmltYXJ5U2hhcmUBBQphcnRpc3RBZGRyCQDMCAIJAQtEZWxldGVFbnRyeQEJARFrZXlTZWNvbmRhcnlTaGFyZQEFCmFydGlzdEFkZHIFA25pbAkAAgECE1lvdSBhcmUgbm90IGFsbG93ZWQBaQELZGVsZXRlRW50cnkBBWVudHJ5BAZjYWxsZXIJAKUIAQgFAWkGY2FsbGVyAwkAAAIFBmNhbGxlcgUFY2hyaXMJAMwIAgkBC0RlbGV0ZUVudHJ5AQUFZW50cnkFA25pbAkAAgECAm5vAQJ0eAEIdmVyaWZpZXIABAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwAwMJAAACCAUDaW52CGZ1bmN0aW9uAgxyZWdpc3RlclVzZXIJAAACCAUDaW52BGRBcHAFBHRoaXMHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAA0DAwkAAAIIBQNpbnYIZnVuY3Rpb24CCnVwZGF0ZVVzZXIJAAACCAUDaW52BGRBcHAFBHRoaXMHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAwDAwkAAAIIBQNpbnYIZnVuY3Rpb24CDHNldEVSQzIwVXNlcgkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tlecHOIOc=", "height": 2411524, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7E44s33V8Pvz4bnzcSKnSmKUzXRks6uweCd1U1Uh633T Next: 3YHRUcANtrH7KZzFBtboixMk47hpepQi2SA6ZYQwtEjP Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let VERSION = "1.5"
5+
46 func getStringByKey (key) = valueOrElse(getString(this, key), "")
7+
8+
9+func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
510
611
712 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
2126
2227 let whitelistedonly = valueOrElse(getBoolean(this, whitelistedonlyKey), true)
2328
29+let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
30+
2431 let userAllowed = "ALLOWED"
2532
2633 let userRegistered = "REGISTERED"
3239 let userRemoved = "REMOVED"
3340
3441 let userChangeRequired = "CHANGE_REQUIRED"
42+
43+let userUnregistered = "UNREGISTERED"
3544
3645 let userReset = "RESET"
3746
159168 func makeJSON (name,thumb,date) = (((((("{\"user_name\": \"" + name) + "\", \"user_thumb\":\"") + thumb) + "\",\"user_date\":\"") + date) + "\"}")
160169
161170
171+func asString (bv) = match bv {
172+ case bv0: String =>
173+ bv0
174+ case _ =>
175+ throw("Sponsored Public Key String expected")
176+}
177+
178+
179+func getCaller (i,pubKey) = {
180+ let caller = if ((toBase58String(i.caller.bytes) == toString(this)))
181+ then toString(addressFromPublicKey(fromBase58String(pubKey)))
182+ else toBase58String(i.caller.bytes)
183+ let get_sponsored_waves = if ((pubKey != ""))
184+ then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
185+ else unit
186+ if ((get_sponsored_waves == get_sponsored_waves))
187+ then caller
188+ else throw("Strict value is not equal to itself.")
189+ }
190+
191+
162192 @Callable(invoke)
163193 func setConf (key,val) = {
164194 let caller = toString(invoke.caller)
190220
191221
192222 @Callable(invoke)
193-func registerUser (name,description,thumb,social,royalties) = if (!(dappRunning))
223+func registerUser (name,description,thumb,social,royalties,pubKey) = if (!(dappRunning))
194224 then throw(maintenanceMSG)
195225 else {
196- let caller = toString(invoke.caller)
226+ let caller = getCaller(invoke, pubKey)
197227 let id = toBase58String(invoke.transactionId)
198228 let timestamp = lastBlock.timestamp
199229 if (!(validUserData(caller, name, description, thumb, false)))
211241
212242
213243 @Callable(invoke)
214-func updateUser (name,description,thumb,social,royalties) = if (!(dappRunning))
244+func updateUser (name,description,thumb,social,royalties,pubKey) = if (!(dappRunning))
215245 then throw(maintenanceMSG)
216246 else {
217- let caller = toString(invoke.caller)
247+ let caller = getCaller(invoke, pubKey)
218248 let status = getStringByKey(keyUserStatus(caller))
219249 if (!(validUserData(caller, name, description, thumb, true)))
220250 then throw("Something went wrong")
232262
233263
234264 @Callable(invoke)
235-func setERC20User (erc20) = if (!(dappRunning))
265+func setERC20User (erc20,pubKey) = if (!(dappRunning))
236266 then throw(maintenanceMSG)
237267 else {
238- let caller = toString(invoke.caller)
268+ let caller = getCaller(invoke, pubKey)
239269 let status = getStringByKey(keyUserStatus(caller))
240270 if (if ((status != userRegistered))
241271 then (status != userVerified)
321351 }
322352
323353
354+@Verifier(tx)
355+func verifier () = match tx {
356+ case inv: InvokeScriptTransaction =>
357+ if (if ((inv.function == "registerUser"))
358+ then (inv.dApp == this)
359+ else false)
360+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
361+ else if (if ((inv.function == "updateUser"))
362+ then (inv.dApp == this)
363+ else false)
364+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
365+ else if (if ((inv.function == "setERC20User"))
366+ then (inv.dApp == this)
367+ else false)
368+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
369+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
370+ case _ =>
371+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
372+}
373+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let VERSION = "1.5"
5+
46 func getStringByKey (key) = valueOrElse(getString(this, key), "")
7+
8+
9+func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
510
611
712 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
813
914
1015 let chris = getStringByKey("conf_admin_1")
1116
1217 let dappRunningKey = "conf_dapp_is_running"
1318
1419 let maintenanceMSGKey = "conf_maintenance_msg"
1520
1621 let whitelistedonlyKey = "conf_whitelisted_only"
1722
1823 let dappRunning = valueOrElse(getBoolean(this, dappRunningKey), true)
1924
2025 let maintenanceMSG = valueOrElse(getString(this, maintenanceMSGKey), "")
2126
2227 let whitelistedonly = valueOrElse(getBoolean(this, whitelistedonlyKey), true)
2328
29+let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
30+
2431 let userAllowed = "ALLOWED"
2532
2633 let userRegistered = "REGISTERED"
2734
2835 let userVerified = "VERIFIED"
2936
3037 let userSuspended = "SUSPENDED"
3138
3239 let userRemoved = "REMOVED"
3340
3441 let userChangeRequired = "CHANGE_REQUIRED"
42+
43+let userUnregistered = "UNREGISTERED"
3544
3645 let userReset = "RESET"
3746
3847 func keyUserAddr (caller) = ("user_" + caller)
3948
4049
4150 func keyUserName (caller) = ("user_name_" + caller)
4251
4352
4453 func keyUserDesc (caller) = ("user_desc_" + caller)
4554
4655
4756 func keyUserSocial (caller) = ("user_social_" + caller)
4857
4958
5059 func keyUserThumb (caller) = ("user_thumb_" + caller)
5160
5261
5362 func keyUserStatus (caller) = ("user_status_" + caller)
5463
5564
5665 func keyUserRoyalties (caller) = ("user_royalties_" + caller)
5766
5867
5968 func keyUserDate (caller) = ("user_date_" + caller)
6069
6170
6271 func keyUserERC20 (caller) = ("user_ERC20_" + caller)
6372
6473
6574 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
6675
6776
6877 func keyAgentArtistAddr (agentAddr,artistAddr) = ((("agent_" + agentAddr) + "_") + artistAddr)
6978
7079
7180 func keyPrimaryShare (artistAddr) = ("artist_agent_primary_" + artistAddr)
7281
7382
7483 func keySecondaryShare (artistAddr) = ("artist_agent_secondary_" + artistAddr)
7584
7685
7786 func validateCID (cid) = if (contains(cid, "/"))
7887 then if (if ((76 > size(cid)))
7988 then (size(split(cid, "/")[0]) == 59)
8089 else false)
8190 then (16 > size(split(cid, "/")[1]))
8291 else false
8392 else false
8493
8594
8695 func validUserData (caller,name,description,thumb,isAnUpdate) = {
8796 let validCID = if ((size(thumb) != 0))
8897 then validateCID(thumb)
8998 else true
9099 if (!(validCID))
91100 then throw("CID don't match requirement!")
92101 else if (if ((name == ""))
93102 then true
94103 else (description == ""))
95104 then throw("Name and description cannot be empty")
96105 else if ((size(description) > 600))
97106 then throw("600 Char. max description")
98107 else if ((size(name) > 45))
99108 then throw("45 Char. max name")
100109 else {
101110 let status = getStringByKey(keyUserStatus(caller))
102111 if (if ((status == userSuspended))
103112 then true
104113 else (status == userRemoved))
105114 then throw("Account suspended/ removed.")
106115 else if (if (!(isAnUpdate))
107116 then (status == userRegistered)
108117 else false)
109118 then throw("Already registered")
110119 else if (if (if (!(isAnUpdate))
111120 then (status == "")
112121 else false)
113122 then whitelistedonly
114123 else false)
115124 then throw("Can't register, get approved first.")
116125 else if (if (if (isAnUpdate)
117126 then (status == "")
118127 else false)
119128 then true
120129 else if (isAnUpdate)
121130 then (status == userAllowed)
122131 else false)
123132 then throw("Register first")
124133 else true
125134 }
126135 }
127136
128137
129138 func validateNewStatus (status,address,currentStatus) = {
130139 let allStatus = [userVerified, userRegistered, userSuspended, userRemoved, userAllowed, userChangeRequired]
131140 let statusToSet = if (containsElement(allStatus, status))
132141 then status
133142 else if (if ((status == userReset))
134143 then (currentStatus == userAllowed)
135144 else false)
136145 then ""
137146 else throw("Unknown status")
138147 let userIsRegistered = getIntegerByKey(keyUserDate(address))
139148 if (if ((userIsRegistered == 0))
140149 then (statusToSet != userAllowed)
141150 else false)
142151 then throw("You cant set this status, user is not registered.")
143152 else if (if ((currentStatus == userAllowed))
144153 then (statusToSet == userAllowed)
145154 else false)
146155 then throw("User already allowed")
147156 else if (if ((currentStatus == userRegistered))
148157 then (statusToSet == userAllowed)
149158 else false)
150159 then throw("User already allowed & registered")
151160 else if (if ((currentStatus == userVerified))
152161 then (statusToSet == userAllowed)
153162 else false)
154163 then throw("User already allowed & verified")
155164 else statusToSet
156165 }
157166
158167
159168 func makeJSON (name,thumb,date) = (((((("{\"user_name\": \"" + name) + "\", \"user_thumb\":\"") + thumb) + "\",\"user_date\":\"") + date) + "\"}")
160169
161170
171+func asString (bv) = match bv {
172+ case bv0: String =>
173+ bv0
174+ case _ =>
175+ throw("Sponsored Public Key String expected")
176+}
177+
178+
179+func getCaller (i,pubKey) = {
180+ let caller = if ((toBase58String(i.caller.bytes) == toString(this)))
181+ then toString(addressFromPublicKey(fromBase58String(pubKey)))
182+ else toBase58String(i.caller.bytes)
183+ let get_sponsored_waves = if ((pubKey != ""))
184+ then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
185+ else unit
186+ if ((get_sponsored_waves == get_sponsored_waves))
187+ then caller
188+ else throw("Strict value is not equal to itself.")
189+ }
190+
191+
162192 @Callable(invoke)
163193 func setConf (key,val) = {
164194 let caller = toString(invoke.caller)
165195 if (containsElement([chris, toString(this)], caller))
166196 then [StringEntry(key, val)]
167197 else throw("You are not allowed to change this")
168198 }
169199
170200
171201
172202 @Callable(invoke)
173203 func appRunning (isLive,message) = {
174204 let caller = toString(invoke.caller)
175205 if (containsElement([chris, toString(this)], caller))
176206 then [BooleanEntry(dappRunningKey, isLive), StringEntry(maintenanceMSGKey, message)]
177207 else throw("You are not allowed to change this")
178208 }
179209
180210
181211
182212 @Callable(invoke)
183213 func registrationMode (WLonly) = {
184214 let caller = toString(invoke.caller)
185215 if (containsElement([chris, toString(this)], caller))
186216 then [BooleanEntry(whitelistedonlyKey, WLonly)]
187217 else throw("You are not allowed to change this")
188218 }
189219
190220
191221
192222 @Callable(invoke)
193-func registerUser (name,description,thumb,social,royalties) = if (!(dappRunning))
223+func registerUser (name,description,thumb,social,royalties,pubKey) = if (!(dappRunning))
194224 then throw(maintenanceMSG)
195225 else {
196- let caller = toString(invoke.caller)
226+ let caller = getCaller(invoke, pubKey)
197227 let id = toBase58String(invoke.transactionId)
198228 let timestamp = lastBlock.timestamp
199229 if (!(validUserData(caller, name, description, thumb, false)))
200230 then throw("Something went wrong")
201231 else {
202232 let json = makeJSON(toBase64String(toBytes(name)), toBase64String(toBytes(thumb)), toString(timestamp))
203233 if (if ((0 > royalties))
204234 then true
205235 else (royalties > 1000))
206236 then throw("Royalties cannot be less than 0% or higher than 10%")
207237 else [IntegerEntry(keyUserDate(caller), timestamp), StringEntry(keyUserAddr(caller), ((id + "_") + toString(timestamp))), StringEntry(keyUserName(caller), name), StringEntry(keyUserDesc(caller), description), StringEntry(keyUserSocial(caller), social), StringEntry(keyUserThumb(caller), thumb), StringEntry(keyUserStatus(caller), userRegistered), IntegerEntry(keyUserRoyalties(caller), royalties), DeleteEntry(("ALLOWED_" + caller)), StringEntry(((userRegistered + "_") + caller), json)]
208238 }
209239 }
210240
211241
212242
213243 @Callable(invoke)
214-func updateUser (name,description,thumb,social,royalties) = if (!(dappRunning))
244+func updateUser (name,description,thumb,social,royalties,pubKey) = if (!(dappRunning))
215245 then throw(maintenanceMSG)
216246 else {
217- let caller = toString(invoke.caller)
247+ let caller = getCaller(invoke, pubKey)
218248 let status = getStringByKey(keyUserStatus(caller))
219249 if (!(validUserData(caller, name, description, thumb, true)))
220250 then throw("Something went wrong")
221251 else {
222252 let date = getIntegerByKey(keyUserDate(caller))
223253 let json = makeJSON(toBase64String(toBytes(name)), toBase64String(toBytes(thumb)), toString(date))
224254 if (if ((0 > royalties))
225255 then true
226256 else (royalties > 1000))
227257 then throw("Royalties cannot be less than 0% or higher than 10%")
228258 else [StringEntry(keyUserName(caller), name), StringEntry(keyUserDesc(caller), description), StringEntry(keyUserSocial(caller), social), StringEntry(keyUserThumb(caller), thumb), IntegerEntry(keyUserRoyalties(caller), royalties), StringEntry(((status + "_") + caller), json)]
229259 }
230260 }
231261
232262
233263
234264 @Callable(invoke)
235-func setERC20User (erc20) = if (!(dappRunning))
265+func setERC20User (erc20,pubKey) = if (!(dappRunning))
236266 then throw(maintenanceMSG)
237267 else {
238- let caller = toString(invoke.caller)
268+ let caller = getCaller(invoke, pubKey)
239269 let status = getStringByKey(keyUserStatus(caller))
240270 if (if ((status != userRegistered))
241271 then (status != userVerified)
242272 else false)
243273 then throw("Not allowed to set ERC20 address")
244274 else {
245275 let firstTwo = take(erc20, 2)
246276 if (if ((firstTwo != "0x"))
247277 then true
248278 else (size(erc20) != 42))
249279 then throw("This is not an erc20 address")
250280 else [StringEntry(keyUserERC20(caller), erc20)]
251281 }
252282 }
253283
254284
255285
256286 @Callable(invoke)
257287 func changeUserStatus (address,status,note) = {
258288 let caller = toString(invoke.caller)
259289 let currentStatus = getStringByKey(keyUserStatus(address))
260290 let statusToSet = validateNewStatus(status, address, currentStatus)
261291 let name = toBase64String(toBytes(getStringByKey(keyUserName(address))))
262292 let thumb = toBase64String(toBytes(getStringByKey(keyUserThumb(address))))
263293 let date = getIntegerByKey(keyUserDate(address))
264294 let json = makeJSON(name, thumb, toString(date))
265295 if (containsElement([chris, toString(this)], caller))
266296 then [StringEntry(keyUserStatus(address), statusToSet), DeleteEntry(((currentStatus + "_") + address)), StringEntry(((statusToSet + "_") + address), json), StringEntry(("user_note_" + address), note)]
267297 else throw("Not allowed to change user status")
268298 }
269299
270300
271301
272302 @Callable(invoke)
273303 func deleteUser (address) = {
274304 let caller = toString(invoke.caller)
275305 let currentStatus = getStringByKey(keyUserStatus(address))
276306 if (containsElement([chris, toString(this)], caller))
277307 then [DeleteEntry(keyUserDate(address)), DeleteEntry(keyUserAddr(address)), DeleteEntry(keyUserName(address)), DeleteEntry(keyUserDesc(address)), DeleteEntry(keyUserSocial(address)), DeleteEntry(keyUserThumb(address)), DeleteEntry(("user_note_" + address)), DeleteEntry(((currentStatus + "_") + address)), DeleteEntry(keyUserRoyalties(address)), StringEntry(keyUserStatus(address), userRemoved)]
278308 else throw("Not allowed")
279309 }
280310
281311
282312
283313 @Callable(i)
284314 func setAgent (artistAddr,agentAddr,primaryShare,secondaryShare) = if (!(dappRunning))
285315 then throw(maintenanceMSG)
286316 else {
287317 let caller = toString(i.caller)
288318 if (containsElement([chris, toString(this)], caller))
289319 then if (if ((size(artistAddr) != 35))
290320 then true
291321 else (size(agentAddr) != 35))
292322 then throw("Wrong address")
293323 else [StringEntry(keyArtistAgentAddr(artistAddr), agentAddr), StringEntry(keyAgentArtistAddr(agentAddr, artistAddr), artistAddr), IntegerEntry(keyPrimaryShare(artistAddr), primaryShare), IntegerEntry(keySecondaryShare(artistAddr), secondaryShare)]
294324 else throw("You are not allowed")
295325 }
296326
297327
298328
299329 @Callable(i)
300330 func unsetAgent (artistAddr,agentAddr) = if (!(dappRunning))
301331 then throw(maintenanceMSG)
302332 else {
303333 let caller = toString(i.caller)
304334 if (containsElement([chris, toString(this)], caller))
305335 then if (if ((size(artistAddr) != 35))
306336 then true
307337 else (size(agentAddr) != 35))
308338 then throw("Wrong address")
309339 else [DeleteEntry(keyArtistAgentAddr(artistAddr)), DeleteEntry(keyAgentArtistAddr(agentAddr, artistAddr)), DeleteEntry(keyPrimaryShare(artistAddr)), DeleteEntry(keySecondaryShare(artistAddr))]
310340 else throw("You are not allowed")
311341 }
312342
313343
314344
315345 @Callable(i)
316346 func deleteEntry (entry) = {
317347 let caller = toString(i.caller)
318348 if ((caller == chris))
319349 then [DeleteEntry(entry)]
320350 else throw("no")
321351 }
322352
323353
354+@Verifier(tx)
355+func verifier () = match tx {
356+ case inv: InvokeScriptTransaction =>
357+ if (if ((inv.function == "registerUser"))
358+ then (inv.dApp == this)
359+ else false)
360+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
361+ else if (if ((inv.function == "updateUser"))
362+ then (inv.dApp == this)
363+ else false)
364+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
365+ else if (if ((inv.function == "setERC20User"))
366+ then (inv.dApp == this)
367+ else false)
368+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
369+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
370+ case _ =>
371+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
372+}
373+

github/deemru/w8io/3ef1775 
63.85 ms