tx · 5Jn3wXhXpmoKce1n3yALwz44ayyoBV8CTdeR2FwUksof

3N8icXyy8nP599uu4C5Tydn7qwU8y9V2dP5:  -0.02100000 Waves

2023.03.13 02:00 [2487442] smart account 3N8icXyy8nP599uu4C5Tydn7qwU8y9V2dP5 > SELF 0.00000000 Waves

{ "type": 13, "id": "5Jn3wXhXpmoKce1n3yALwz44ayyoBV8CTdeR2FwUksof", "fee": 2100000, "feeAssetId": null, "timestamp": 1678662104924, "version": 2, "chainId": 84, "sender": "3N8icXyy8nP599uu4C5Tydn7qwU8y9V2dP5", "senderPublicKey": "7g2oH3HDdgHMD6FU9M7WneDyHy7VzFBYp8VswdpHQa85", "proofs": [ "bsjNCpNMcvGAGh6C431Jz5uytgcu9r3CvnhCcbm9xSNPs1i8J73grTg7sP6mDY2N9RCX4KYUJYMsVzL7gRhNdua" ], "script": "base64:BgJHCAISBAoCCAgSBAoCCAgSBgoECAgIBBIFCgMICAESBQoDBAgIEgYKBAQICAESBAoCCAgSAwoBCBIDCgEIEgQKAgEIEgMKAQgsAAxhZG1pbkFkZHJlc3MCIzNQTFZQb0I2S3NYQ3Rxb3doeldKU3Rpak53N1Nqc1BLc3E2AAVBZG1pbgkBB0FkZHJlc3MBCQDZBAEFDGFkbWluQWRkcmVzcwAFd2F2ZXMCBVdBVkVTAAZhV2F2ZXMCDGFjY2VwdF93YXZlcwAFV0FWRVMFBHVuaXQABm5mZXRBYwIMYWN0aXZhdGVfbmZ0AARtYWluAgptYWluX2Fzc2V0AAFsAglscF9hc3NldF8AA2FhMQIGcG9vbF9fAAJzYQIPU1RBS0lOR19BTU9VTlRfAAJsYQINTEVBU0VfQU1PVU5UXwACaXgCA0lEXwAHcmF0ZUZlZQIYcGVyY2VudGFnZV9yYXRlX2ZlZV9zd2FwAAxyYXRlRmVlTGltaXQCDnJhdGVfZmVlX2xpbWl0AA1yYXRlRmVlSGVpZ2h0Ag9yYXRlX2ZlZV9oZWlnaHQADmRlcG9zaXRfaGVpZ2h0AhJEZXBvc2l0X0hlaWdodF9PZl8AAmFjAghhY3RpdmF0ZQAGcG9vbEFjAg5hY3RpdmF0ZV9wb29scwAGc3dhcEFjAg1hY3RpdmF0ZV9zd2FwAAtsaXF1aWRpdHlBYwISYWN0aXZhdGVfbGlxdWlkaXR5AANiY0QCE2Jsb2NrX2Rpc3RyaWJ1aXRpb24AAkQ4CQBsBgAKAAAACAAAAAAFBkhBTEZVUAAMdG90YWxfbG9ja2VkAhRUb3RhbF9Ub2tlbnNfTG9ja2VkXwAIaW5pRXJyb3ICMlNtYXJ0IGNvbnRyYWN0IGFkbWluIGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuAQFEAQFpCAkBBXZhbHVlAQkA7AcBBQFpCGRlY2ltYWxzAQJkTQIBaQFvCQBsBgAKAAAJAGUCBQFpBQFvAAAAAAUGSEFMRlVQAQNEMTABAWkJAGwGAAoAAAgJAQV2YWx1ZQEJAOwHAQUBaQhkZWNpbWFscwAAAAAFBkhBTEZVUAENdmFsaWRhdGVBc3NldAMGYXNzZXRTC3N0cmluZ0Fzc2V0B2FjV2F2ZXMDAwkAAAIFBmFzc2V0UwUFV0FWRVMJAAACBQtzdHJpbmdBc3NldAUFd2F2ZXMHAwUHYWNXYXZlcwYJAAIBAjRUaGUgc21hcnQgY29udHJhY3QgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgV2F2ZXMuAwkAAAIFBmFzc2V0UwkA2QQBBQtzdHJpbmdBc3NldAYHAQhnZXRBc3NldAEBYQQHJG1hdGNoMAUBYQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwCQDYBAEFAWEJAAIBAiFSZXF1aXJlcyBORlQgYXMgcGF5bWVudCBmb3Igc2FsZS4BAmtwAgZhc3NldDEGYXNzZXQyCQCsAgIJAKwCAgkArAICBQNhYTEFBmFzc2V0MQIBXwUGYXNzZXQyAQp2YWxpZFBvb2xLAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBaQUHJG1hdGNoMAUBaQcBCWtwQWRkcmVzcwIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICCQCsAgIFA2tleQIBXwUHYWRkcmVzcwMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQAAAEGcG9vbEFBAwdhZGRyZXNzA2tleQVhc3NldAQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8FA2tleQIBXwUFYXNzZXQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABBmFzc2V0UAIDa2V5BWFzc2V0BAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICBQNrZXkCAV8FBWFzc2V0AwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQABARV2ZXJpZmlDb2xsZWN0aW9uRXhpc3QBAWEEByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFAWEDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFvBQckbWF0Y2gwBgcBDGdldEFzc2V0TmFtZQEHYXNzZXRJZAQHJG1hdGNoMAkA7AcBBQdhc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0BG5hbWUJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARRnZXRBc3NldElzc3VlQWRkcmVzcwEBYQQHJG1hdGNoMAkA7AcBBQFhAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0Bmlzc3VlcgkAAgECEENhbid0IGZpbmQgYXNzZXQBDnRvdGFsQXNzZXRQb29sAgNrZXkHYXNzZXRMcAQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAwUHYXNzZXRMcAUCRDgAAQEFdmFsaWQDCGFzc2V0UGF5BXBhaXIxBXBhaXIyBAhwYWlyMV81OAMJAAACBQVwYWlyMQUFd2F2ZXMFBVdBVkVTCQDZBAEFBXBhaXIxBAhwYWlyMl81OAMJAAACBQVwYWlyMgUFd2F2ZXMFBVdBVkVTCQDZBAEFBXBhaXIyAwkAAAIFCGFzc2V0UGF5BQhwYWlyMV81OAUIcGFpcjJfNTgFCHBhaXIxXzU4AQRwa2V5AwZBc3NldDEGQXNzZXQyB2FkZHJlc3MJAKwCAgkArAICCQCsAgIFDmRlcG9zaXRfaGVpZ2h0CQECa3ACBQZBc3NldDEFBkFzc2V0MgIBXwUHYWRkcmVzcwETZ2V0QW1vdW50QmxvY2tBc3NldAEHYXNzZXRJZAQHJG1hdGNoMAkAmggCBQR0aGlzBQdhc3NldElkAwkAAQIFByRtYXRjaDACA0ludAQBaQUHJG1hdGNoMAUBaQAAAQlNYWluQXNzZXQACQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBUFkbWluBQRtYWluAQ5HZXRSYXRlRmVlU3dhcAAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBUFkbWluBQdyYXRlRmVlAQlscEJsb2NrZWQCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICCVNUQUtFX0xQXwUHYWRkcmVzcwIBXwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAACwFpAQRTd2FwAgZBc3NldDEGQXNzZXQyBApjdXJyZW50S2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEB2FjV2F2ZXMJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBUFkbWluBQZhV2F2ZXMEBXBvd2VyCQERQGV4dHJOYXRpdmUoMTA1MSkCBQVBZG1pbgUCYWMEDHN3YXBBY3RpdmF0ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUFQWRtaW4FBnN3YXBBYwQHcG9vbEtleQkBAmtwAgUGQXNzZXQxBQZBc3NldDIEA2tleQkBCnZhbGlkUG9vbEsBBQdwb29sS2V5BAZhc3NldDEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQGYXNzZXQyCAkAkQMCCAUBaQhwYXltZW50cwABB2Fzc2V0SWQECWxwQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQFsCQECa3ACBQZBc3NldDEFBkFzc2V0MgQLdG90YWxBc3NldDEJAQ50b3RhbEFzc2V0UG9vbAIJAKwCAgkArAICCQECa3ACBQZBc3NldDEFBkFzc2V0MgIBXwUGQXNzZXQxBwQLdG90YWxBc3NldDIJAQ50b3RhbEFzc2V0UG9vbAIJAKwCAgkArAICCQECa3ACBQZBc3NldDEFBkFzc2V0MgIBXwUGQXNzZXQyBwQRZmVlUmF0ZVBlcmNlbnR1YWwJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBUFkbWluBQdyYXRlRmVlBAhwckFzc2V0MQkAuQICCQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQC8AgMJALYCAQUCRDgJALYCAQULdG90YWxBc3NldDIJALYCAQULdG90YWxBc3NldDEEC3ByaWNlQXNzZXQxCQCgAwEJALoCAgkAuAICBQhwckFzc2V0MQkAuQICCQC6AgIFCHByQXNzZXQxCQC2AgEFEWZlZVJhdGVQZXJjZW50dWFsCQC2AgEAZAkAtgIBBQJEOAQIcHJBc3NldDIJALkCAgkAtgIBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAvAIDCQC2AgEFAkQ4CQC2AgEFC3RvdGFsQXNzZXQxCQC2AgEFC3RvdGFsQXNzZXQyBAtwcmljZUFzc2V0MgkAoAMBCQC6AgIJALgCAgUIcHJBc3NldDIJALkCAgkAugICBQhwckFzc2V0MgkAtgIBBRFmZWVSYXRlUGVyY2VudHVhbAkAtgIBAGQJALYCAQUCRDgECXNlbmRWYWx1ZQMDCQAAAgUGYXNzZXQxBQVXQVZFUwkAAAIFBkFzc2V0MQUFd2F2ZXMHBQtwcmljZUFzc2V0MQMJAAACBQZhc3NldDEJANkEAQUGQXNzZXQxBQtwcmljZUFzc2V0MQULcHJpY2VBc3NldDIEDmFzc2V0VXBkYXRlUGF5AwkAAAIFBmFzc2V0MQUFV0FWRVMFBXdhdmVzAwkAAAIFBmFzc2V0MQkA2QQBBQZBc3NldDEFBkFzc2V0MQUGQXNzZXQyBA9hc3NldFVwZGF0ZVN3YXADCQAAAgUGYXNzZXQxBQVXQVZFUwUFd2F2ZXMDCQAAAgUGYXNzZXQxCQDZBAEFBkFzc2V0MQUGQXNzZXQyBQZBc3NldDEEDWFzc2V0U2VuZFN3YXAJAQV2YWxpZAMICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUGQXNzZXQxBQZBc3NldDIEA24xcwkAZQIJAQZhc3NldFACCQECa3ACBQZBc3NldDEFBkFzc2V0MgUPYXNzZXRVcGRhdGVTd2FwBQlzZW5kVmFsdWUEAm53CQBlAgkBE2dldEFtb3VudEJsb2NrQXNzZXQBBQ9hc3NldFVwZGF0ZVN3YXAFCXNlbmRWYWx1ZQQHbmV3VXBkYQMJAGYCAAAFA24xcwAABQNuMXMEDW5ld1VwZGF0ZVN3YXADCQBmAgAABQJudwAABQJudwQCRHgEByRtYXRjaDAICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgRVbml0BAFvBQckbWF0Y2gwCQBsBgAKAAAACAAAAAAFBkhBTEZVUAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAF4BQckbWF0Y2gwCQBsBgAKAAAICQEFdmFsdWUBCQDsBwEFAXgIZGVjaW1hbHMAAAAABQZIQUxGVVAJAAIBAgtNYXRjaCBlcnJvcgMFBXBvd2VyAwkBASEBBQxzd2FwQWN0aXZhdGUDAwkBASEBCQAAAgUGQXNzZXQxBQZBc3NldDIDCQENdmFsaWRhdGVBc3NldAMFBmFzc2V0MQUGQXNzZXQxBQdhY1dhdmVzBgkBDXZhbGlkYXRlQXNzZXQDBQZhc3NldDEFBkFzc2V0MgUHYWNXYXZlcwcDCQECIT0CBQNrZXkHAwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAEHYXNzZXRJZAkBCU1haW5Bc3NldAADCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQJAQ5HZXRSYXRlRmVlU3dhcAADAwkAZgIFC3RvdGFsQXNzZXQxAAIGCQBmAgULdG90YWxBc3NldDIAAgQTb2xkUmF0ZUZlZVN3YXBUb3RhbAQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgIFB3Bvb2xLZXkCDl9yYXRlX2ZlZV9zd2FwAwkAAQIFByRtYXRjaDACA0ludAQBbwUHJG1hdGNoMAkAZAIFAW8JAQ5HZXRSYXRlRmVlU3dhcAAJAQ5HZXRSYXRlRmVlU3dhcAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCAgFAWkGY2FsbGVyBWJ5dGVzAwkAZgIAAAUJc2VuZFZhbHVlBQJEeAUJc2VuZFZhbHVlBQ1hc3NldFNlbmRTd2FwCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9hc3NldFVwZGF0ZVN3YXAFDW5ld1VwZGF0ZVN3YXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQECa3ACBQZBc3NldDEFBkFzc2V0MgIBXwUPYXNzZXRVcGRhdGVTd2FwBQduZXdVcGRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkBAmtwAgUGQXNzZXQxBQZBc3NldDICAV8FDmFzc2V0VXBkYXRlUGF5CQBkAgkBBmFzc2V0UAIJAQJrcAIFBkFzc2V0MQUGQXNzZXQyBQ5hc3NldFVwZGF0ZVBheQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmFzc2V0VXBkYXRlUGF5CQBkAgkBE2dldEFtb3VudEJsb2NrQXNzZXQBBQ5hc3NldFVwZGF0ZVBheQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJANgEAQkBCU1haW5Bc3NldAAJAGQCCQETZ2V0QW1vdW50QmxvY2tBc3NldAEJANgEAQkBCU1haW5Bc3NldAAICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Bvb2xLZXkCDl9yYXRlX2ZlZV9zd2FwBRNvbGRSYXRlRmVlU3dhcFRvdGFsBQNuaWwJAAIBAhZQb29sIGhhcyBubyBsaXF1aWRpdHkuCQACAQkArAICCQCsAgICDVN3YXAgZGVuaWVkISAJAKQDAQkBDkdldFJhdGVGZWVTd2FwAAIkIEJpY29uIGlzIHJlcXVpcmVkIGZvciB0aGUgc3dhcCBmZWUuCQACAQISSW52YWxpZCByYXRlIGFzc2V0CQACAQIRSW52YWxpZCBTd2FwIEtleS4JAAIBAiBBc3NldDEgY2Fubm90IGJlIGVxdWFsIHRvIEFzc2V0MgkAAgECJFN3YXAgaXMgY3VycmVudGx5IHVuZGVyIG1haW50ZW5hbmNlLgkAAgECJGRBcHAgaXMgY3VycmVudGx5IHVuZGVyIG1haW50ZW5hbmNlLgFpAQxBZGRMaXF1aWRpdHkCBkFzc2V0MQZBc3NldDIEBXBvd2VyCQERQGV4dHJOYXRpdmUoMTA1MSkCBQVBZG1pbgUCYWMEDHBvb2xBY3RpdmF0ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUFQWRtaW4FBnBvb2xBYwQHYWNXYXZlcwkBEUBleHRyTmF0aXZlKDEwNTEpAgUFQWRtaW4FBmFXYXZlcwQDa2V5CQEKdmFsaWRQb29sSwEJAQJrcAIFBkFzc2V0MQUGQXNzZXQyBAZhc3NldDEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQGYXNzZXQyCAkAkQMCCAUBaQhwYXltZW50cwABB2Fzc2V0SWQECWxwQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQFsCQECa3ACBQZBc3NldDEFBkFzc2V0MgQPdG90YWxBc3NldDFQb29sAwkAZgIAAgkBDnRvdGFsQXNzZXRQb29sAgkArAICCQCsAgIJAQJrcAIFBkFzc2V0MQUGQXNzZXQyAgFfBQZBc3NldDEHCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDnRvdGFsQXNzZXRQb29sAgkArAICCQCsAgIJAQJrcAIFBkFzc2V0MQUGQXNzZXQyAgFfBQZBc3NldDEHBA90b3RhbEFzc2V0MlBvb2wDCQBmAgACCQEOdG90YWxBc3NldFBvb2wCCQCsAgIJAKwCAgkBAmtwAgUGQXNzZXQxBQZBc3NldDICAV8FBkFzc2V0MQcICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50CQEOdG90YWxBc3NldFBvb2wCCQCsAgIJAKwCAgkBAmtwAgUGQXNzZXQxBQZBc3NldDICAV8FBkFzc2V0MgcEB3RvdGFsTHAJAQ50b3RhbEFzc2V0UG9vbAIFCWxwQXNzZXRJZAYEDHByaWNlTHBBc3NldAkAaQIJAGQCBQ90b3RhbEFzc2V0MVBvb2wFD3RvdGFsQXNzZXQyUG9vbAUHdG90YWxMcAQOcXVhbnRpdHlBc3NldDIJAGgCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAaQIFD3RvdGFsQXNzZXQyUG9vbAUPdG90YWxBc3NldDFQb29sBAdyYXRlVG9wCQBkAggJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQJAGkCCQBoAggJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQAAgBkBApyYXRlQm90dG9tCQBlAggJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQJAGkCCQBoAggJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQAAgBkBAhWYWxpZGF0ZQMDAwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50BQ5xdWFudGl0eUFzc2V0MgYJAGYCBQdyYXRlVG9wCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAYJAGYCCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAUKcmF0ZUJvdHRvbQYHAwUFcG93ZXIDCQEBIQEFDHBvb2xBY3RpdmF0ZQMDAwkBASEBCQAAAgUGYXNzZXQxBQZhc3NldDIJAQ12YWxpZGF0ZUFzc2V0AwUGYXNzZXQxBQZBc3NldDEFB2FjV2F2ZXMHCQENdmFsaWRhdGVBc3NldAMFBmFzc2V0MgUGQXNzZXQyBQdhY1dhdmVzBwMJAQIhPQIFA2tleQcDBQhWYWxpZGF0ZQQKY3VycmVudEtleQkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBA1jdXJyZW50QW1vdW50CQEJa3BBZGRyZXNzAgUKY3VycmVudEtleQkBAmtwAgUGQXNzZXQxBQZBc3NldDIEE2N1cnJlbnRBbW91bnRBc3NldDEJAQZwb29sQUEDBQpjdXJyZW50S2V5CQECa3ACBQZBc3NldDEFBkFzc2V0MgUGQXNzZXQxBBNjdXJyZW50QW1vdW50QXNzZXQyCQEGcG9vbEFBAwUKY3VycmVudEtleQkBAmtwAgUGQXNzZXQxBQZBc3NldDIFBkFzc2V0MgQKYXNzZXQxcG9vbAkBBmFzc2V0UAIJAQJrcAIFBkFzc2V0MQUGQXNzZXQyBQZBc3NldDEECmFzc2V0MnBvb2wJAQZhc3NldFACCQECa3ACBQZBc3NldDEFBkFzc2V0MgUGQXNzZXQyBAlyZWNlaXZlTHADCQAAAgUPdG90YWxBc3NldDFQb29sCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAaAIAAQUCRDgJAKADAQkAugICCQC3AgIJALkCAgkAtgIBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAtgIBBQJEOAkAuQICCQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50CQC2AgEFAkQ4CQC6AgIJALcCAgkAuQICCQC2AgEFD3RvdGFsQXNzZXQxUG9vbAkAtgIBBQJEOAkAuQICCQC2AgEFD3RvdGFsQXNzZXQyUG9vbAkAtgIBBQJEOAkAtgIBBQd0b3RhbExwBBZuZXdjdXJyZW50QW1vdW50QXNzZXQxCQBkAgUTY3VycmVudEFtb3VudEFzc2V0MQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEFm5ld2N1cnJlbnRBbW91bnRBc3NldDIJAGQCBRNjdXJyZW50QW1vdW50QXNzZXQyCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAQQbmV3Y3VycmVudEFtb3VudAkAZAIFDWN1cnJlbnRBbW91bnQFCXJlY2VpdmVMcAQNbmV3YXNzZXQxcG9vbAkAZAIFCmFzc2V0MXBvb2wICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA1uZXdhc3NldDJwb29sCQBkAgUKYXNzZXQycG9vbAgJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQJAMwIAgkBB1JlaXNzdWUDCQDZBAEFCWxwQXNzZXRJZAUJcmVjZWl2ZUxwBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEICAUBaQZjYWxsZXIFYnl0ZXMFCXJlY2VpdmVMcAkA2QQBBQlscEFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQRwa2V5AwUGQXNzZXQxBQZBc3NldDIFCmN1cnJlbnRLZXkFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICBQpjdXJyZW50S2V5AgFfCQECa3ACBQZBc3NldDEFBkFzc2V0MgIBXwUGQXNzZXQxBRZuZXdjdXJyZW50QW1vdW50QXNzZXQxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIFCmN1cnJlbnRLZXkCAV8JAQJrcAIFBkFzc2V0MQUGQXNzZXQyAgFfBQZBc3NldDIFFm5ld2N1cnJlbnRBbW91bnRBc3NldDIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQECa3ACBQZBc3NldDEFBkFzc2V0MgIBXwUKY3VycmVudEtleQUQbmV3Y3VycmVudEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAQJrcAIFBkFzc2V0MQUGQXNzZXQyAgFfBQZBc3NldDEFDW5ld2Fzc2V0MXBvb2wJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQECa3ACBQZBc3NldDEFBkFzc2V0MgIBXwUGQXNzZXQyBQ1uZXdhc3NldDJwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZBc3NldDEJAGQCCQETZ2V0QW1vdW50QmxvY2tBc3NldAEFBkFzc2V0MQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFBkFzc2V0MgkAZAIJARNnZXRBbW91bnRCbG9ja0Fzc2V0AQUGQXNzZXQyCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJbHBBc3NldElkCQBkAgkBE2dldEFtb3VudEJsb2NrQXNzZXQBBQlscEFzc2V0SWQFCXJlY2VpdmVMcAUDbmlsCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICP1BheW1lbnQgb2YgaW52YWxpZCAxLzEgYW1vdW50cyB0byB0aGUgUG9vbC4gVHJ5IEFzc2V0Mjoge3ZhbHVlOgkApAMBCQBoAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAGkCBQ90b3RhbEFzc2V0MlBvb2wFD3RvdGFsQXNzZXQxUG9vbAIMfSBSZWNlaXZlZDogCQCkAwEICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50AgsgVmFsaWRhdGU6IAkApQMBBQhWYWxpZGF0ZQkAAgECEUludmFsaWQgUG9vbCBLZXkuCQACAQIgQXNzZXQxIGNhbm5vdCBiZSBlcXVhbCB0byBBc3NldDIJAAIBAilsaXF1aWRpdHkgaXMgY3VycmVudGx5IHVuZGVyIG1haW50ZW5hbmNlLgkAAgECJGRBcHAgaXMgY3VycmVudGx5IHVuZGVyIG1haW50ZW5hbmNlLgFpAQxBY3RpdmF0ZVBvb2wEBmFzc2V0MQZhc3NldDIETmFtZQpjdXN0b21OYW1lBApuYW1lQXNzZXQxAwkAAAIFBmFzc2V0MQUFd2F2ZXMFBXdhdmVzCQEMZ2V0QXNzZXROYW1lAQkA2QQBBQZhc3NldDEECm5hbWVBc3NldDIDCQAAAgUGYXNzZXQyBQV3YXZlcwUFd2F2ZXMJAQxnZXRBc3NldE5hbWUBCQDZBAEFBmFzc2V0MgQEbmFtZQMFCmN1c3RvbU5hbWUFBE5hbWUJAKwCAgkArAICBQpuYW1lQXNzZXQxAgFfBQpuYW1lQXNzZXQyBANrZXkJAQp2YWxpZFBvb2xLAQkBAmtwAgUGYXNzZXQxBQZhc3NldDIDCQAAAggFAWkGY2FsbGVyCQEUZ2V0QXNzZXRJc3N1ZUFkZHJlc3MBCQDZBAEFBmFzc2V0MQMJAQIhPQIFA2tleQcEDWFzc2V0THBDcmVhdGUJAMIIBQUEbmFtZQkArAICCQCsAgIJAKwCAgIuTFAgYXNzZXQgZm9yIHBvb2wgbGlxdWlkaXR5IGluIEJpY29uIERFWCBwYWlyIAUGYXNzZXQxAgFfBQZhc3NldDIJAGgCAAEFAkQ4AAgGBAlpZEFzc2V0THAJALgIAQUNYXNzZXRMcENyZWF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFAWwJAQJrcAIFBmFzc2V0MQUGYXNzZXQyCQDYBAEFCWlkQXNzZXRMcAkAzAgCBQ1hc3NldExwQ3JlYXRlBQNuaWwJAAIBAipJbnZhbGlkIFBvb2wgS2V5LiBUcnkgaW52ZXJ0aW5nIHRoZSBhc3NldHMJAAIBAkJPbmx5IHRoZSBpc3N1ZXIgYWRkcmVzcyBvZiBhc3NldDEgaXRzZWxmIGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbi4BaQEPUmVtb3ZlTGlxdWlkaXR5AwZBc3NldDEGQXNzZXQyBkFtb3VudAQKY3VycmVudEtleQkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBAVwb3dlcgkBEUBleHRyTmF0aXZlKDEwNTEpAgUFQWRtaW4FAmFjBAxwb29sQWN0aXZhdGUJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBUFkbWluBQZwb29sQWMEB2FjV2F2ZXMJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBUFkbWluBQZhV2F2ZXMEB3Bvb2xLZXkJAQJrcAIFBkFzc2V0MQUGQXNzZXQyBANrZXkJAQp2YWxpZFBvb2xLAQUHcG9vbEtleQQGYXNzZXQxAwkAAAIFBkFzc2V0MQUFd2F2ZXMDBQdhY1dhdmVzBQVXQVZFUwkAAgECNFRoZSBzbWFydCBjb250cmFjdCBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBXYXZlcy4JANkEAQUGQXNzZXQxBAZhc3NldDIDCQAAAgUGQXNzZXQyBQV3YXZlcwMFB2FjV2F2ZXMFBVdBVkVTCQACAQI0VGhlIHNtYXJ0IGNvbnRyYWN0IGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IFdhdmVzLgkA2QQBBQZBc3NldDIECWxwQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQFsCQECa3ACBQZBc3NldDEFBkFzc2V0MgQNY3VycmVudEFtb3VudAkBCWtwQWRkcmVzcwIFCmN1cnJlbnRLZXkJAQJrcAIFBkFzc2V0MQUGQXNzZXQyBA9hbW91bnRMcEJsb2NrZWQJAQlscEJsb2NrZWQCBQpjdXJyZW50S2V5BQdwb29sS2V5BAd0b3RhbExQCQEOdG90YWxBc3NldFBvb2wCBQlscEFzc2V0SWQGBA90b3RhbEFzc2V0MVBvb2wJAQ50b3RhbEFzc2V0UG9vbAIJAKwCAgkArAICCQECa3ACBQZBc3NldDEFBkFzc2V0MgIBXwUGQXNzZXQxBwQPdG90YWxBc3NldDJQb29sCQEOdG90YWxBc3NldFBvb2wCCQCsAgIJAKwCAgkBAmtwAgUGQXNzZXQxBQZBc3NldDICAV8FBkFzc2V0MgcDBQVwb3dlcgMJAQEhAQUMcG9vbEFjdGl2YXRlAwkBASEBCQAAAgUGQXNzZXQxBQZBc3NldDIDCQECIT0CBQNrZXkHAwkBASEBCQAAAgUNY3VycmVudEFtb3VudAAAAwkAZwIJAGUCBQ1jdXJyZW50QW1vdW50BQ9hbW91bnRMcEJsb2NrZWQFBkFtb3VudAMDCQBmAgUPdG90YWxBc3NldDFQb29sAAIGCQBmAgUPdG90YWxBc3NldDJQb29sAAIEDXJlY2VpdmVBc3NldDEJAGUCCQCgAwEJALoCAgkAuQICCQC8AgMJALYCAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJALYCAQUCRDgJALYCAQUHdG90YWxMUAkAtgIBBQ90b3RhbEFzc2V0MVBvb2wJALYCAQUCRDgAAQQNcmVjZWl2ZUFzc2V0MgkAZQIJAKADAQkAugICCQC5AgIJALwCAwkAtgIBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAtgIBBQJEOAkAtgIBBQd0b3RhbExQCQC2AgEFD3RvdGFsQXNzZXQyUG9vbAkAtgIBBQJEOAABBAphc3NldDFwb29sCQEGYXNzZXRQAgkBAmtwAgUGQXNzZXQxBQZBc3NldDIFBkFzc2V0MQQKYXNzZXQycG9vbAkBBmFzc2V0UAIJAQJrcAIFBkFzc2V0MQUGQXNzZXQyBQZBc3NldDIEE2N1cnJlbnRBbW91bnRBc3NldDEJAQZwb29sQUEDBQpjdXJyZW50S2V5CQECa3ACBQZBc3NldDEFBkFzc2V0MgUGQXNzZXQxBBNjdXJyZW50QW1vdW50QXNzZXQyCQEGcG9vbEFBAwUKY3VycmVudEtleQkBAmtwAgUGQXNzZXQxBQZBc3NldDIFBkFzc2V0MgQWbmV3Y3VycmVudEFtb3VudEFzc2V0MQkAZQIFE2N1cnJlbnRBbW91bnRBc3NldDEFDXJlY2VpdmVBc3NldDEEFm5ld2N1cnJlbnRBbW91bnRBc3NldDIJAGUCBRNjdXJyZW50QW1vdW50QXNzZXQyBQ1yZWNlaXZlQXNzZXQyBBBuZXdjdXJyZW50QW1vdW50CQBlAgUNY3VycmVudEFtb3VudAUGQW1vdW50BA1uZXdhc3NldDFwb29sCQBlAgUKYXNzZXQxcG9vbAUNcmVjZWl2ZUFzc2V0MQQNbmV3YXNzZXQycG9vbAkAZQIFCmFzc2V0MnBvb2wFDXJlY2VpdmVBc3NldDIDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCQDZBAEFCWxwQXNzZXRJZAMJAAACBQZBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJAQRCdXJuAgkA2QQBBQlscEFzc2V0SWQFBkFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEICAUBaQZjYWxsZXIFYnl0ZXMFDXJlY2VpdmVBc3NldDEFBmFzc2V0MQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEICAUBaQZjYWxsZXIFYnl0ZXMFDXJlY2VpdmVBc3NldDIFBmFzc2V0MgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBBHBrZXkDBQZBc3NldDEFBkFzc2V0MgUKY3VycmVudEtleQUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIFCmN1cnJlbnRLZXkCAV8JAQJrcAIFBkFzc2V0MQUGQXNzZXQyAgFfBQZBc3NldDEFFm5ld2N1cnJlbnRBbW91bnRBc3NldDEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgUKY3VycmVudEtleQIBXwkBAmtwAgUGQXNzZXQxBQZBc3NldDICAV8FBkFzc2V0MgUWbmV3Y3VycmVudEFtb3VudEFzc2V0MgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAQJrcAIFBkFzc2V0MQUGQXNzZXQyAgFfBQpjdXJyZW50S2V5BRBuZXdjdXJyZW50QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkBAmtwAgUGQXNzZXQxBQZBc3NldDICAV8FBkFzc2V0MQUNbmV3YXNzZXQxcG9vbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAQJrcAIFBkFzc2V0MQUGQXNzZXQyAgFfBQZBc3NldDIFDW5ld2Fzc2V0MnBvb2wJAMwIAgkBDEludGVnZXJFbnRyeQIFBkFzc2V0MQkAZQIJARNnZXRBbW91bnRCbG9ja0Fzc2V0AQUGQXNzZXQxBQ1yZWNlaXZlQXNzZXQxCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZBc3NldDIJAGUCCQETZ2V0QW1vdW50QmxvY2tBc3NldAEFBkFzc2V0MgUNcmVjZWl2ZUFzc2V0MgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJbHBBc3NldElkCQBlAgkBE2dldEFtb3VudEJsb2NrQXNzZXQBBQlscEFzc2V0SWQFBkFtb3VudAUDbmlsCQACAQkArAICAkhXaXRoZHJhd2FsIGFtb3VudCBsb3dlciB0aGFuIGFzc2V0IGxwIGFtb3VudC4gWW91ciBMcCBhbW91bnQgYXZhaWxhYmxlOiAJAKQDAQUGQW1vdW50CQACAQI5UmVxdWlyZXMgYW4gbHAgYXNzZXQgYXMgcGF5bWVudCB0byByZW1vdmUgbG9ja2VkIGFtb3VudHMuCQACAQIWUG9vbCBoYXMgbm8gbGlxdWlkaXR5LgkAAgEJAKwCAgJUQW1vdW50IHRvIGJlIHdpdGhkcmF3biBncmVhdGVyIHRoYW4gdGhlIGFtb3VudCBhdmFpbGFibGUgZm9yIHdpdGhkcmF3YWwuIEF2YWlsYWJsZTogCQCkAwEFBkFtb3VudAkAAgECK1lvdSBoYXZlIG5vIGxvY2tlZCB2YWx1ZXMg4oCL4oCLaW4gdGhlIHBvb2wJAAIBAhFJbnZhbGlkIFBvb2wgS2V5LgkAAgECIEFzc2V0MSBjYW5ub3QgYmUgZXF1YWwgdG8gQXNzZXQyCQACAQIpbGlxdWlkaXR5IGlzIGN1cnJlbnRseSB1bmRlciBtYWludGVuYW5jZS4JAAIBAiRkQXBwIGlzIGN1cnJlbnRseSB1bmRlciBtYWludGVuYW5jZS4BaQEFU3Rha2UDBHBvb2wGQXNzZXQxBkFzc2V0MgQFcG93ZXIJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBUFkbWluBQJhYwQObGlxdWlkaXR5UG93ZXIJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBUFkbWluBQtsaXF1aWRpdHlBYwQJbHBBc3NldElkAwUEcG9vbAkBEUBleHRyTmF0aXZlKDEwNTMpAgUFQWRtaW4JAKwCAgUBbAkBAmtwAgUGQXNzZXQxBQZBc3NldDIJAQlNYWluQXNzZXQABAVscEFJZAQHJG1hdGNoMAUJbHBBc3NldElkAwkAAQIFByRtYXRjaDACBlN0cmluZwQCeGkFByRtYXRjaDAJANkEAQUCeGkDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBeAUHJG1hdGNoMAUBeAkAAgECC01hdGNoIGVycm9yAwUFcG93ZXIDCQEBIQEFDmxpcXVpZGl0eVBvd2VyAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQVscEFJZAkAAgEJAKwCAgkArAICAiNJbnZhbGlkIGFzc2V0ISBLaW5kbHkgRGVwb3NpdCBPbmx5IAkA2AQBCQEJTWFpbkFzc2V0AAISIG9yIHZhbGlkIGFzc2V0IGxwAwkBASEBBQRwb29sBApjdXJyZW50S2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEDWN1cnJlbnRBbW91bnQEByRtYXRjaDAJAJoIAgUEdGhpcwUKY3VycmVudEtleQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQBaAMJAAACBQ1jdXJyZW50QW1vdW50AAAFBmhlaWdodAkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQ5kZXBvc2l0X2hlaWdodAUKY3VycmVudEtleQUGaGVpZ2h0BAluZXdBbW91bnQJAGQCBQ1jdXJyZW50QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKdXNlcmFtb3VudAkBDEludGVnZXJFbnRyeQIFCmN1cnJlbnRLZXkFCW5ld0Ftb3VudAQRdXNlcmRlcG9zaXRoZWlnaHQJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmRlcG9zaXRfaGVpZ2h0BQpjdXJyZW50S2V5BQFoBBNwcmV2aW91c2xvY2tiYWxhbmNlBAckbWF0Y2gwCQCaCAIFBHRoaXMCFFRvdGFsX1Rva2Vuc19Mb2NrZWQ6AwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABAp0b3RhbHRva2VuCQBkAgUTcHJldmlvdXNsb2NrYmFsYW5jZQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEA1RMVgkBDEludGVnZXJFbnRyeQICFFRvdGFsX1Rva2Vuc19Mb2NrZWQ6BQp0b3RhbHRva2VuCQDMCAIFCnVzZXJhbW91bnQJAMwIAgURdXNlcmRlcG9zaXRoZWlnaHQJAMwIAgUDVExWBQNuaWwEB3Bvb2xLZXkJAQJrcAIFBkFzc2V0MQUGQXNzZXQyBANrZXkJAQp2YWxpZFBvb2xLAQUHcG9vbEtleQMJAQIhPQIFA2tleQcECmN1cnJlbnRLZXkJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQNY3VycmVudEFtb3VudAQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICAglTVEFLRV9MUF8FCmN1cnJlbnRLZXkCAV8FB3Bvb2xLZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEAWgDCQAAAgUNY3VycmVudEFtb3VudAAABQZoZWlnaHQJAQt2YWx1ZU9yRWxzZQIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgUOZGVwb3NpdF9oZWlnaHQCAV8FCmN1cnJlbnRLZXkCAV8FB3Bvb2xLZXkFBmhlaWdodAQJbmV3QW1vdW50CQBkAgUNY3VycmVudEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECnVzZXJhbW91bnQJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAglTVEFLRV9MUF8FCmN1cnJlbnRLZXkCAV8FB3Bvb2xLZXkFCW5ld0Ftb3VudAQRdXNlcmRlcG9zaXRoZWlnaHQJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIFDmRlcG9zaXRfaGVpZ2h0AgFfBQpjdXJyZW50S2V5AgFfBQdwb29sS2V5BQZoZWlnaHQEE3ByZXZpb3VzbG9ja2JhbGFuY2UEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICAhdUb3RhbF9Ub2tlbnNfTFBfTG9ja2VkXwUHcG9vbEtleQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQKdG90YWx0b2tlbgkAZAIFE3ByZXZpb3VzbG9ja2JhbGFuY2UICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BANUTFYJAQxJbnRlZ2VyRW50cnkCCQCsAgICF1RvdGFsX1Rva2Vuc19MUF9Mb2NrZWRfBQdwb29sS2V5BQp0b3RhbHRva2VuCQDMCAIFCnVzZXJhbW91bnQJAMwIAgURdXNlcmRlcG9zaXRoZWlnaHQJAMwIAgUDVExWBQNuaWwJAAIBAhFJbnZhbGlkIFBvb2wga2V5LgkAAgECKWxpcXVpZGl0eSBpcyBjdXJyZW50bHkgdW5kZXIgbWFpbnRlbmFuY2UuCQACAQIkZEFwcCBpcyBjdXJyZW50bHkgdW5kZXIgbWFpbnRlbmFuY2UuAWkBB1Vuc3Rha2UEBHBvb2wGQXNzZXQxBkFzc2V0MgZhbW91bnQEBXBvd2VyCQERQGV4dHJOYXRpdmUoMTA1MSkCBQVBZG1pbgUCYWMEDmxpcXVpZGl0eVBvd2VyCQERQGV4dHJOYXRpdmUoMTA1MSkCBQVBZG1pbgULbGlxdWlkaXR5QWMEB3Bvb2xLZXkJAQJrcAIFBkFzc2V0MQUGQXNzZXQyBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAMFBXBvd2VyAwkBASEBBQ5saXF1aWRpdHlQb3dlcgQKY3VycmVudEtleQkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBA1jdXJyZW50QW1vdW50BAckbWF0Y2gwAwUEcG9vbAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgIJU1RBS0VfTFBfBQpjdXJyZW50S2V5AgFfCQECa3ACBQZBc3NldDEFBkFzc2V0MgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUKY3VycmVudEtleQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQRc3dhcGhlaWdodGtleW5hbWUDBQRwb29sCQCsAgIJAKwCAgkArAICCQCsAgIFDmRlcG9zaXRfaGVpZ2h0AgFfBQpjdXJyZW50S2V5AgFfCQECa3ACBQZBc3NldDEFBkFzc2V0MgkArAICBQ5kZXBvc2l0X2hlaWdodAUKY3VycmVudEtleQQTcHJldmlvdXNsb2NrYmFsYW5jZQMFBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgIXVG90YWxfVG9rZW5zX0xQX0xvY2tlZF8JAQJrcAIFBkFzc2V0MQUGQXNzZXQyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAhRUb3RhbF9Ub2tlbnNfTG9ja2VkOgQKdG90YWx0b2tlbgkAZQIFE3ByZXZpb3VzbG9ja2JhbGFuY2UFBmFtb3VudAQEZGlmZgkAZQIFBmhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwURc3dhcGhlaWdodGtleW5hbWUEA2JjZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUDYmNEBAZyZXdhcmQJAGgCCQBoAgUEZGlmZgUDYmNkBQJEOAQDb29kBAckbWF0Y2gwCQCfCAEJAKwCAgUHcG9vbEtleQIOX3JhdGVfZmVlX3N3YXADCQABAgUHJG1hdGNoMAIDSW50BAJpdwUHJG1hdGNoMAUCaXcAAAQEb2xkVAQHJG1hdGNoMAkAnwgBCQCsAgIFB3Bvb2xLZXkCDl9yYXRlX2ZlZV9zd2FwAwkAAQIFByRtYXRjaDACA0ludAQDaWRkBQckbWF0Y2gwCQBpAgUDaWRkCQBpAgUTcHJldmlvdXNsb2NrYmFsYW5jZQUGYW1vdW50AAAEB2ZlZUNhbGMDCQAAAgUGQXNzZXQxCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQRtYWluCQBpAgUGcmV3YXJkCQBpAgUTcHJldmlvdXNsb2NrYmFsYW5jZQUGYW1vdW50BQRvbGRUAwkAZgIAAAUGYW1vdW50CQACAQMFBHBvb2wJAKwCAgkArAICCQCsAgIJAKwCAgIYQ2FuJ3Qgd2l0aGRyYXcgbmVnYXRpdmUgBQZBc3NldDECAS8FBkFzc2V0MgIHIGFtb3VudAIjQ2FuJ3Qgd2l0aGRyYXcgbmVnYXRpdmUgQXhBaSBhbW91bnQECW5ld0Ftb3VudAkAZQIFDWN1cnJlbnRBbW91bnQFBmFtb3VudAMJAGYCAAAFCW5ld0Ftb3VudAkAAgEDBQRwb29sCQCsAgIJAKwCAgkArAICCQCsAgICFE5vdCBlbm91Z2ggQXNzZXQgTHAgBQZBc3NldDECAS8FBkFzc2V0MgIIIGJhbGFuY2UCF05vdCBlbm91Z2ggQXhBaSBiYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAwUEcG9vbAkArAICCQCsAgIJAKwCAgIJU1RBS0VfTFBfBQpjdXJyZW50S2V5AgFfCQECa3ACBQZBc3NldDEFBkFzc2V0MgUKY3VycmVudEtleQUJbmV3QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCAwUEcG9vbAkArAICAhdUb3RhbF9Ub2tlbnNfTFBfTG9ja2VkXwkBAmtwAgUGQXNzZXQxBQZBc3NldDICFFRvdGFsX1Rva2Vuc19Mb2NrZWQ6BQp0b3RhbHRva2VuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50AwUEcG9vbAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFAWwJAQJrcAIFBkFzc2V0MQUGQXNzZXQyCQEJTWFpbkFzc2V0AAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2ZlZUNhbGMJAQlNYWluQXNzZXQACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Bvb2xLZXkCDl9yYXRlX2ZlZV9zd2FwCQBlAgUDb29kBQRvbGRUBQNuaWwJAAIBAilsaXF1aWRpdHkgaXMgY3VycmVudGx5IHVuZGVyIG1haW50ZW5hbmNlLgkAAgECJGRBcHAgaXMgY3VycmVudGx5IHVuZGVyIG1haW50ZW5hbmNlLgFpAQlDcmVhdGVORlQCBG5hbWUEaXBmcwQEc2hhaAkA9wMBCQDZBAEFBGlwZnMJAMwIAgkAwggFBQRuYW1lCQCsAgIJAKwCAgkArAICCQCsAgICCXsnaXBmcyc6JwUEaXBmcwIOJywnU0hBLUhBU0gnOicJANgEAQUEc2hhaAICJ30AAQAABwUDbmlsAWkBBkJ1eU5GVAEFTkZUSWQEBXBvd2VyCQERQGV4dHJOYXRpdmUoMTA1MSkCBQVBZG1pbgUCYWMEBG5mdG0JARFAZXh0ck5hdGl2ZSgxMDUxKQIFBUFkbWluBQZuZmV0QWMEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAVwcmljZQQHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQVORlRJZAIHX3Rvc2FsZQMJAAECBQckbWF0Y2gwAgNJbnQEAmlzBQckbWF0Y2gwBQJpcwAABAVhc3NldAQHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVORlRJZAIKX2Fzc2V0c2FsZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDADAwkAAAIFAXMCBVdBVkVTBgkAAAIFAXMCBXdhdmVzBQVXQVZFUwkA2QQBBQFzCQACAQIXTkZUIG5vdCBsaXN0ZWQgZm9yIHNhbGUECm9sZEFkZHJlc3MEByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFTkZUSWQCCF9hZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwkAAgECF05GVCBub3QgbGlzdGVkIGZvciBzYWxlAwUFcG93ZXIDCQEBIQEFBG5mdG0DCQECIT0CBQVwcmljZQAAAwkAAAIFBXByaWNlCAUDcG10BmFtb3VudAMJAAACCAUDcG10B2Fzc2V0SWQFBWFzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBU5GVElkAgdfdG9zYWxlAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUFTkZUSWQCBl9zYWxlZAYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQVORlRJZAINX2FkZHJlc3NfU0FsZQIACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUFTkZUSWQCCl9hc3NldHNhbGUFBU5GVElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUFTkZUSWQCCF9hZGRyZXNzCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEJANkEAQUFTkZUSWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFCm9sZEFkZHJlc3MIBQNwbXQGYW1vdW50BQVhc3NldAUDbmlsCQACAQJKQXNzZXQgbm90IGVxdWFsIHRvIHRoZSBhc3NldCBkZWZpbmVkIGFzIGEgcGF5bWVudCBtZXRob2QgYnkgdGhlIE5GVCBpc3N1ZXIJAAIBAh1WYWx1ZSBub3QgZXF1YWwgdG8gc2FsZSB2YWx1ZQkAAgECGVRoaXMgTkZUIGlzIG5vdCBmb3Igc2FsZS4JAAIBAiNORlQgaXMgY3VycmVudGx5IHVuZGVyIG1haW50ZW5hbmNlLgkAAgECJGRBcHAgaXMgY3VycmVudGx5IHVuZGVyIG1haW50ZW5hbmNlLgFpAQxSZW1vdmVUb1NlbGwBBU5GVElkBAVwb3dlcgkBEUBleHRyTmF0aXZlKDEwNTEpAgUFQWRtaW4FAmFjBARuZnRtCQERQGV4dHJOYXRpdmUoMTA1MSkCBQVBZG1pbgUGbmZldEFjBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAMFBXBvd2VyAwkBASEBBQRuZnRtAwkAAAIJARRnZXRBc3NldElzc3VlQWRkcmVzcwEJANkEAQUFTkZUSWQIBQFpBmNhbGxlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBU5GVElkAgdfdG9zYWxlCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUFTkZUSWQCBl9zYWxlZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBU5GVElkAg1fYWRkcmVzc19TQWxlCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUFTkZUSWQCCl9hc3NldHNhbGUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQVORlRJZAIIX2FkZHJlc3MFA25pbAkAAgECNk9ubHkgdGhlIG93bmVyIG9mIHRoZSBORlQgY2FuIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LgkAAgECI05GVCBpcyBjdXJyZW50bHkgdW5kZXIgbWFpbnRlbmFuY2UuCQACAQIkZEFwcCBpcyBjdXJyZW50bHkgdW5kZXIgbWFpbnRlbmFuY2UuAWkBB1NlbGxORlQCBVByaWNlBWFzc2V0BAVwb3dlcgkBEUBleHRyTmF0aXZlKDEwNTEpAgUFQWRtaW4FAmFjBARuZnRtCQERQGV4dHJOYXRpdmUoMTA1MSkCBQVBZG1pbgUGbmZldEFjBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAMFBXBvd2VyAwkBASEBBQRuZnRtAwMJAAACCAUDcG10BmFtb3VudAAABgkAAAIIBQNwbXQHYXNzZXRJZAUFV0FWRVMJAAIBAipSZXF1aXJlcyBORlQgYXMgdHJhbnNmZXIgcGF5bWVudCBmb3Igc2FsZS4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkBCGdldEFzc2V0AQgFA3BtdAdhc3NldElkAgdfdG9zYWxlBQVQcmljZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQEIZ2V0QXNzZXQBCAUDcG10B2Fzc2V0SWQCBl9zYWxlZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQEIZ2V0QXNzZXQBCAUDcG10B2Fzc2V0SWQCDV9hZGRyZXNzX1NBbGUCAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAQhnZXRBc3NldAEIBQNwbXQHYXNzZXRJZAIKX2Fzc2V0c2FsZQUFYXNzZXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQEIZ2V0QXNzZXQBCAUDcG10B2Fzc2V0SWQCCF9hZGRyZXNzCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMFA25pbAkAAgECI05GVCBpcyBjdXJyZW50bHkgdW5kZXIgbWFpbnRlbmFuY2UuCQACAQIkZEFwcCBpcyBjdXJyZW50bHkgdW5kZXIgbWFpbnRlbmFuY2UuAWkBEENyZWF0ZUNvbGxlY3Rpb24BDmNvbGxlY3Rpb25OYW1lBApjdXJyZW50S2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEAnRjBAckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFCmN1cnJlbnRLZXkCEV90b3RhbF9jb2xsZWN0aW9uAwkAAQIFByRtYXRjaDACA0ludAQCYWkFByRtYXRjaDAFAmFpAAADCQEVdmVyaWZpQ29sbGVjdGlvbkV4aXN0AQUOY29sbGVjdGlvbk5hbWUJAAIBAkNFcnJvcjogQSBjb2xsZWN0aW9uIHdpdGggdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzLCB0cnkgYW5vdGhlciBvbmUuCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmNvbGxlY3Rpb25OYW1lBQpjdXJyZW50S2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmN1cnJlbnRLZXkCEV90b3RhbF9jb2xsZWN0aW9uCQBkAgUCdGMAAQUDbmlsAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tlefOJwVI=", "height": 2487442, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BDuVYzSWcXc3Vm6kdnQkVW56UbSDdKh6AJ7Frmmi5Fbo Next: EdjjTgyzwHjCFsQ7UERKWeNsBq3KsRPKJfyR9PzytBA6 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let adminAddress = "3N8UaqrCTjypGPWXSvFJVSLv23bfuiPoJAh"
4+let adminAddress = "3PLVPoB6KsXCtqowhzWJStijNw7SjsPKsq6"
55
66 let Admin = Address(fromBase58String(adminAddress))
77
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let adminAddress = "3N8UaqrCTjypGPWXSvFJVSLv23bfuiPoJAh"
4+let adminAddress = "3PLVPoB6KsXCtqowhzWJStijNw7SjsPKsq6"
55
66 let Admin = Address(fromBase58String(adminAddress))
77
88 let waves = "WAVES"
99
1010 let aWaves = "accept_waves"
1111
1212 let WAVES = unit
1313
1414 let nfetAc = "activate_nft"
1515
1616 let main = "main_asset"
1717
1818 let l = "lp_asset_"
1919
2020 let aa1 = "pool__"
2121
2222 let sa = "STAKING_AMOUNT_"
2323
2424 let la = "LEASE_AMOUNT_"
2525
2626 let ix = "ID_"
2727
2828 let rateFee = "percentage_rate_fee_swap"
2929
3030 let rateFeeLimit = "rate_fee_limit"
3131
3232 let rateFeeHeight = "rate_fee_height"
3333
3434 let deposit_height = "Deposit_Height_Of_"
3535
3636 let ac = "activate"
3737
3838 let poolAc = "activate_pools"
3939
4040 let swapAc = "activate_swap"
4141
4242 let liquidityAc = "activate_liquidity"
4343
4444 let bcD = "block_distribuition"
4545
4646 let D8 = pow(10, 0, 8, 0, 0, HALFUP)
4747
4848 let total_locked = "Total_Tokens_Locked_"
4949
5050 let iniError = "Smart contract admin has not yet been initialized."
5151
5252 func D (i) = value(assetInfo(i)).decimals
5353
5454
5555 func dM (i,o) = pow(10, 0, (i - o), 0, 0, HALFUP)
5656
5757
5858 func D10 (i) = pow(10, 0, value(assetInfo(i)).decimals, 0, 0, HALFUP)
5959
6060
6161 func validateAsset (assetS,stringAsset,acWaves) = if (if ((assetS == WAVES))
6262 then (stringAsset == waves)
6363 else false)
6464 then if (acWaves)
6565 then true
6666 else throw("The smart contract does not currently support Waves.")
6767 else if ((assetS == fromBase58String(stringAsset)))
6868 then true
6969 else false
7070
7171
7272 func getAsset (a) = match a {
7373 case a: ByteVector =>
7474 toBase58String(a)
7575 case _ =>
7676 throw("Requires NFT as payment for sale.")
7777 }
7878
7979
8080 func kp (asset1,asset2) = (((aa1 + asset1) + "_") + asset2)
8181
8282
8383 func validPoolK (key) = match getInteger(this, key) {
8484 case i: Int =>
8585 i
8686 case _ =>
8787 false
8888 }
8989
9090
9191 func kpAddress (address,key) = match getInteger(this, ((key + "_") + address)) {
9292 case t: Int =>
9393 t
9494 case _ =>
9595 0
9696 }
9797
9898
9999 func poolAA (address,key,asset) = match getInteger(this, ((((address + "_") + key) + "_") + asset)) {
100100 case a: Int =>
101101 a
102102 case _ =>
103103 0
104104 }
105105
106106
107107 func assetP (key,asset) = match getInteger(this, ((key + "_") + asset)) {
108108 case a: Int =>
109109 a
110110 case _ =>
111111 1
112112 }
113113
114114
115115 func verifiCollectionExist (a) = match getStringValue(this, a) {
116116 case o: String =>
117117 true
118118 case _ =>
119119 false
120120 }
121121
122122
123123 func getAssetName (assetId) = match assetInfo(assetId) {
124124 case asset: Asset =>
125125 asset.name
126126 case _ =>
127127 throw("Can't find asset")
128128 }
129129
130130
131131 func getAssetIssueAddress (a) = match assetInfo(a) {
132132 case asset: Asset =>
133133 asset.issuer
134134 case _ =>
135135 throw("Can't find asset")
136136 }
137137
138138
139139 func totalAssetPool (key,assetLp) = match getInteger(this, key) {
140140 case a: Int =>
141141 a
142142 case _ =>
143143 if (assetLp)
144144 then D8
145145 else 1
146146 }
147147
148148
149149 func valid (assetPay,pair1,pair2) = {
150150 let pair1_58 = if ((pair1 == waves))
151151 then WAVES
152152 else fromBase58String(pair1)
153153 let pair2_58 = if ((pair2 == waves))
154154 then WAVES
155155 else fromBase58String(pair2)
156156 if ((assetPay == pair1_58))
157157 then pair2_58
158158 else pair1_58
159159 }
160160
161161
162162 func pkey (Asset1,Asset2,address) = (((deposit_height + kp(Asset1, Asset2)) + "_") + address)
163163
164164
165165 func getAmountBlockAsset (assetId) = match getInteger(this, assetId) {
166166 case i: Int =>
167167 i
168168 case _ =>
169169 0
170170 }
171171
172172
173173 func MainAsset () = fromBase58String(getStringValue(Admin, main))
174174
175175
176176 func GetRateFeeSwap () = getIntegerValue(Admin, rateFee)
177177
178178
179179 func lpBlocked (address,key) = match getInteger(this, ((("STAKE_LP_" + address) + "_") + key)) {
180180 case a: Int =>
181181 a
182182 case _ =>
183183 0
184184 }
185185
186186
187187 @Callable(i)
188188 func Swap (Asset1,Asset2) = {
189189 let currentKey = toBase58String(i.caller.bytes)
190190 let acWaves = getBooleanValue(Admin, aWaves)
191191 let power = getBooleanValue(Admin, ac)
192192 let swapActivate = getBooleanValue(Admin, swapAc)
193193 let poolKey = kp(Asset1, Asset2)
194194 let key = validPoolK(poolKey)
195195 let asset1 = i.payments[0].assetId
196196 let asset2 = i.payments[1].assetId
197197 let lpAssetId = getIntegerValue(this, (l + kp(Asset1, Asset2)))
198198 let totalAsset1 = totalAssetPool(((kp(Asset1, Asset2) + "_") + Asset1), false)
199199 let totalAsset2 = totalAssetPool(((kp(Asset1, Asset2) + "_") + Asset2), false)
200200 let feeRatePercentual = getIntegerValue(Admin, rateFee)
201201 let prAsset1 = (toBigInt(i.payments[0].amount) * fraction(toBigInt(D8), toBigInt(totalAsset2), toBigInt(totalAsset1)))
202202 let priceAsset1 = toInt(((prAsset1 - ((prAsset1 / toBigInt(feeRatePercentual)) * toBigInt(100))) / toBigInt(D8)))
203203 let prAsset2 = (toBigInt(i.payments[0].amount) * fraction(toBigInt(D8), toBigInt(totalAsset1), toBigInt(totalAsset2)))
204204 let priceAsset2 = toInt(((prAsset2 - ((prAsset2 / toBigInt(feeRatePercentual)) * toBigInt(100))) / toBigInt(D8)))
205205 let sendValue = if (if ((asset1 == WAVES))
206206 then (Asset1 == waves)
207207 else false)
208208 then priceAsset1
209209 else if ((asset1 == fromBase58String(Asset1)))
210210 then priceAsset1
211211 else priceAsset2
212212 let assetUpdatePay = if ((asset1 == WAVES))
213213 then waves
214214 else if ((asset1 == fromBase58String(Asset1)))
215215 then Asset1
216216 else Asset2
217217 let assetUpdateSwap = if ((asset1 == WAVES))
218218 then waves
219219 else if ((asset1 == fromBase58String(Asset1)))
220220 then Asset2
221221 else Asset1
222222 let assetSendSwap = valid(i.payments[0].assetId, Asset1, Asset2)
223223 let n1s = (assetP(kp(Asset1, Asset2), assetUpdateSwap) - sendValue)
224224 let nw = (getAmountBlockAsset(assetUpdateSwap) - sendValue)
225225 let newUpda = if ((0 > n1s))
226226 then 0
227227 else n1s
228228 let newUpdateSwap = if ((0 > nw))
229229 then 0
230230 else nw
231231 let Dx = match i.payments[0].assetId {
232232 case o: Unit =>
233233 pow(10, 0, 8, 0, 0, HALFUP)
234234 case x: ByteVector =>
235235 pow(10, 0, value(assetInfo(x)).decimals, 0, 0, HALFUP)
236236 case _ =>
237237 throw("Match error")
238238 }
239239 if (power)
240240 then if (!(swapActivate))
241241 then if (if (!((Asset1 == Asset2)))
242242 then if (validateAsset(asset1, Asset1, acWaves))
243243 then true
244244 else validateAsset(asset1, Asset2, acWaves)
245245 else false)
246246 then if ((key != false))
247247 then if ((i.payments[1].assetId == MainAsset()))
248248 then if ((i.payments[1].amount == GetRateFeeSwap()))
249249 then if (if ((totalAsset1 > 2))
250250 then true
251251 else (totalAsset2 > 2))
252252 then {
253253 let oldRateFeeSwapTotal = match getInteger(this, (poolKey + "_rate_fee_swap")) {
254254 case o: Int =>
255255 (o + GetRateFeeSwap())
256256 case _ =>
257257 GetRateFeeSwap()
258258 }
259259 [ScriptTransfer(Address(i.caller.bytes), if ((0 > sendValue))
260260 then Dx
261261 else sendValue, assetSendSwap), IntegerEntry(assetUpdateSwap, newUpdateSwap), IntegerEntry(((kp(Asset1, Asset2) + "_") + assetUpdateSwap), newUpda), IntegerEntry(((kp(Asset1, Asset2) + "_") + assetUpdatePay), (assetP(kp(Asset1, Asset2), assetUpdatePay) + i.payments[0].amount)), IntegerEntry(assetUpdatePay, (getAmountBlockAsset(assetUpdatePay) + i.payments[0].amount)), IntegerEntry(toBase58String(MainAsset()), (getAmountBlockAsset(toBase58String(MainAsset())) + i.payments[1].amount)), IntegerEntry((poolKey + "_rate_fee_swap"), oldRateFeeSwapTotal)]
262262 }
263263 else throw("Pool has no liquidity.")
264264 else throw((("Swap denied! " + toString(GetRateFeeSwap())) + " Bicon is required for the swap fee."))
265265 else throw("Invalid rate asset")
266266 else throw("Invalid Swap Key.")
267267 else throw("Asset1 cannot be equal to Asset2")
268268 else throw("Swap is currently under maintenance.")
269269 else throw("dApp is currently under maintenance.")
270270 }
271271
272272
273273
274274 @Callable(i)
275275 func AddLiquidity (Asset1,Asset2) = {
276276 let power = getBooleanValue(Admin, ac)
277277 let poolActivate = getBooleanValue(Admin, poolAc)
278278 let acWaves = getBooleanValue(Admin, aWaves)
279279 let key = validPoolK(kp(Asset1, Asset2))
280280 let asset1 = i.payments[0].assetId
281281 let asset2 = i.payments[1].assetId
282282 let lpAssetId = getStringValue(this, (l + kp(Asset1, Asset2)))
283283 let totalAsset1Pool = if ((2 > totalAssetPool(((kp(Asset1, Asset2) + "_") + Asset1), false)))
284284 then i.payments[0].amount
285285 else totalAssetPool(((kp(Asset1, Asset2) + "_") + Asset1), false)
286286 let totalAsset2Pool = if ((2 > totalAssetPool(((kp(Asset1, Asset2) + "_") + Asset1), false)))
287287 then i.payments[1].amount
288288 else totalAssetPool(((kp(Asset1, Asset2) + "_") + Asset2), false)
289289 let totalLp = totalAssetPool(lpAssetId, true)
290290 let priceLpAsset = ((totalAsset1Pool + totalAsset2Pool) / totalLp)
291291 let quantityAsset2 = (i.payments[0].amount * (totalAsset2Pool / totalAsset1Pool))
292292 let rateTop = (i.payments[1].amount + ((i.payments[1].amount * 2) / 100))
293293 let rateBottom = (i.payments[1].amount - ((i.payments[1].amount * 2) / 100))
294294 let Validate = if (if (if ((i.payments[1].amount == quantityAsset2))
295295 then true
296296 else (rateTop > i.payments[1].amount))
297297 then true
298298 else (i.payments[1].amount > rateBottom))
299299 then true
300300 else false
301301 if (power)
302302 then if (!(poolActivate))
303303 then if (if (if (!((asset1 == asset2)))
304304 then validateAsset(asset1, Asset1, acWaves)
305305 else false)
306306 then validateAsset(asset2, Asset2, acWaves)
307307 else false)
308308 then if ((key != false))
309309 then if (Validate)
310310 then {
311311 let currentKey = toBase58String(i.caller.bytes)
312312 let currentAmount = kpAddress(currentKey, kp(Asset1, Asset2))
313313 let currentAmountAsset1 = poolAA(currentKey, kp(Asset1, Asset2), Asset1)
314314 let currentAmountAsset2 = poolAA(currentKey, kp(Asset1, Asset2), Asset2)
315315 let asset1pool = assetP(kp(Asset1, Asset2), Asset1)
316316 let asset2pool = assetP(kp(Asset1, Asset2), Asset2)
317317 let receiveLp = if ((totalAsset1Pool == i.payments[0].amount))
318318 then (1 * D8)
319319 else toInt((((toBigInt(i.payments[0].amount) * toBigInt(D8)) + (toBigInt(i.payments[1].amount) * toBigInt(D8))) / (((toBigInt(totalAsset1Pool) * toBigInt(D8)) + (toBigInt(totalAsset2Pool) * toBigInt(D8))) / toBigInt(totalLp))))
320320 let newcurrentAmountAsset1 = (currentAmountAsset1 + i.payments[0].amount)
321321 let newcurrentAmountAsset2 = (currentAmountAsset2 + i.payments[1].amount)
322322 let newcurrentAmount = (currentAmount + receiveLp)
323323 let newasset1pool = (asset1pool + i.payments[0].amount)
324324 let newasset2pool = (asset2pool + i.payments[1].amount)
325325 [Reissue(fromBase58String(lpAssetId), receiveLp, true), ScriptTransfer(Address(i.caller.bytes), receiveLp, fromBase58String(lpAssetId)), IntegerEntry(pkey(Asset1, Asset2, currentKey), height), IntegerEntry(((((currentKey + "_") + kp(Asset1, Asset2)) + "_") + Asset1), newcurrentAmountAsset1), IntegerEntry(((((currentKey + "_") + kp(Asset1, Asset2)) + "_") + Asset2), newcurrentAmountAsset2), IntegerEntry(((kp(Asset1, Asset2) + "_") + currentKey), newcurrentAmount), IntegerEntry(((kp(Asset1, Asset2) + "_") + Asset1), newasset1pool), IntegerEntry(((kp(Asset1, Asset2) + "_") + Asset2), newasset2pool), IntegerEntry(Asset1, (getAmountBlockAsset(Asset1) + i.payments[0].amount)), IntegerEntry(Asset2, (getAmountBlockAsset(Asset2) + i.payments[1].amount)), IntegerEntry(lpAssetId, (getAmountBlockAsset(lpAssetId) + receiveLp))]
326326 }
327327 else throw(((((("Payment of invalid 1/1 amounts to the Pool. Try Asset2: {value:" + toString((i.payments[0].amount * (totalAsset2Pool / totalAsset1Pool)))) + "} Received: ") + toString(i.payments[1].amount)) + " Validate: ") + toString(Validate)))
328328 else throw("Invalid Pool Key.")
329329 else throw("Asset1 cannot be equal to Asset2")
330330 else throw("liquidity is currently under maintenance.")
331331 else throw("dApp is currently under maintenance.")
332332 }
333333
334334
335335
336336 @Callable(i)
337337 func ActivatePool (asset1,asset2,Name,customName) = {
338338 let nameAsset1 = if ((asset1 == waves))
339339 then waves
340340 else getAssetName(fromBase58String(asset1))
341341 let nameAsset2 = if ((asset2 == waves))
342342 then waves
343343 else getAssetName(fromBase58String(asset2))
344344 let name = if (customName)
345345 then Name
346346 else ((nameAsset1 + "_") + nameAsset2)
347347 let key = validPoolK(kp(asset1, asset2))
348348 if ((i.caller == getAssetIssueAddress(fromBase58String(asset1))))
349349 then if ((key != false))
350350 then {
351351 let assetLpCreate = Issue(name, ((("LP asset for pool liquidity in Bicon DEX pair " + asset1) + "_") + asset2), (1 * D8), 8, true)
352352 let idAssetLp = calculateAssetId(assetLpCreate)
353353 [StringEntry((l + kp(asset1, asset2)), toBase58String(idAssetLp)), assetLpCreate]
354354 }
355355 else throw("Invalid Pool Key. Try inverting the assets")
356356 else throw("Only the issuer address of asset1 itself can invoke this function.")
357357 }
358358
359359
360360
361361 @Callable(i)
362362 func RemoveLiquidity (Asset1,Asset2,Amount) = {
363363 let currentKey = toBase58String(i.caller.bytes)
364364 let power = getBooleanValue(Admin, ac)
365365 let poolActivate = getBooleanValue(Admin, poolAc)
366366 let acWaves = getBooleanValue(Admin, aWaves)
367367 let poolKey = kp(Asset1, Asset2)
368368 let key = validPoolK(poolKey)
369369 let asset1 = if ((Asset1 == waves))
370370 then if (acWaves)
371371 then WAVES
372372 else throw("The smart contract does not currently support Waves.")
373373 else fromBase58String(Asset1)
374374 let asset2 = if ((Asset2 == waves))
375375 then if (acWaves)
376376 then WAVES
377377 else throw("The smart contract does not currently support Waves.")
378378 else fromBase58String(Asset2)
379379 let lpAssetId = getStringValue(this, (l + kp(Asset1, Asset2)))
380380 let currentAmount = kpAddress(currentKey, kp(Asset1, Asset2))
381381 let amountLpBlocked = lpBlocked(currentKey, poolKey)
382382 let totalLP = totalAssetPool(lpAssetId, true)
383383 let totalAsset1Pool = totalAssetPool(((kp(Asset1, Asset2) + "_") + Asset1), false)
384384 let totalAsset2Pool = totalAssetPool(((kp(Asset1, Asset2) + "_") + Asset2), false)
385385 if (power)
386386 then if (!(poolActivate))
387387 then if (!((Asset1 == Asset2)))
388388 then if ((key != false))
389389 then if (!((currentAmount == 0)))
390390 then if (((currentAmount - amountLpBlocked) >= Amount))
391391 then if (if ((totalAsset1Pool > 2))
392392 then true
393393 else (totalAsset2Pool > 2))
394394 then {
395395 let receiveAsset1 = (toInt(((fraction(toBigInt(i.payments[0].amount), toBigInt(D8), toBigInt(totalLP)) * toBigInt(totalAsset1Pool)) / toBigInt(D8))) - 1)
396396 let receiveAsset2 = (toInt(((fraction(toBigInt(i.payments[0].amount), toBigInt(D8), toBigInt(totalLP)) * toBigInt(totalAsset2Pool)) / toBigInt(D8))) - 1)
397397 let asset1pool = assetP(kp(Asset1, Asset2), Asset1)
398398 let asset2pool = assetP(kp(Asset1, Asset2), Asset2)
399399 let currentAmountAsset1 = poolAA(currentKey, kp(Asset1, Asset2), Asset1)
400400 let currentAmountAsset2 = poolAA(currentKey, kp(Asset1, Asset2), Asset2)
401401 let newcurrentAmountAsset1 = (currentAmountAsset1 - receiveAsset1)
402402 let newcurrentAmountAsset2 = (currentAmountAsset2 - receiveAsset2)
403403 let newcurrentAmount = (currentAmount - Amount)
404404 let newasset1pool = (asset1pool - receiveAsset1)
405405 let newasset2pool = (asset2pool - receiveAsset2)
406406 if ((i.payments[0].assetId == fromBase58String(lpAssetId)))
407407 then if ((Amount == i.payments[0].amount))
408408 then [Burn(fromBase58String(lpAssetId), Amount), ScriptTransfer(Address(i.caller.bytes), receiveAsset1, asset1), ScriptTransfer(Address(i.caller.bytes), receiveAsset2, asset2), IntegerEntry(pkey(Asset1, Asset2, currentKey), height), IntegerEntry(((((currentKey + "_") + kp(Asset1, Asset2)) + "_") + Asset1), newcurrentAmountAsset1), IntegerEntry(((((currentKey + "_") + kp(Asset1, Asset2)) + "_") + Asset2), newcurrentAmountAsset2), IntegerEntry(((kp(Asset1, Asset2) + "_") + currentKey), newcurrentAmount), IntegerEntry(((kp(Asset1, Asset2) + "_") + Asset1), newasset1pool), IntegerEntry(((kp(Asset1, Asset2) + "_") + Asset2), newasset2pool), IntegerEntry(Asset1, (getAmountBlockAsset(Asset1) - receiveAsset1)), IntegerEntry(Asset2, (getAmountBlockAsset(Asset2) - receiveAsset2)), IntegerEntry(lpAssetId, (getAmountBlockAsset(lpAssetId) - Amount))]
409409 else throw(("Withdrawal amount lower than asset lp amount. Your Lp amount available: " + toString(Amount)))
410410 else throw("Requires an lp asset as payment to remove locked amounts.")
411411 }
412412 else throw("Pool has no liquidity.")
413413 else throw(("Amount to be withdrawn greater than the amount available for withdrawal. Available: " + toString(Amount)))
414414 else throw("You have no locked values ​​in the pool")
415415 else throw("Invalid Pool Key.")
416416 else throw("Asset1 cannot be equal to Asset2")
417417 else throw("liquidity is currently under maintenance.")
418418 else throw("dApp is currently under maintenance.")
419419 }
420420
421421
422422
423423 @Callable(i)
424424 func Stake (pool,Asset1,Asset2) = {
425425 let power = getBooleanValue(Admin, ac)
426426 let liquidityPower = getBooleanValue(Admin, liquidityAc)
427427 let lpAssetId = if (pool)
428428 then getStringValue(Admin, (l + kp(Asset1, Asset2)))
429429 else MainAsset()
430430 let lpAId = match lpAssetId {
431431 case xi: String =>
432432 fromBase58String(xi)
433433 case x: ByteVector =>
434434 x
435435 case _ =>
436436 throw("Match error")
437437 }
438438 if (power)
439439 then if (!(liquidityPower))
440440 then if ((i.payments[0].assetId != lpAId))
441441 then throw((("Invalid asset! Kindly Deposit Only " + toBase58String(MainAsset())) + " or valid asset lp"))
442442 else if (!(pool))
443443 then {
444444 let currentKey = toBase58String(i.caller.bytes)
445445 let currentAmount = match getInteger(this, currentKey) {
446446 case a: Int =>
447447 a
448448 case _ =>
449449 0
450450 }
451451 let h = if ((currentAmount == 0))
452452 then height
453453 else valueOrElse(getIntegerValue(this, (deposit_height + currentKey)), height)
454454 let newAmount = (currentAmount + i.payments[0].amount)
455455 let useramount = IntegerEntry(currentKey, newAmount)
456456 let userdepositheight = IntegerEntry((deposit_height + currentKey), h)
457457 let previouslockbalance = match getInteger(this, "Total_Tokens_Locked:") {
458458 case a: Int =>
459459 a
460460 case _ =>
461461 0
462462 }
463463 let totaltoken = (previouslockbalance + i.payments[0].amount)
464464 let TLV = IntegerEntry("Total_Tokens_Locked:", totaltoken)
465465 [useramount, userdepositheight, TLV]
466466 }
467467 else {
468468 let poolKey = kp(Asset1, Asset2)
469469 let key = validPoolK(poolKey)
470470 if ((key != false))
471471 then {
472472 let currentKey = toBase58String(i.caller.bytes)
473473 let currentAmount = match getInteger(this, ((("STAKE_LP_" + currentKey) + "_") + poolKey)) {
474474 case a: Int =>
475475 a
476476 case _ =>
477477 0
478478 }
479479 let h = if ((currentAmount == 0))
480480 then height
481481 else valueOrElse(getIntegerValue(this, ((((deposit_height + "_") + currentKey) + "_") + poolKey)), height)
482482 let newAmount = (currentAmount + i.payments[0].amount)
483483 let useramount = IntegerEntry(((("STAKE_LP_" + currentKey) + "_") + poolKey), newAmount)
484484 let userdepositheight = IntegerEntry(((((deposit_height + "_") + currentKey) + "_") + poolKey), height)
485485 let previouslockbalance = match getInteger(this, ("Total_Tokens_LP_Locked_" + poolKey)) {
486486 case a: Int =>
487487 a
488488 case _ =>
489489 0
490490 }
491491 let totaltoken = (previouslockbalance + i.payments[0].amount)
492492 let TLV = IntegerEntry(("Total_Tokens_LP_Locked_" + poolKey), totaltoken)
493493 [useramount, userdepositheight, TLV]
494494 }
495495 else throw("Invalid Pool key.")
496496 }
497497 else throw("liquidity is currently under maintenance.")
498498 else throw("dApp is currently under maintenance.")
499499 }
500500
501501
502502
503503 @Callable(i)
504504 func Unstake (pool,Asset1,Asset2,amount) = {
505505 let power = getBooleanValue(Admin, ac)
506506 let liquidityPower = getBooleanValue(Admin, liquidityAc)
507507 let poolKey = kp(Asset1, Asset2)
508508 let pmt = i.payments[0]
509509 if (power)
510510 then if (!(liquidityPower))
511511 then {
512512 let currentKey = toBase58String(i.caller.bytes)
513513 let currentAmount = match if (pool)
514514 then getIntegerValue(this, ((("STAKE_LP_" + currentKey) + "_") + kp(Asset1, Asset2)))
515515 else getIntegerValue(this, currentKey) {
516516 case a: Int =>
517517 a
518518 case _ =>
519519 0
520520 }
521521 let swapheightkeyname = if (pool)
522522 then ((((deposit_height + "_") + currentKey) + "_") + kp(Asset1, Asset2))
523523 else (deposit_height + currentKey)
524524 let previouslockbalance = if (pool)
525525 then getIntegerValue(this, ("Total_Tokens_LP_Locked_" + kp(Asset1, Asset2)))
526526 else getIntegerValue(this, "Total_Tokens_Locked:")
527527 let totaltoken = (previouslockbalance - amount)
528528 let diff = (height - getIntegerValue(this, swapheightkeyname))
529529 let bcd = getIntegerValue(this, bcD)
530530 let reward = ((diff * bcd) * D8)
531531 let ood = match getInteger((poolKey + "_rate_fee_swap")) {
532532 case iw: Int =>
533533 iw
534534 case _ =>
535535 0
536536 }
537537 let oldT = match getInteger((poolKey + "_rate_fee_swap")) {
538538 case idd: Int =>
539539 (idd / (previouslockbalance / amount))
540540 case _ =>
541541 0
542542 }
543543 let feeCalc = if ((Asset1 == getStringValue(this, main)))
544544 then (reward / (previouslockbalance / amount))
545545 else oldT
546546 if ((0 > amount))
547547 then throw(if (pool)
548548 then (((("Can't withdraw negative " + Asset1) + "/") + Asset2) + " amount")
549549 else "Can't withdraw negative AxAi amount")
550550 else {
551551 let newAmount = (currentAmount - amount)
552552 if ((0 > newAmount))
553553 then throw(if (pool)
554554 then (((("Not enough Asset Lp " + Asset1) + "/") + Asset2) + " balance")
555555 else "Not enough AxAi balance")
556556 else [IntegerEntry(if (pool)
557557 then ((("STAKE_LP_" + currentKey) + "_") + kp(Asset1, Asset2))
558558 else currentKey, newAmount), IntegerEntry(if (pool)
559559 then ("Total_Tokens_LP_Locked_" + kp(Asset1, Asset2))
560560 else "Total_Tokens_Locked:", totaltoken), ScriptTransfer(i.caller, amount, if (pool)
561561 then fromBase58String(getStringValue(this, (l + kp(Asset1, Asset2))))
562562 else MainAsset()), ScriptTransfer(i.caller, feeCalc, MainAsset()), IntegerEntry((poolKey + "_rate_fee_swap"), (ood - oldT))]
563563 }
564564 }
565565 else throw("liquidity is currently under maintenance.")
566566 else throw("dApp is currently under maintenance.")
567567 }
568568
569569
570570
571571 @Callable(i)
572572 func CreateNFT (name,ipfs) = {
573573 let shah = sha256(fromBase58String(ipfs))
574574 [Issue(name, (((("{'ipfs':'" + ipfs) + "','SHA-HASH':'") + toBase58String(shah)) + "'}"), 1, 0, false)]
575575 }
576576
577577
578578
579579 @Callable(i)
580580 func BuyNFT (NFTId) = {
581581 let power = getBooleanValue(Admin, ac)
582582 let nftm = getBooleanValue(Admin, nfetAc)
583583 let pmt = i.payments[0]
584584 let price = match getIntegerValue(this, (NFTId + "_tosale")) {
585585 case is: Int =>
586586 is
587587 case _ =>
588588 0
589589 }
590590 let asset = match getStringValue(this, (NFTId + "_assetsale")) {
591591 case s: String =>
592592 if (if ((s == "WAVES"))
593593 then true
594594 else (s == "waves"))
595595 then WAVES
596596 else fromBase58String(s)
597597 case _ =>
598598 throw("NFT not listed for sale")
599599 }
600600 let oldAddress = match getStringValue(this, (NFTId + "_address")) {
601601 case s: String =>
602602 s
603603 case _ =>
604604 throw("NFT not listed for sale")
605605 }
606606 if (power)
607607 then if (!(nftm))
608608 then if ((price != 0))
609609 then if ((price == pmt.amount))
610610 then if ((pmt.assetId == asset))
611611 then [IntegerEntry((NFTId + "_tosale"), 0), BooleanEntry((NFTId + "_saled"), true), StringEntry((NFTId + "_address_SAle"), ""), StringEntry((NFTId + "_assetsale"), NFTId), StringEntry((NFTId + "_address"), toBase58String(i.caller.bytes)), ScriptTransfer(i.caller, 1, fromBase58String(NFTId)), ScriptTransfer(Address(fromBase58String(oldAddress)), pmt.amount, asset)]
612612 else throw("Asset not equal to the asset defined as a payment method by the NFT issuer")
613613 else throw("Value not equal to sale value")
614614 else throw("This NFT is not for sale.")
615615 else throw("NFT is currently under maintenance.")
616616 else throw("dApp is currently under maintenance.")
617617 }
618618
619619
620620
621621 @Callable(i)
622622 func RemoveToSell (NFTId) = {
623623 let power = getBooleanValue(Admin, ac)
624624 let nftm = getBooleanValue(Admin, nfetAc)
625625 let pmt = i.payments[0]
626626 if (power)
627627 then if (!(nftm))
628628 then if ((getAssetIssueAddress(fromBase58String(NFTId)) == i.caller))
629629 then [DeleteEntry((NFTId + "_tosale")), DeleteEntry((NFTId + "_saled")), DeleteEntry((NFTId + "_address_SAle")), DeleteEntry((NFTId + "_assetsale")), DeleteEntry((NFTId + "_address"))]
630630 else throw("Only the owner of the NFT can remove it from the list.")
631631 else throw("NFT is currently under maintenance.")
632632 else throw("dApp is currently under maintenance.")
633633 }
634634
635635
636636
637637 @Callable(i)
638638 func SellNFT (Price,asset) = {
639639 let power = getBooleanValue(Admin, ac)
640640 let nftm = getBooleanValue(Admin, nfetAc)
641641 let pmt = i.payments[0]
642642 if (power)
643643 then if (!(nftm))
644644 then if (if ((pmt.amount == 0))
645645 then true
646646 else (pmt.assetId == WAVES))
647647 then throw("Requires NFT as transfer payment for sale.")
648648 else [IntegerEntry((getAsset(pmt.assetId) + "_tosale"), Price), BooleanEntry((getAsset(pmt.assetId) + "_saled"), false), StringEntry((getAsset(pmt.assetId) + "_address_SAle"), ""), StringEntry((getAsset(pmt.assetId) + "_assetsale"), asset), StringEntry((getAsset(pmt.assetId) + "_address"), toBase58String(i.caller.bytes))]
649649 else throw("NFT is currently under maintenance.")
650650 else throw("dApp is currently under maintenance.")
651651 }
652652
653653
654654
655655 @Callable(i)
656656 func CreateCollection (collectionName) = {
657657 let currentKey = toBase58String(i.caller.bytes)
658658 let tc = match getIntegerValue(this, (currentKey + "_total_collection")) {
659659 case ai: Int =>
660660 ai
661661 case _ =>
662662 0
663663 }
664664 if (verifiCollectionExist(collectionName))
665665 then throw("Error: A collection with that name already exists, try another one.")
666666 else [StringEntry(collectionName, currentKey), IntegerEntry((currentKey + "_total_collection"), (tc + 1))]
667667 }
668668
669669
670670 @Verifier(tx)
671671 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
672672

github/deemru/w8io/169f3d6 
75.53 ms