tx · 9bxRgqbELnnbmS5r9QgNxikCPBdzV8mwJDKqP55sPT83

3N2eA4yzXa4wTj7pP8r6G144RRxZW7cmq4p:  -0.01700000 Waves

2023.10.10 12:21 [2792340] smart account 3N2eA4yzXa4wTj7pP8r6G144RRxZW7cmq4p > SELF 0.00000000 Waves

{ "type": 13, "id": "9bxRgqbELnnbmS5r9QgNxikCPBdzV8mwJDKqP55sPT83", "fee": 1700000, "feeAssetId": null, "timestamp": 1696929754055, "version": 2, "chainId": 84, "sender": "3N2eA4yzXa4wTj7pP8r6G144RRxZW7cmq4p", "senderPublicKey": "Hh3eFP2XFetZSfTxQiM1Ps96f68zi8Zh5ghhCZdjgdFs", "proofs": [ "5hqj41JjaP2SeWNTsiMfFcMpC3ipRSb1RpeB9w9S9yC3k9NzG4h2qz2xSJZQFBiuJ3W5bB6PZCYxsjs7yR4FYTi4" ], "script": "base64:BgI5CAISBAoCCAgSBAoCBAgSBAoCAQgSBQoDCAEIEgMKAQgSAwoBCBIDCgEIEgUKAwgICBIGCgQICAgIRwAHVkVSU0lPTgIFMi4wLjABCWdldFN0ckJ5SwEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEJZ2V0U3RyQnlLAQIPY29uZl9vcmFjbGVfZmVlAAhzaWduRGFwcAkBBXZhbHVlAQkApggBCQEJZ2V0U3RyQnlLAQIRY29uZl9zaWdud2ViX2RhcHAAC2ZlZVJlY2VpdmVyCQEJZ2V0U3RyQnlLAQIRY29uZl9mZWVfcmVjZWl2ZXIADGFydHdvcmtzRGFwcAkBBXZhbHVlAQkApggBCQEJZ2V0U3RyQnlLAQISY29uZl9hcnR3b3Jrc19kYXBwAAh1c2VyRGFwcAMFCHVuaXRUZXN0CQEFdmFsdWUBCQCmCAECIzNNdDRSR01FeWpTV1lBb2NUUHFkNTV3ZEhRUUIzUFUyVUNtCQEFdmFsdWUBCQCmCAEJAQlnZXRTdHJCeUsBAg9jb25mX3VzZXJzX2RhcHAADXdoaXRlbGlzdERhcHAJAQV2YWx1ZQEJAKYIAQkBCWdldFN0ckJ5SwECE2NvbmZfd2hpdGVsaXN0X2RhcHAAD3B1enpsZV9hcnRfcG9vbAkBCWdldFN0ckJ5SwECFGNvbmZfcHV6emxlX2FydF9wb29sABF1c2R0UFBBc3NldElkX3N0cgkBCWdldFN0ckJ5SwECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEVF9QUAAOYXJ0QXNzZXRJZF9zdHIJAQlnZXRTdHJCeUsBAhdjb25mX2FjY2VwdGVkX2Fzc2V0X0FSVAARdXNkY1BQQXNzZXRJZF9zdHIJAQlnZXRTdHJCeUsBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRENfUFAAD2Vhc3RBc3NldElkX3N0cgkBCWdldFN0ckJ5SwECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfRUFTVAARcHV6emxlQXNzZXRJZF9zdHIJAQlnZXRTdHJCeUsBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X1BVWlpMRQAQZXRoUFBBc3NldElkX3N0cgkBCWdldFN0ckJ5SwECGmNvbmZfYWNjZXB0ZWRfYXNzZXRfRVRIX1BQABB3YXZlc0Fzc2V0SWRfc3RyAgVXQVZFUwANdXNkdFBQQXNzZXRJZAkA2QQBBRF1c2R0UFBBc3NldElkX3N0cgAKYXJ0QXNzZXRJZAkA2QQBBQ5hcnRBc3NldElkX3N0cgANdXNkY1BQQXNzZXRJZAkA2QQBBRF1c2RjUFBBc3NldElkX3N0cgALZWFzdEFzc2V0SWQJANkEAQUPZWFzdEFzc2V0SWRfc3RyAA1wdXp6bGVBc3NldElkCQDZBAEFEXB1enpsZUFzc2V0SWRfc3RyAAxldGhQUEFzc2V0SWQJANkEAQUQZXRoUFBBc3NldElkX3N0cgAMd2F2ZXNBc3NldElkAQAAE2FsbF9hY2NlcHRlZF9hc3NldHMJAMwIAgURdXNkdFBQQXNzZXRJZF9zdHIJAMwIAgUOYXJ0QXNzZXRJZF9zdHIJAMwIAgURdXNkY1BQQXNzZXRJZF9zdHIJAMwIAgUPZWFzdEFzc2V0SWRfc3RyCQDMCAIFEXB1enpsZUFzc2V0SWRfc3RyCQDMCAIFEHdhdmVzQXNzZXRJZF9zdHIJAMwIAgUQZXRoUFBBc3NldElkX3N0cgUDbmlsAAVjaHJpcwkBCWdldFN0ckJ5SwECDGNvbmZfYWRtaW5fMQAOY29tbWlzc2lvbl9mZWUAAwANdXNlclN1c3BlbmRlZAIJU1VTUEVOREVEAAt1c2VyUmVtb3ZlZAIHUkVNT1ZFRAAKYXJ0SWxsZWdhbAIHSUxMRUdBTAAMYXJ0U3VzcGVuZGVkAglTVVNQRU5ERUQADmRhcHBSdW5uaW5nS2V5AhRjb25mX2RhcHBfaXNfcnVubmluZwARbWFpbnRlbmFuY2VNU0dLZXkCFGNvbmZfbWFpbnRlbmFuY2VfbXNnAAtkYXBwUnVubmluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ5kYXBwUnVubmluZ0tleQYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFEW1haW50ZW5hbmNlTVNHS2V5AgAACW51bVNhbGVzSwIJbnVtX3NhbGVzAQ1nZXRVc2VyU3RyQnlLAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAFA2tleQIFRXJyb3IBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxhcnR3b3Jrc0RhcHAFA2tleQDoBwEMZ2V0QXJ0U3RyQnlLAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUMYXJ0d29ya3NEYXBwBQNrZXkCAAEJZ2V0SW50QnlLAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABDWtleVVzZXJTdGF0dXMBBGFkZHIJAKwCAgIMdXNlcl9zdGF0dXNfBQRhZGRyARNrZXlBcnR3b3JrUm95YWx0aWVzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDmFydF9yb3lhbHRpZXNfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlTaWduSUQCCmFydGlzdEFkZHIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQVhcnRJZAIBXwUKYXJ0aXN0QWRkcgEHa2V5RmxhZwIKYXJ0aXN0QWRkcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2ZsYWdfBQVhcnRJZAIBXwUKYXJ0aXN0QWRkcgEKa2V5TkZURGF0YQECaWQJAKwCAgIEbmZ0XwUCaWQBCmdldFNhbGVLZXkEBmNhbGxlcgVuZnRJZAVhcnRJZAtjcmVhdG9yQWRkcgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1zYWxlMm5kX2luZm9fBQZjYWxsZXICAV8FBW5mdElkAgFfBQVhcnRJZAIBXwULY3JlYXRvckFkZHIBCWdldEJpZEtleQQKb2ZmZXJPd25lcgVuZnRJZAlzYWxlT3duZXIHb2ZmZXJJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglvZmZlcjJuZF8FCm9mZmVyT3duZXICAV8FBW5mdElkAgFfBQlzYWxlT3duZXICAV8FB29mZmVySWQBE2dldEludEJ5S0Zyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQETZ2V0SW50QnlLRnJvbU9yYWNsZQEJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEFCmFydEFzc2V0SWQBEmtleUFydGlzdEFnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAg1hcnRpc3RfYWdlbnRfBQphcnRpc3RBZGRyARZrZXlTZWNvbmRhcnlTaGFyZUFnZW50AQphcnRpc3RBZGRyCQCsAgICF2FydGlzdF9hZ2VudF9zZWNvbmRhcnlfBQphcnRpc3RBZGRyARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgIUYXJ0aXN0X3B1YmxpY19hZ2VudF8FCmFydGlzdEFkZHIBHGtleVNlY29uZGFyeVNoYXJlUHVibGljQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIeYXJ0aXN0X3B1YmxpY19hZ2VudF9zZWNvbmRhcnlfBQphcnRpc3RBZGRyAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQlpc1BheW1lbnQBAWkDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQJAQV2YWx1ZQEIBQdwYXltZW50BmFtb3VudAkAlAoCBQdwYXltZW50BQZhbW91bnQBDGFzc2V0SXNWYWxpZAEMYXNzZXREZXRhaWxzAwMDCQAAAggFDGFzc2V0RGV0YWlscwhxdWFudGl0eQABCQAAAggFDGFzc2V0RGV0YWlscwhkZWNpbWFscwAABwkAAAIIBQxhc3NldERldGFpbHMKcmVpc3N1YWJsZQcHCQAAAggFDGFzc2V0RGV0YWlscwZpc3N1ZXIFDGFydHdvcmtzRGFwcAcBDGlzU2lnbkFydE5GVAECaWQEDGFzc2V0RGV0YWlscwkBBXZhbHVlAQkA7AcBBQJpZAkBDGFzc2V0SXNWYWxpZAEFDGFzc2V0RGV0YWlscwEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFE2FsbF9hY2NlcHRlZF9hc3NldHMFB2Fzc2V0SWQJAAIBAkBPbmx5ICRBUlQsIFVTRFQtUFAsIFVTREMtUFAsIEVBU1QsIFBVWlpMRSwgRVRIIG9yIFdBVkVTIGFjY2VwdGVkBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARVnZXRTYWxlT3duZXJBbmRTdGF0dXMBBW5mdGlkBAlzYWxlT3duZXIJAQlnZXRTdHJCeUsBCQCsAgICFmN1cnJlbnRfb3duZXJfb25fZGFwcF8FBW5mdGlkAwkAAAIJALECAQUJc2FsZU93bmVyAAAJAAIBAg1ORlQgbm90IGZvdW5kBApzYWxlU3RhdHVzCQEJZ2V0U3RyQnlLAQkArAICCQCsAgIJAKwCAgIPc2FsZTJuZF9zdGF0dXNfBQlzYWxlT3duZXICAV8FBW5mdGlkAwkBAiE9AgUKc2FsZVN0YXR1cwIET1BFTgkAAgECEE5GVCBub3QgZm9yIHNhbGUFCXNhbGVPd25lcgEKZ2V0QmlkRGF0YQEDa2V5BAdiaWREYXRhCQEJZ2V0U3RyQnlLAQkArAICBQNrZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECD09mZmVyIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgACCQCVCgMFCmJpZERhdGFBcnIFB2Fzc2V0SWQFB2JpZERhdGEBCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEKYXJ0SXNWYWxpZAEJYXJ0U3RhdHVzAwkBAiE9AgUJYXJ0U3RhdHVzBQphcnRJbGxlZ2FsCQECIT0CBQlhcnRTdGF0dXMFDGFydFN1c3BlbmRlZAcBDmNoZWNrQXJ0U3RhdHVzAgRhZGRyAmlkBAlhcnRTdGF0dXMJAQxnZXRBcnRTdHJCeUsBCQEHa2V5RmxhZwIFBGFkZHIFAmlkAwkBCmFydElzVmFsaWQBBQlhcnRTdGF0dXMGCQACAQkArAICAhxPcmlnaW5hbCBBcnR3b3JrIGZsYWdnZWQgYXMgBQlhcnRTdGF0dXMBEWNoZWNrQXJ0aXN0U3RhdHVzAQRhZGRyBAxhcnRpc3RTdGF0dXMJAQ1nZXRVc2VyU3RyQnlLAQkBDWtleVVzZXJTdGF0dXMBBQRhZGRyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUNdXNlclN1c3BlbmRlZAkAzAgCBQt1c2VyUmVtb3ZlZAUDbmlsBQxhcnRpc3RTdGF0dXMJAAIBCQCsAgICEE9yaWdpbmFsIEFydGlzdCAFDGFydGlzdFN0YXR1cwYBDGNoZWNrTkZUSW5mbwEHYXNzZXRJZAQHbmZ0RGF0YQkAtQkCCQEMZ2V0QXJ0U3RyQnlLAQkBCmtleU5GVERhdGEBBQdhc3NldElkAgFfBAlhcnRTaWduSUQJAQxnZXRBcnRTdHJCeUsBCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8JAJEDAgUHbmZ0RGF0YQAFAgFfCQCRAwIFB25mdERhdGEABgMDCQEBIQEJAQ5jaGVja0FydFN0YXR1cwIJAJEDAgUHbmZ0RGF0YQAGCQCRAwIFB25mdERhdGEABQkBASEBCQERY2hlY2tBcnRpc3RTdGF0dXMBCQCRAwIFB25mdERhdGEABgcJAJYKBAcJAJEDAgUHbmZ0RGF0YQAFCQCRAwIFB25mdERhdGEABgUJYXJ0U2lnbklECQCWCgQGCQCRAwIFB25mdERhdGEABQkAkQMCBQduZnREYXRhAAYFCWFydFNpZ25JRAENY2hlY2tBUlRFeGlzdAIFYXJ0SWQLY3JlYXRvckFkZHIECWFydFNpZ25JRAkBDGdldEFydFN0ckJ5SwEJAQlrZXlTaWduSUQCBQtjcmVhdG9yQWRkcgUFYXJ0SWQDCQAAAgkAsQIBBQlhcnRTaWduSUQAAAkAAgECHUFydHdvcmsgbm90IGZvdW5kIG9uIFNJR04gQXJ0AwMJAQEhAQkBDmNoZWNrQXJ0U3RhdHVzAgULY3JlYXRvckFkZHIFBWFydElkCQEBIQEJARFjaGVja0FydGlzdFN0YXR1cwEFC2NyZWF0b3JBZGRyBwcGAQxzZXRUcmFuc2ZlcnMHBmFtb3VudAdhc3NldElkBW5mdGlkC2NyZWF0b3JBZGRyCXNhbGVPd25lcgZjYWxsZXIFYXJ0SWQECmNyZWF0b3JDdXQJARNnZXRBcnR3b3JrUm95YWx0aWVzAQkBE2tleUFydHdvcmtSb3lhbHRpZXMCBQtjcmVhdG9yQWRkcgUFYXJ0SWQEBWFnZW50CQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwCQESa2V5QXJ0aXN0QWdlbnRBZGRyAQULY3JlYXRvckFkZHIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEWa2V5U2Vjb25kYXJ5U2hhcmVBZ2VudAEFC2NyZWF0b3JBZGRyAAAEC3B1YmxpY0FnZW50CQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwCQEYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyAQULY3JlYXRvckFkZHIFC2ZlZVJlY2VpdmVyBBBwdWJsaWNBZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEca2V5U2Vjb25kYXJ5U2hhcmVQdWJsaWNBZ2VudAEFC2NyZWF0b3JBZGRyAAAEDWFtb3VudEZvclNpZ24JAGsDBQZhbW91bnQFDmNvbW1pc3Npb25fZmVlAGQEEGFtb3VudEZvckNyZWF0b3IJAGsDBQZhbW91bnQFCmNyZWF0b3JDdXQAkE4EDmFtb3VudEZvck93bmVyCQBlAgUGYW1vdW50CQBkAgUNYW1vdW50Rm9yU2lnbgUQYW1vdW50Rm9yQ3JlYXRvcgQOYW1vdW50Rm9yQWdlbnQDAwkBAiE9AgUFYWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUKYWdlbnRTaGFyZQAABwkAawMFBmFtb3VudAUKYWdlbnRTaGFyZQCQTgAABBRhbW91bnRGb3JQdWJsaWNBZ2VudAMDCQECIT0CBQtwdWJsaWNBZ2VudAULZmVlUmVjZWl2ZXIJAGYCBRBwdWJsaWNBZ2VudFNoYXJlAAAHCQBrAwUGYW1vdW50BRBwdWJsaWNBZ2VudFNoYXJlAJBOAAAEImFtb3VudF9jb21taXNzaW9uX2Zvcl9zaWduX3RvX3N3YXADCQECIT0CBQ5hbW91bnRGb3JBZ2VudAAACQBlAgUNYW1vdW50Rm9yU2lnbgUOYW1vdW50Rm9yQWdlbnQFDWFtb3VudEZvclNpZ24EEWFtb3VudF9hcnRfYmVmb3JlCQEKZ2V0QmFsYW5jZQEFCmFydEFzc2V0SWQDCQAAAgURYW1vdW50X2FydF9iZWZvcmUFEWFtb3VudF9hcnRfYmVmb3JlBA9zd2FwX2ZlZV90b19hcnQDCQECIT0CBQdhc3NldElkBQphcnRBc3NldElkCQD8BwQJAQdBZGRyZXNzAQkA2QQBBQ9wdXp6bGVfYXJ0X3Bvb2wCBHN3YXAJAMwIAgUOYXJ0QXNzZXRJZF9zdHIJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFImFtb3VudF9jb21taXNzaW9uX2Zvcl9zaWduX3RvX3N3YXAFA25pbAUEdW5pdAMJAAACBQ9zd2FwX2ZlZV90b19hcnQFD3N3YXBfZmVlX3RvX2FydAQQYW1vdW50X2FydF9hZnRlcgkBCmdldEJhbGFuY2UBBQphcnRBc3NldElkAwkAAAIFEGFtb3VudF9hcnRfYWZ0ZXIFEGFtb3VudF9hcnRfYWZ0ZXIEC2NvbW1pc3Npb25zAwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIDCQAAAgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50CQBlAgUQYW1vdW50X2FydF9hZnRlcgURYW1vdW50X2FydF9iZWZvcmUFCmFydEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBWFnZW50BQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgMJAAACBQdhc3NldElkBQphcnRBc3NldElkBQ1hbW91bnRGb3JTaWduCQBlAgUQYW1vdW50X2FydF9hZnRlcgURYW1vdW50X2FydF9iZWZvcmUFCmFydEFzc2V0SWQFA25pbAQKY3JlYXRvckZlZQMJAQIhPQIFFGFtb3VudEZvclB1YmxpY0FnZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC3B1YmxpY0FnZW50BRRhbW91bnRGb3JQdWJsaWNBZ2VudAUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULY3JlYXRvckFkZHIJAGUCBRBhbW91bnRGb3JDcmVhdG9yBRRhbW91bnRGb3JQdWJsaWNBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtjcmVhdG9yQWRkcgUQYW1vdW50Rm9yQ3JlYXRvcgUHYXNzZXRJZAUDbmlsBAhvd25lckZlZQkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFCXNhbGVPd25lcgUOYW1vdW50Rm9yT3duZXIFB2Fzc2V0SWQEDGNvbGxlY3Rvck5GVAkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgABCQDZBAEFBW5mdGlkCQCWCgQFC2NvbW1pc3Npb25zBQpjcmVhdG9yRmVlBQhvd25lckZlZQUMY29sbGVjdG9yTkZUCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ92YWxpZGF0ZU1pblNlbGwBBXByaWNlAwkAZwIAAAUFcHJpY2UJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQ9wcm92aWRlQmFzZURhdGECAWkFbmZ0SWQEDSR0MDEyMTM1MTIxNzUJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDEyMTM1MTIxNzUCXzEEBmNhbGxlcggFDSR0MDEyMTM1MTIxNzUCXzIEBGRhdGUIBQ0kdDAxMjEzNTEyMTc1Al8zBA0kdDAxMjE3ODEyMjQ3CQEMY2hlY2tORlRJbmZvAQUFbmZ0SWQECmlzVmFsaWRORlQIBQ0kdDAxMjE3ODEyMjQ3Al8xBAVhcnRJZAgFDSR0MDEyMTc4MTIyNDcCXzIEC2NyZWF0b3JBZGRyCAUNJHQwMTIxNzgxMjI0NwJfMwQJYXJ0U2lnbklECAUNJHQwMTIxNzgxMjI0NwJfNAkAmQoHBQJpZAUGY2FsbGVyBQRkYXRlBQppc1ZhbGlkTkZUBQVhcnRJZAULY3JlYXRvckFkZHIFCWFydFNpZ25JRAEOdXBkYXRlTnVtU2FsZXMABAhudW1TYWxlcwkBCWdldEludEJ5SwEFCW51bVNhbGVzSwkBDEludGVnZXJFbnRyeQIFCW51bVNhbGVzSwkAZAIFCG51bVNhbGVzAAEJBmludm9rZQEHc2V0Q29uZgIDa2V5A3ZhbAQGY2FsbGVyCQClCAEIBQZpbnZva2UGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQhjb250YWlucwIFA2tleQIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQN2YWwFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwZpbnZva2UBCmFwcFJ1bm5pbmcCBmlzTGl2ZQdtZXNzYWdlBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIEAmlkCQDYBAEIBQZpbnZva2UNdHJhbnNhY3Rpb25JZAMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDmRhcHBSdW5uaW5nS2V5BQZpc0xpdmUJAMwIAgkBC1N0cmluZ0VudHJ5AgURbWFpbnRlbmFuY2VNU0dLZXkFB21lc3NhZ2UFA25pbAkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEHc2VsbE5GVAIFcHJpY2UFYXNzZXQEDSR0MDEzMzEyMTMzNDgJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMTMzMTIxMzM0OAJfMQQGYW1vdW50CAUNJHQwMTMzMTIxMzM0OAJfMgMJAQIhPQIFBmFtb3VudAABCQACAQIPTm8gTkZUIGF0dGFjaGVkBAVuZnRJZAMDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkBDGlzU2lnbkFydE5GVAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQHCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhtPbmx5IFNJR04gQXJ0IE5GVCBhY2NlcHRlZC4EDSR0MDEzNTgyMTM2NzUJAQ9wcm92aWRlQmFzZURhdGECBQFpBQVuZnRJZAQCaWQIBQ0kdDAxMzU4MjEzNjc1Al8xBAZjYWxsZXIIBQ0kdDAxMzU4MjEzNjc1Al8yBARkYXRlCAUNJHQwMTM1ODIxMzY3NQJfMwQKaXNWYWxpZE5GVAgFDSR0MDEzNTgyMTM2NzUCXzQEBWFydElkCAUNJHQwMTM1ODIxMzY3NQJfNQQLY3JlYXRvckFkZHIIBQ0kdDAxMzU4MjEzNjc1Al82BAlhcnRTaWduSUQIBQ0kdDAxMzU4MjEzNjc1Al83AwkAAAIJALECAQUJYXJ0U2lnbklEAAAJAAIBAh1BcnR3b3JrIG5vdCBmb3VuZCBvbiBTSUdOIEFydAMJAQEhAQUKaXNWYWxpZE5GVAkAAgECD05vdCBhIHZhbGlkIG5mdAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQVhc3NldAkAAgECJ09ubHkgU0lHTiwgVVNETiwgVVNEVCBvciBXQVZFUyBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAEFBXByaWNlCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkBCmdldFNhbGVLZXkEBQZjYWxsZXIFBW5mdElkBQVhcnRJZAULY3JlYXRvckFkZHICBV9PUEVOCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCkAwEFBGRhdGUCAV8JAKQDAQUFcHJpY2UCAV8FBWFzc2V0AgFfBQVuZnRJZAIBXwUFYXJ0SWQCAV8FC2NyZWF0b3JBZGRyAgFfBQJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICAg9zYWxlMm5kX3N0YXR1c18FBmNhbGxlcgIBXwUFbmZ0SWQCBE9QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAhZjdXJyZW50X293bmVyX29uX2RhcHBfBQVuZnRJZAUGY2FsbGVyBQNuaWwBaQEPdXBkYXRlU2FsZVByaWNlAwVuZnRJZAVwcmljZQVhc3NldAQNJHQwMTQ1NTIxNDY0NQkBD3Byb3ZpZGVCYXNlRGF0YQIFAWkFBW5mdElkBAJpZAgFDSR0MDE0NTUyMTQ2NDUCXzEEBmNhbGxlcggFDSR0MDE0NTUyMTQ2NDUCXzIEBGRhdGUIBQ0kdDAxNDU1MjE0NjQ1Al8zBAppc1ZhbGlkTkZUCAUNJHQwMTQ1NTIxNDY0NQJfNAQFYXJ0SWQIBQ0kdDAxNDU1MjE0NjQ1Al81BAtjcmVhdG9yQWRkcggFDSR0MDE0NTUyMTQ2NDUCXzYECWFydFNpZ25JRAgFDSR0MDE0NTUyMTQ2NDUCXzcDCQAAAgkAsQIBBQlhcnRTaWduSUQAAAkAAgECMEFydHdvcmsgbm90IGZvdW5kIG9uIFNJR04gQXJ0LCBjYW5jZWwgeW91ciBzYWxlLgMJAQEhAQUKaXNWYWxpZE5GVAkAAgECD05vdCBhIHZhbGlkIG5mdAQJc2FsZU93bmVyCQEJZ2V0U3RyQnlLAQkArAICAhZjdXJyZW50X293bmVyX29uX2RhcHBfBQVuZnRJZAMJAQIhPQIFCXNhbGVPd25lcgUGY2FsbGVyCQACAQIWWW91IGRvbid0IG93biB0aGlzIE5GVAQKc2FsZVN0YXR1cwkBCWdldFN0ckJ5SwEJAKwCAgkArAICCQCsAgICD3NhbGUybmRfc3RhdHVzXwUGY2FsbGVyAgFfBQVuZnRJZAMJAQIhPQIFCnNhbGVTdGF0dXMCBE9QRU4JAAIBAg9TYWxlIG5vdCBhY3RpdmUDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUFYXNzZXQJAAIBAidPbmx5IFNJR04sIFVTRE4sIFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQDCQEBIQEJAQ92YWxpZGF0ZU1pblNlbGwBBQVwcmljZQkAAgECGFdyb25nIG1pbmltdW0gc2VsbCBwcmljZQQHc2FsZUtleQkBCmdldFNhbGVLZXkEBQZjYWxsZXIFBW5mdElkBQVhcnRJZAULY3JlYXRvckFkZHIECHNhbGVJbmZvCQC1CQIJAQlnZXRTdHJCeUsBCQCsAgIFB3NhbGVLZXkCBV9PUEVOAgFfCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUHc2FsZUtleQIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAJEDAgUIc2FsZUluZm8AAAIBXwkApAMBBQVwcmljZQIBXwUFYXNzZXQCAV8JAJEDAgUIc2FsZUluZm8AAwIBXwkAkQMCBQhzYWxlSW5mbwAEAgFfCQCRAwIFCHNhbGVJbmZvAAUCAV8JAJEDAgUIc2FsZUluZm8ABgUDbmlsAWkBCmNhbmNlbFNhbGUBBW5mdElkBA0kdDAxNTc4NjE2MDI3CQEPcHJvdmlkZUJhc2VEYXRhAgUBaQUFbmZ0SWQEAmlkCAUNJHQwMTU3ODYxNjAyNwJfMQQGY2FsbGVyCAUNJHQwMTU3ODYxNjAyNwJfMgQEZGF0ZQgFDSR0MDE1Nzg2MTYwMjcCXzMECmlzVmFsaWRORlQIBQ0kdDAxNTc4NjE2MDI3Al80BAVhcnRJZAgFDSR0MDE1Nzg2MTYwMjcCXzUEC2NyZWF0b3JBZGRyCAUNJHQwMTU3ODYxNjAyNwJfNgQJYXJ0U2lnbklECAUNJHQwMTU3ODYxNjAyNwJfNwQJc2FsZU93bmVyCQEJZ2V0U3RyQnlLAQkArAICAhZjdXJyZW50X293bmVyX29uX2RhcHBfBQVuZnRJZAMJAQIhPQIFCXNhbGVPd25lcgUGY2FsbGVyCQACAQIWWW91IGRvbid0IG93biB0aGlzIE5GVAQKc2FsZVN0YXR1cwkBCWdldFN0ckJ5SwEJAKwCAgkArAICCQCsAgICD3NhbGUybmRfc3RhdHVzXwUGY2FsbGVyAgFfBQVuZnRJZAMJAQIhPQIFCnNhbGVTdGF0dXMCBE9QRU4JAAIBAg9TYWxlIG5vdCBhY3RpdmUEB3NhbGVLZXkJAQpnZXRTYWxlS2V5BAUGY2FsbGVyBQVuZnRJZAUFYXJ0SWQFC2NyZWF0b3JBZGRyBAhzYWxlSW5mbwkBCWdldFN0ckJ5SwEJAKwCAgUHc2FsZUtleQIFX09QRU4JAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQdzYWxlS2V5AgVfT1BFTgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICAg9zYWxlMm5kX3N0YXR1c18FBmNhbGxlcgIBXwUFbmZ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICAhZjdXJyZW50X293bmVyX29uX2RhcHBfBQVuZnRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQdzYWxlS2V5AgFfBQJpZAIKX0NBTkNFTExFRAkArAICCQCsAgIJAKwCAgkArAICBQhzYWxlSW5mbwILX0NBTkNFTExFRF8JAKQDAQUEZGF0ZQIBXwUCaWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgABCQDZBAEFBW5mdElkBQNuaWwBaQEGYnV5TkZUAQVuZnRJZAQNJHQwMTY4NTgxNjk1MQkBD3Byb3ZpZGVCYXNlRGF0YQIFAWkFBW5mdElkBAJpZAgFDSR0MDE2ODU4MTY5NTECXzEEBmNhbGxlcggFDSR0MDE2ODU4MTY5NTECXzIEBGRhdGUIBQ0kdDAxNjg1ODE2OTUxAl8zBAppc1ZhbGlkTkZUCAUNJHQwMTY4NTgxNjk1MQJfNAQFYXJ0SWQIBQ0kdDAxNjg1ODE2OTUxAl81BAtjcmVhdG9yQWRkcggFDSR0MDE2ODU4MTY5NTECXzYECWFydFNpZ25JRAgFDSR0MDE2ODU4MTY5NTECXzcDCQAAAgkAsQIBBQlhcnRTaWduSUQAAAkAAgECMEFydHdvcmsgbm90IGZvdW5kIG9uIFNJR04gQXJ0LCBjYW5jZWwgeW91ciBzYWxlLgMJAQEhAQUKaXNWYWxpZE5GVAkAAgECD05vdCBhIHZhbGlkIG5mdAQJc2FsZU93bmVyCQEVZ2V0U2FsZU93bmVyQW5kU3RhdHVzAQUFbmZ0SWQEB3NhbGVLZXkJAQpnZXRTYWxlS2V5BAUJc2FsZU93bmVyBQVuZnRJZAUFYXJ0SWQFC2NyZWF0b3JBZGRyBAhzYWxlSW5mbwkBCWdldFN0ckJ5SwEJAKwCAgUHc2FsZUtleQIFX09QRU4DCQAAAgkAsQIBBQhzYWxlSW5mbwAACQACAQIPU2FsZSBOb3QgZm91bmQhBA1zYWxlSW5mb0FycmF5CQC1CQIFCHNhbGVJbmZvAgFfAwkAAAIJALYJAQkAkQMCBQ1zYWxlSW5mb0FycmF5AAEAAAkAAgECCk9mZmVyIG9ubHkEDSR0MDE3NDQ4MTc0ODQJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMTc0NDgxNzQ4NAJfMQQGYW1vdW50CAUNJHQwMTc0NDgxNzQ4NAJfMgQPcGF5bWVudEFzc2V0U3RyAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAIAAwMJAQIhPQIJAJEDAgUNc2FsZUluZm9BcnJheQABCQCkAwEFBmFtb3VudAYJAQIhPQIJAJEDAgUNc2FsZUluZm9BcnJheQACBQ9wYXltZW50QXNzZXRTdHIJAAIBAhpQYXltZW50IGluZm9zIGRvbid0IG1hdGNoLgQNJHQwMTc5OTcxODEzNgkBDHNldFRyYW5zZmVycwcFBmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAUFbmZ0SWQFC2NyZWF0b3JBZGRyBQlzYWxlT3duZXIFBmNhbGxlcgUFYXJ0SWQEC2NvbW1pc3Npb25zCAUNJHQwMTc5OTcxODEzNgJfMQQKY3JlYXRvckZlZQgFDSR0MDE3OTk3MTgxMzYCXzIECG93bmVyRmVlCAUNJHQwMTc5OTcxODEzNgJfMwQMY29sbGVjdG9yTkZUCAUNJHQwMTc5OTcxODEzNgJfNAkAzggCCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQdzYWxlS2V5AgVfT1BFTgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICAg9zYWxlMm5kX3N0YXR1c18FCXNhbGVPd25lcgIBXwUFbmZ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICAhZjdXJyZW50X293bmVyX29uX2RhcHBfBQVuZnRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQdzYWxlS2V5AgFfBQJpZAIHX0NMT1NFRAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUIc2FsZUluZm8CCF9DTE9TRURfCQCkAwEFBGRhdGUCAV8FAmlkAgFfBQZjYWxsZXIJAMwIAgkBDnVwZGF0ZU51bVNhbGVzAAkAzAgCBQhvd25lckZlZQkAzAgCBQxjb2xsZWN0b3JORlQFA25pbAUKY3JlYXRvckZlZQULY29tbWlzc2lvbnMBaQEIc2V0T2ZmZXIBBW5mdElkBA0kdDAxODU0NzE4NjQ0CQEPcHJvdmlkZUJhc2VEYXRhAgUBaQUFbmZ0SWQEAmlkCAUNJHQwMTg1NDcxODY0NAJfMQQKb2ZmZXJPd25lcggFDSR0MDE4NTQ3MTg2NDQCXzIEBGRhdGUIBQ0kdDAxODU0NzE4NjQ0Al8zBAppc1ZhbGlkTkZUCAUNJHQwMTg1NDcxODY0NAJfNAQFYXJ0SWQIBQ0kdDAxODU0NzE4NjQ0Al81BAtjcmVhdG9yQWRkcggFDSR0MDE4NTQ3MTg2NDQCXzYECWFydFNpZ25JRAgFDSR0MDE4NTQ3MTg2NDQCXzcDCQEBIQEFCmlzVmFsaWRORlQJAAIBAg9Ob3QgYSB2YWxpZCBuZnQEDSR0MDE4NzA1MTg3NDEJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMTg3MDUxODc0MQJfMQQGYW1vdW50CAUNJHQwMTg3MDUxODc0MQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAAACBQZhbW91bnQAAAkAAgECFk9mZmVyIG9mIDAgbm90IGFsbG93ZWQDCQEBIQEJAQ92YWxpZGF0ZU1pblNlbGwBBQZhbW91bnQJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UECXNhbGVPd25lcgkBFWdldFNhbGVPd25lckFuZFN0YXR1cwEFBW5mdElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkBCWdldEJpZEtleQQFCm9mZmVyT3duZXIFBW5mdElkBQlzYWxlT3duZXIFAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKQDAQUEZGF0ZQIBXwkApAMBBQZhbW91bnQCAV8FB2Fzc2V0SWQCAV8FBW5mdElkAgFfBQVhcnRJZAIBXwULY3JlYXRvckFkZHICAV8FCm9mZmVyT3duZXICAV8FAmlkBQNuaWwBaQELYWNjZXB0T2ZmZXIDBW5mdElkB29mZmVySWQKb2ZmZXJPd25lcgQNJHQwMTk1MzQxOTYyNwkBD3Byb3ZpZGVCYXNlRGF0YQIFAWkFBW5mdElkBAJpZAgFDSR0MDE5NTM0MTk2MjcCXzEEBmNhbGxlcggFDSR0MDE5NTM0MTk2MjcCXzIEBGRhdGUIBQ0kdDAxOTUzNDE5NjI3Al8zBAppc1ZhbGlkTkZUCAUNJHQwMTk1MzQxOTYyNwJfNAQFYXJ0SWQIBQ0kdDAxOTUzNDE5NjI3Al81BAtjcmVhdG9yQWRkcggFDSR0MDE5NTM0MTk2MjcCXzYECWFydFNpZ25JRAgFDSR0MDE5NTM0MTk2MjcCXzcDCQEBIQEFCmlzVmFsaWRORlQJAAIBAg9Ob3QgYSB2YWxpZCBuZnQECXNhbGVPd25lcgkBFWdldFNhbGVPd25lckFuZFN0YXR1cwEFBW5mdElkAwkBAiE9AgUGY2FsbGVyBQlzYWxlT3duZXIJAAIBAiBPbmx5IHNhbGUgb3duZXIgY2FuIGFjY2VwdCBvZmZlcgQGYmlkS2V5CQEJZ2V0QmlkS2V5BAUKb2ZmZXJPd25lcgUFbmZ0SWQFCXNhbGVPd25lcgUHb2ZmZXJJZAQNJHQwMTk4ODExOTkzNgkBCmdldEJpZERhdGEBBQZiaWRLZXkECmJpZERhdGFBcnIIBQ0kdDAxOTg4MTE5OTM2Al8xBAdhc3NldElkCAUNJHQwMTk4ODExOTkzNgJfMgQHYmlkRGF0YQgFDSR0MDE5ODgxMTk5MzYCXzMEB3NhbGVLZXkJAQpnZXRTYWxlS2V5BAUJc2FsZU93bmVyBQVuZnRJZAUFYXJ0SWQFC2NyZWF0b3JBZGRyBAhzYWxlSW5mbwkBCWdldFN0ckJ5SwEJAKwCAgUHc2FsZUtleQIFX09QRU4DCQAAAgkAsQIBBQhzYWxlSW5mbwAACQACAQIPU2FsZSBOb3QgZm91bmQhBAZhbW91bnQJAQV2YWx1ZQEJALYJAQkAkQMCBQpiaWREYXRhQXJyAAEEDSR0MDIwMTcyMjAzMTAJAQxzZXRUcmFuc2ZlcnMHBQZhbW91bnQFB2Fzc2V0SWQFBW5mdElkBQtjcmVhdG9yQWRkcgUJc2FsZU93bmVyCQCRAwIFCmJpZERhdGFBcnIABgUFYXJ0SWQEC2NvbW1pc3Npb25zCAUNJHQwMjAxNzIyMDMxMAJfMQQKY3JlYXRvckZlZQgFDSR0MDIwMTcyMjAzMTACXzIECG93bmVyRmVlCAUNJHQwMjAxNzIyMDMxMAJfMwQMY29sbGVjdG9yTkZUCAUNJHQwMjAxNzIyMDMxMAJfNAQKYXNzZXRJZFN0cgMJAQlpc0RlZmluZWQBBQdhc3NldElkCQDYBAEJAQV2YWx1ZQEFB2Fzc2V0SWQCBVdBVkVTCQDOCAIJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFB3NhbGVLZXkCBV9PUEVOCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGYmlkS2V5AgVfT1BFTgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICAg9zYWxlMm5kX3N0YXR1c18FCXNhbGVPd25lcgIBXwUFbmZ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICAhZjdXJyZW50X293bmVyX29uX2RhcHBfBQVuZnRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBmJpZEtleQIHX0NMT1NFRAkArAICCQCsAgIJAKwCAgkArAICBQdiaWREYXRhAghfQ0xPU0VEXwkApAMBBQRkYXRlAgFfBQJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQdzYWxlS2V5AgFfBQJpZAIHX0NMT1NFRAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQhzYWxlSW5mbwIOX0NMT1NFRC1PRkZFUl8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8FCm9mZmVyT3duZXICAV8JAKQDAQUGYW1vdW50AgFfBQphc3NldElkU3RyCQDMCAIJAQ51cGRhdGVOdW1TYWxlcwAJAMwIAgUIb3duZXJGZWUJAMwIAgUMY29sbGVjdG9yTkZUBQNuaWwFCmNyZWF0b3JGZWUFC2NvbW1pc3Npb25zAWkBC2NhbmNlbE9mZmVyBAVuZnRJZAdvZmZlcklkCm9mZmVyT3duZXIJc2FsZU93bmVyBA0kdDAyMTExMDIxMTg0CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyMTExMDIxMTg0Al8xBAZjYWxsZXIIBQ0kdDAyMTExMDIxMTg0Al8yBARkYXRlCAUNJHQwMjExMTAyMTE4NAJfMwMDCQECIT0CBQZjYWxsZXIFCm9mZmVyT3duZXIJAQIhPQIFBmNhbGxlcgUJc2FsZU93bmVyBwkAAgECHVlvdSBjYW5ub3QgY2FuY2VsIHRoaXMgb2ZmZXIuBAZiaWRLZXkJAQlnZXRCaWRLZXkEBQpvZmZlck93bmVyBQVuZnRJZAUJc2FsZU93bmVyBQdvZmZlcklkBA0kdDAyMTM1NjIxNDExCQEKZ2V0QmlkRGF0YQEFBmJpZEtleQQKYmlkRGF0YUFycggFDSR0MDIxMzU2MjE0MTECXzEEB2Fzc2V0SWQIBQ0kdDAyMTM1NjIxNDExAl8yBAdiaWREYXRhCAUNJHQwMjEzNTYyMTQxMQJfMwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBmJpZEtleQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZiaWRLZXkCCl9DQU5DRUxMRUQJAKwCAgkArAICCQCsAgIJAKwCAgUHYmlkRGF0YQILX0NBTkNFTExFRF8JAKQDAQUEZGF0ZQIBXwUCaWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQUHYXNzZXRJZAUDbmlsAOPsipk=", "height": 2792340, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2u5sHiaMmydfZDL3tV6RstoJv4f1ZcBhRtbv8qyCanCD Next: 9YzeBqXEw9wMZ8SzXZxsKSEXkgQwoU4GUZAXkMVLbvT7 Diff:
OldNewDifferences
221221
222222 func checkNFTInfo (assetId) = {
223223 let nftData = split(getArtStrByK(keyNFTData(assetId)), "_")
224- let artSignID = getStrByK(((("art_name_" + nftData[5]) + "_") + nftData[6]))
224+ let artSignID = getArtStrByK(((("art_name_" + nftData[5]) + "_") + nftData[6]))
225225 if (if (!(checkArtStatus(nftData[6], nftData[5])))
226226 then !(checkArtistStatus(nftData[6]))
227227 else false)
303303
304304
305305 func provideBaseData (i,nftId) = {
306- let $t01213212172 = idCallerDate(i)
307- let id = $t01213212172._1
308- let caller = $t01213212172._2
309- let date = $t01213212172._3
310- let $t01217512244 = checkNFTInfo(nftId)
311- let isValidNFT = $t01217512244._1
312- let artId = $t01217512244._2
313- let creatorAddr = $t01217512244._3
314- let artSignID = $t01217512244._4
306+ let $t01213512175 = idCallerDate(i)
307+ let id = $t01213512175._1
308+ let caller = $t01213512175._2
309+ let date = $t01213512175._3
310+ let $t01217812247 = checkNFTInfo(nftId)
311+ let isValidNFT = $t01217812247._1
312+ let artId = $t01217812247._2
313+ let creatorAddr = $t01217812247._3
314+ let artSignID = $t01217812247._4
315315 $Tuple7(id, caller, date, isValidNFT, artId, creatorAddr, artSignID)
316316 }
317317
347347
348348 @Callable(i)
349349 func sellNFT (price,asset) = {
350- let $t01330913345 = isPayment(i)
351- let payment = $t01330913345._1
352- let amount = $t01330913345._2
350+ let $t01331213348 = isPayment(i)
351+ let payment = $t01331213348._1
352+ let amount = $t01331213348._2
353353 if ((amount != 1))
354354 then throw("No NFT attached")
355355 else {
358358 else false)
359359 then toBase58String(value(payment.assetId))
360360 else throw("Only SIGN Art NFT accepted.")
361- let $t01357913672 = provideBaseData(i, nftId)
362- let id = $t01357913672._1
363- let caller = $t01357913672._2
364- let date = $t01357913672._3
365- let isValidNFT = $t01357913672._4
366- let artId = $t01357913672._5
367- let creatorAddr = $t01357913672._6
368- let artSignID = $t01357913672._7
361+ let $t01358213675 = provideBaseData(i, nftId)
362+ let id = $t01358213675._1
363+ let caller = $t01358213675._2
364+ let date = $t01358213675._3
365+ let isValidNFT = $t01358213675._4
366+ let artId = $t01358213675._5
367+ let creatorAddr = $t01358213675._6
368+ let artSignID = $t01358213675._7
369369 if ((size(artSignID) == 0))
370370 then throw("Artwork not found on SIGN Art")
371371 else if (!(isValidNFT))
382382
383383 @Callable(i)
384384 func updateSalePrice (nftId,price,asset) = {
385- let $t01454914642 = provideBaseData(i, nftId)
386- let id = $t01454914642._1
387- let caller = $t01454914642._2
388- let date = $t01454914642._3
389- let isValidNFT = $t01454914642._4
390- let artId = $t01454914642._5
391- let creatorAddr = $t01454914642._6
392- let artSignID = $t01454914642._7
385+ let $t01455214645 = provideBaseData(i, nftId)
386+ let id = $t01455214645._1
387+ let caller = $t01455214645._2
388+ let date = $t01455214645._3
389+ let isValidNFT = $t01455214645._4
390+ let artId = $t01455214645._5
391+ let creatorAddr = $t01455214645._6
392+ let artSignID = $t01455214645._7
393393 if ((size(artSignID) == 0))
394394 then throw("Artwork not found on SIGN Art, cancel your sale.")
395395 else if (!(isValidNFT))
419419
420420 @Callable(i)
421421 func cancelSale (nftId) = {
422- let $t01578316024 = provideBaseData(i, nftId)
423- let id = $t01578316024._1
424- let caller = $t01578316024._2
425- let date = $t01578316024._3
426- let isValidNFT = $t01578316024._4
427- let artId = $t01578316024._5
428- let creatorAddr = $t01578316024._6
429- let artSignID = $t01578316024._7
422+ let $t01578616027 = provideBaseData(i, nftId)
423+ let id = $t01578616027._1
424+ let caller = $t01578616027._2
425+ let date = $t01578616027._3
426+ let isValidNFT = $t01578616027._4
427+ let artId = $t01578616027._5
428+ let creatorAddr = $t01578616027._6
429+ let artSignID = $t01578616027._7
430430 let saleOwner = getStrByK(("current_owner_on_dapp_" + nftId))
431431 if ((saleOwner != caller))
432432 then throw("You don't own this NFT")
446446
447447 @Callable(i)
448448 func buyNFT (nftId) = {
449- let $t01685516948 = provideBaseData(i, nftId)
450- let id = $t01685516948._1
451- let caller = $t01685516948._2
452- let date = $t01685516948._3
453- let isValidNFT = $t01685516948._4
454- let artId = $t01685516948._5
455- let creatorAddr = $t01685516948._6
456- let artSignID = $t01685516948._7
449+ let $t01685816951 = provideBaseData(i, nftId)
450+ let id = $t01685816951._1
451+ let caller = $t01685816951._2
452+ let date = $t01685816951._3
453+ let isValidNFT = $t01685816951._4
454+ let artId = $t01685816951._5
455+ let creatorAddr = $t01685816951._6
456+ let artSignID = $t01685816951._7
457457 if ((size(artSignID) == 0))
458458 then throw("Artwork not found on SIGN Art, cancel your sale.")
459459 else if (!(isValidNFT))
469469 if ((parseInt(saleInfoArray[1]) == 0))
470470 then throw("Offer only")
471471 else {
472- let $t01744517481 = isPayment(i)
473- let payment = $t01744517481._1
474- let amount = $t01744517481._2
472+ let $t01744817484 = isPayment(i)
473+ let payment = $t01744817484._1
474+ let amount = $t01744817484._2
475475 let paymentAssetStr = if (isDefined(payment.assetId))
476476 then toBase58String(value(payment.assetId))
477477 else ""
480480 else (saleInfoArray[2] != paymentAssetStr))
481481 then throw("Payment infos don't match.")
482482 else {
483- let $t01799418133 = setTransfers(amount, payment.assetId, nftId, creatorAddr, saleOwner, caller, artId)
484- let commissions = $t01799418133._1
485- let creatorFee = $t01799418133._2
486- let ownerFee = $t01799418133._3
487- let collectorNFT = $t01799418133._4
483+ let $t01799718136 = setTransfers(amount, payment.assetId, nftId, creatorAddr, saleOwner, caller, artId)
484+ let commissions = $t01799718136._1
485+ let creatorFee = $t01799718136._2
486+ let ownerFee = $t01799718136._3
487+ let collectorNFT = $t01799718136._4
488488 (([DeleteEntry((saleKey + "_OPEN")), DeleteEntry(((("sale2nd_status_" + saleOwner) + "_") + nftId)), DeleteEntry(("current_owner_on_dapp_" + nftId)), StringEntry((((saleKey + "_") + id) + "_CLOSED"), ((((((saleInfo + "_CLOSED_") + toString(date)) + "_") + id) + "_") + caller)), updateNumSales(), ownerFee, collectorNFT] ++ creatorFee) ++ commissions)
489489 }
490490 }
496496
497497 @Callable(i)
498498 func setOffer (nftId) = {
499- let $t01854418641 = provideBaseData(i, nftId)
500- let id = $t01854418641._1
501- let offerOwner = $t01854418641._2
502- let date = $t01854418641._3
503- let isValidNFT = $t01854418641._4
504- let artId = $t01854418641._5
505- let creatorAddr = $t01854418641._6
506- let artSignID = $t01854418641._7
499+ let $t01854718644 = provideBaseData(i, nftId)
500+ let id = $t01854718644._1
501+ let offerOwner = $t01854718644._2
502+ let date = $t01854718644._3
503+ let isValidNFT = $t01854718644._4
504+ let artId = $t01854718644._5
505+ let creatorAddr = $t01854718644._6
506+ let artSignID = $t01854718644._7
507507 if (!(isValidNFT))
508508 then throw("Not a valid nft")
509509 else {
510- let $t01870218738 = isPayment(i)
511- let payment = $t01870218738._1
512- let amount = $t01870218738._2
510+ let $t01870518741 = isPayment(i)
511+ let payment = $t01870518741._1
512+ let amount = $t01870518741._2
513513 let assetId = if (!(isDefined(payment.assetId)))
514514 then "WAVES"
515515 else toBase58String(value(payment.assetId))
530530
531531 @Callable(i)
532532 func acceptOffer (nftId,offerId,offerOwner) = {
533- let $t01953119624 = provideBaseData(i, nftId)
534- let id = $t01953119624._1
535- let caller = $t01953119624._2
536- let date = $t01953119624._3
537- let isValidNFT = $t01953119624._4
538- let artId = $t01953119624._5
539- let creatorAddr = $t01953119624._6
540- let artSignID = $t01953119624._7
533+ let $t01953419627 = provideBaseData(i, nftId)
534+ let id = $t01953419627._1
535+ let caller = $t01953419627._2
536+ let date = $t01953419627._3
537+ let isValidNFT = $t01953419627._4
538+ let artId = $t01953419627._5
539+ let creatorAddr = $t01953419627._6
540+ let artSignID = $t01953419627._7
541541 if (!(isValidNFT))
542542 then throw("Not a valid nft")
543543 else {
546546 then throw("Only sale owner can accept offer")
547547 else {
548548 let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
549- let $t01987819933 = getBidData(bidKey)
550- let bidDataArr = $t01987819933._1
551- let assetId = $t01987819933._2
552- let bidData = $t01987819933._3
549+ let $t01988119936 = getBidData(bidKey)
550+ let bidDataArr = $t01988119936._1
551+ let assetId = $t01988119936._2
552+ let bidData = $t01988119936._3
553553 let saleKey = getSaleKey(saleOwner, nftId, artId, creatorAddr)
554554 let saleInfo = getStrByK((saleKey + "_OPEN"))
555555 if ((size(saleInfo) == 0))
556556 then throw("Sale Not found!")
557557 else {
558558 let amount = value(parseInt(bidDataArr[1]))
559- let $t02016920307 = setTransfers(amount, assetId, nftId, creatorAddr, saleOwner, bidDataArr[6], artId)
560- let commissions = $t02016920307._1
561- let creatorFee = $t02016920307._2
562- let ownerFee = $t02016920307._3
563- let collectorNFT = $t02016920307._4
559+ let $t02017220310 = setTransfers(amount, assetId, nftId, creatorAddr, saleOwner, bidDataArr[6], artId)
560+ let commissions = $t02017220310._1
561+ let creatorFee = $t02017220310._2
562+ let ownerFee = $t02017220310._3
563+ let collectorNFT = $t02017220310._4
564564 let assetIdStr = if (isDefined(assetId))
565565 then toBase58String(value(assetId))
566566 else "WAVES"
574574
575575 @Callable(i)
576576 func cancelOffer (nftId,offerId,offerOwner,saleOwner) = {
577- let $t02110721181 = idCallerDate(i)
578- let id = $t02110721181._1
579- let caller = $t02110721181._2
580- let date = $t02110721181._3
577+ let $t02111021184 = idCallerDate(i)
578+ let id = $t02111021184._1
579+ let caller = $t02111021184._2
580+ let date = $t02111021184._3
581581 if (if ((caller != offerOwner))
582582 then (caller != saleOwner)
583583 else false)
584584 then throw("You cannot cancel this offer.")
585585 else {
586586 let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
587- let $t02135321408 = getBidData(bidKey)
588- let bidDataArr = $t02135321408._1
589- let assetId = $t02135321408._2
590- let bidData = $t02135321408._3
587+ let $t02135621411 = getBidData(bidKey)
588+ let bidDataArr = $t02135621411._1
589+ let assetId = $t02135621411._2
590+ let bidData = $t02135621411._3
591591 [DeleteEntry((bidKey + "_OPEN")), StringEntry((bidKey + "_CANCELLED"), ((((bidData + "_CANCELLED_") + toString(date)) + "_") + id)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
592592 }
593593 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "2.0.0"
55
66 func getStrByK (key) = valueOrElse(getString(this, key), "")
77
88
99 let unitTest = false
1010
1111 let oracleFee = value(addressFromString(getStrByK("conf_oracle_fee")))
1212
1313 let signDapp = value(addressFromString(getStrByK("conf_signweb_dapp")))
1414
1515 let feeReceiver = getStrByK("conf_fee_receiver")
1616
1717 let artworksDapp = value(addressFromString(getStrByK("conf_artworks_dapp")))
1818
1919 let userDapp = if (unitTest)
2020 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
2121 else value(addressFromString(getStrByK("conf_users_dapp")))
2222
2323 let whitelistDapp = value(addressFromString(getStrByK("conf_whitelist_dapp")))
2424
2525 let puzzle_art_pool = getStrByK("conf_puzzle_art_pool")
2626
2727 let usdtPPAssetId_str = getStrByK("conf_accepted_asset_USDT_PP")
2828
2929 let artAssetId_str = getStrByK("conf_accepted_asset_ART")
3030
3131 let usdcPPAssetId_str = getStrByK("conf_accepted_asset_USDC_PP")
3232
3333 let eastAssetId_str = getStrByK("conf_accepted_asset_EAST")
3434
3535 let puzzleAssetId_str = getStrByK("conf_accepted_asset_PUZZLE")
3636
3737 let ethPPAssetId_str = getStrByK("conf_accepted_asset_ETH_PP")
3838
3939 let wavesAssetId_str = "WAVES"
4040
4141 let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
4242
4343 let artAssetId = fromBase58String(artAssetId_str)
4444
4545 let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
4646
4747 let eastAssetId = fromBase58String(eastAssetId_str)
4848
4949 let puzzleAssetId = fromBase58String(puzzleAssetId_str)
5050
5151 let ethPPAssetId = fromBase58String(ethPPAssetId_str)
5252
5353 let wavesAssetId = base58''
5454
5555 let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
5656
5757 let chris = getStrByK("conf_admin_1")
5858
5959 let commission_fee = 3
6060
6161 let userSuspended = "SUSPENDED"
6262
6363 let userRemoved = "REMOVED"
6464
6565 let artIllegal = "ILLEGAL"
6666
6767 let artSuspended = "SUSPENDED"
6868
6969 let dappRunningKey = "conf_dapp_is_running"
7070
7171 let maintenanceMSGKey = "conf_maintenance_msg"
7272
7373 let dappRunning = valueOrElse(getBoolean(this, dappRunningKey), true)
7474
7575 let maintenanceMSG = valueOrElse(getString(this, maintenanceMSGKey), "")
7676
7777 let numSalesK = "num_sales"
7878
7979 func getUserStrByK (key) = valueOrElse(getString(userDapp, key), "Error")
8080
8181
8282 func getArtworkRoyalties (key) = valueOrElse(getInteger(artworksDapp, key), 1000)
8383
8484
8585 func getArtStrByK (key) = valueOrElse(getString(artworksDapp, key), "")
8686
8787
8888 func getIntByK (key) = valueOrElse(getInteger(this, key), 0)
8989
9090
9191 func keyUserStatus (addr) = ("user_status_" + addr)
9292
9393
9494 func keyArtworkRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
9595
9696
9797 func keySignID (artistAddr,artId) = ((("art_signid_" + artId) + "_") + artistAddr)
9898
9999
100100 func keyFlag (artistAddr,artId) = ((("art_flag_" + artId) + "_") + artistAddr)
101101
102102
103103 func keyNFTData (id) = ("nft_" + id)
104104
105105
106106 func getSaleKey (caller,nftId,artId,creatorAddr) = ((((((("sale2nd_info_" + caller) + "_") + nftId) + "_") + artId) + "_") + creatorAddr)
107107
108108
109109 func getBidKey (offerOwner,nftId,saleOwner,offerId) = ((((((("offer2nd_" + offerOwner) + "_") + nftId) + "_") + saleOwner) + "_") + offerId)
110110
111111
112112 func getIntByKFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
113113
114114
115115 let currentCertificationPrice = getIntByKFromOracle(("certification_fee_" + toBase58String(artAssetId)))
116116
117117 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
118118
119119
120120 func keySecondaryShareAgent (artistAddr) = ("artist_agent_secondary_" + artistAddr)
121121
122122
123123 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
124124
125125
126126 func keySecondarySharePublicAgent (artistAddr) = ("artist_public_agent_secondary_" + artistAddr)
127127
128128
129129 func idCallerDate (i) = if (!(dappRunning))
130130 then throw(maintenanceMSG)
131131 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
132132
133133
134134 func isPayment (i) = if ((size(i.payments) == 0))
135135 then throw("No payment attached")
136136 else {
137137 let payment = value(i.payments[0])
138138 let amount = value(payment.amount)
139139 $Tuple2(payment, amount)
140140 }
141141
142142
143143 func assetIsValid (assetDetails) = if (if (if ((assetDetails.quantity == 1))
144144 then (assetDetails.decimals == 0)
145145 else false)
146146 then (assetDetails.reissuable == false)
147147 else false)
148148 then (assetDetails.issuer == artworksDapp)
149149 else false
150150
151151
152152 func isSignArtNFT (id) = {
153153 let assetDetails = value(assetInfo(id))
154154 assetIsValid(assetDetails)
155155 }
156156
157157
158158 func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
159159 then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
160160 else true
161161
162162
163163 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
164164 then unit
165165 else fromBase58String(assetId)
166166
167167
168168 func getSaleOwnerAndStatus (nftid) = {
169169 let saleOwner = getStrByK(("current_owner_on_dapp_" + nftid))
170170 if ((size(saleOwner) == 0))
171171 then throw("NFT not found")
172172 else {
173173 let saleStatus = getStrByK(((("sale2nd_status_" + saleOwner) + "_") + nftid))
174174 if ((saleStatus != "OPEN"))
175175 then throw("NFT not for sale")
176176 else saleOwner
177177 }
178178 }
179179
180180
181181 func getBidData (key) = {
182182 let bidData = getStrByK((key + "_OPEN"))
183183 if ((bidData == ""))
184184 then throw("Offer not found")
185185 else {
186186 let bidDataArr = split(bidData, "_")
187187 let assetId = getBidAssetId(bidDataArr[2])
188188 $Tuple3(bidDataArr, assetId, bidData)
189189 }
190190 }
191191
192192
193193 func getBalance (assetId) = match assetId {
194194 case b: ByteVector =>
195195 assetBalance(this, b)
196196 case _ =>
197197 wavesBalance(this).available
198198 }
199199
200200
201201 func artIsValid (artStatus) = if ((artStatus != artIllegal))
202202 then (artStatus != artSuspended)
203203 else false
204204
205205
206206 func checkArtStatus (addr,id) = {
207207 let artStatus = getArtStrByK(keyFlag(addr, id))
208208 if (artIsValid(artStatus))
209209 then true
210210 else throw(("Original Artwork flagged as " + artStatus))
211211 }
212212
213213
214214 func checkArtistStatus (addr) = {
215215 let artistStatus = getUserStrByK(keyUserStatus(addr))
216216 if (containsElement([userSuspended, userRemoved], artistStatus))
217217 then throw(("Original Artist " + artistStatus))
218218 else true
219219 }
220220
221221
222222 func checkNFTInfo (assetId) = {
223223 let nftData = split(getArtStrByK(keyNFTData(assetId)), "_")
224- let artSignID = getStrByK(((("art_name_" + nftData[5]) + "_") + nftData[6]))
224+ let artSignID = getArtStrByK(((("art_name_" + nftData[5]) + "_") + nftData[6]))
225225 if (if (!(checkArtStatus(nftData[6], nftData[5])))
226226 then !(checkArtistStatus(nftData[6]))
227227 else false)
228228 then $Tuple4(false, nftData[5], nftData[6], artSignID)
229229 else $Tuple4(true, nftData[5], nftData[6], artSignID)
230230 }
231231
232232
233233 func checkARTExist (artId,creatorAddr) = {
234234 let artSignID = getArtStrByK(keySignID(creatorAddr, artId))
235235 if ((size(artSignID) == 0))
236236 then throw("Artwork not found on SIGN Art")
237237 else if (if (!(checkArtStatus(creatorAddr, artId)))
238238 then !(checkArtistStatus(creatorAddr))
239239 else false)
240240 then false
241241 else true
242242 }
243243
244244
245245 func setTransfers (amount,assetId,nftid,creatorAddr,saleOwner,caller,artId) = {
246246 let creatorCut = getArtworkRoyalties(keyArtworkRoyalties(creatorAddr, artId))
247247 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(creatorAddr)), feeReceiver)
248248 let agentShare = valueOrElse(getInteger(userDapp, keySecondaryShareAgent(creatorAddr)), 0)
249249 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(creatorAddr)), feeReceiver)
250250 let publicAgentShare = valueOrElse(getInteger(userDapp, keySecondarySharePublicAgent(creatorAddr)), 0)
251251 let amountForSign = fraction(amount, commission_fee, 100)
252252 let amountForCreator = fraction(amount, creatorCut, 10000)
253253 let amountForOwner = (amount - (amountForSign + amountForCreator))
254254 let amountForAgent = if (if ((agent != feeReceiver))
255255 then (agentShare > 0)
256256 else false)
257257 then fraction(amount, agentShare, 10000)
258258 else 0
259259 let amountForPublicAgent = if (if ((publicAgent != feeReceiver))
260260 then (publicAgentShare > 0)
261261 else false)
262262 then fraction(amount, publicAgentShare, 10000)
263263 else 0
264264 let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
265265 then (amountForSign - amountForAgent)
266266 else amountForSign
267267 let amount_art_before = getBalance(artAssetId)
268268 if ((amount_art_before == amount_art_before))
269269 then {
270270 let swap_fee_to_art = if ((assetId != artAssetId))
271271 then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
272272 else unit
273273 if ((swap_fee_to_art == swap_fee_to_art))
274274 then {
275275 let amount_art_after = getBalance(artAssetId)
276276 if ((amount_art_after == amount_art_after))
277277 then {
278278 let commissions = if ((amountForAgent != 0))
279279 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
280280 then (amountForSign - amountForAgent)
281281 else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
282282 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
283283 then amountForSign
284284 else (amount_art_after - amount_art_before), artAssetId)]
285285 let creatorFee = if ((amountForPublicAgent != 0))
286286 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(creatorAddr)), (amountForCreator - amountForPublicAgent), assetId)]
287287 else [ScriptTransfer(Address(fromBase58String(creatorAddr)), amountForCreator, assetId)]
288288 let ownerFee = ScriptTransfer(Address(fromBase58String(saleOwner)), amountForOwner, assetId)
289289 let collectorNFT = ScriptTransfer(Address(fromBase58String(caller)), 1, fromBase58String(nftid))
290290 $Tuple4(commissions, creatorFee, ownerFee, collectorNFT)
291291 }
292292 else throw("Strict value is not equal to itself.")
293293 }
294294 else throw("Strict value is not equal to itself.")
295295 }
296296 else throw("Strict value is not equal to itself.")
297297 }
298298
299299
300300 func validateMinSell (price) = if ((0 >= price))
301301 then throw("Wrong minimum sell price")
302302 else true
303303
304304
305305 func provideBaseData (i,nftId) = {
306- let $t01213212172 = idCallerDate(i)
307- let id = $t01213212172._1
308- let caller = $t01213212172._2
309- let date = $t01213212172._3
310- let $t01217512244 = checkNFTInfo(nftId)
311- let isValidNFT = $t01217512244._1
312- let artId = $t01217512244._2
313- let creatorAddr = $t01217512244._3
314- let artSignID = $t01217512244._4
306+ let $t01213512175 = idCallerDate(i)
307+ let id = $t01213512175._1
308+ let caller = $t01213512175._2
309+ let date = $t01213512175._3
310+ let $t01217812247 = checkNFTInfo(nftId)
311+ let isValidNFT = $t01217812247._1
312+ let artId = $t01217812247._2
313+ let creatorAddr = $t01217812247._3
314+ let artSignID = $t01217812247._4
315315 $Tuple7(id, caller, date, isValidNFT, artId, creatorAddr, artSignID)
316316 }
317317
318318
319319 func updateNumSales () = {
320320 let numSales = getIntByK(numSalesK)
321321 IntegerEntry(numSalesK, (numSales + 1))
322322 }
323323
324324
325325 @Callable(invoke)
326326 func setConf (key,val) = {
327327 let caller = toString(invoke.caller)
328328 if (containsElement([chris, toString(this)], caller))
329329 then if (contains(key, "conf_"))
330330 then [StringEntry(key, val)]
331331 else throw("Entries starting with conf_ only")
332332 else throw("You are not allowed to change this")
333333 }
334334
335335
336336
337337 @Callable(invoke)
338338 func appRunning (isLive,message) = {
339339 let caller = toString(invoke.caller)
340340 let id = toBase58String(invoke.transactionId)
341341 if (containsElement([chris, toString(this)], caller))
342342 then [BooleanEntry(dappRunningKey, isLive), StringEntry(maintenanceMSGKey, message)]
343343 else throw("You are not allowed to change this")
344344 }
345345
346346
347347
348348 @Callable(i)
349349 func sellNFT (price,asset) = {
350- let $t01330913345 = isPayment(i)
351- let payment = $t01330913345._1
352- let amount = $t01330913345._2
350+ let $t01331213348 = isPayment(i)
351+ let payment = $t01331213348._1
352+ let amount = $t01331213348._2
353353 if ((amount != 1))
354354 then throw("No NFT attached")
355355 else {
356356 let nftId = if (if (isDefined(payment.assetId))
357357 then isSignArtNFT(value(payment.assetId))
358358 else false)
359359 then toBase58String(value(payment.assetId))
360360 else throw("Only SIGN Art NFT accepted.")
361- let $t01357913672 = provideBaseData(i, nftId)
362- let id = $t01357913672._1
363- let caller = $t01357913672._2
364- let date = $t01357913672._3
365- let isValidNFT = $t01357913672._4
366- let artId = $t01357913672._5
367- let creatorAddr = $t01357913672._6
368- let artSignID = $t01357913672._7
361+ let $t01358213675 = provideBaseData(i, nftId)
362+ let id = $t01358213675._1
363+ let caller = $t01358213675._2
364+ let date = $t01358213675._3
365+ let isValidNFT = $t01358213675._4
366+ let artId = $t01358213675._5
367+ let creatorAddr = $t01358213675._6
368+ let artSignID = $t01358213675._7
369369 if ((size(artSignID) == 0))
370370 then throw("Artwork not found on SIGN Art")
371371 else if (!(isValidNFT))
372372 then throw("Not a valid nft")
373373 else if (!(acceptedAssetIds(asset)))
374374 then throw("Only SIGN, USDN, USDT or WAVES accepted")
375375 else if (!(validateMinSell(price)))
376376 then throw("Wrong minimum sell price")
377377 else [StringEntry((getSaleKey(caller, nftId, artId, creatorAddr) + "_OPEN"), ((((((((((((toString(date) + "_") + toString(price)) + "_") + asset) + "_") + nftId) + "_") + artId) + "_") + creatorAddr) + "_") + id)), StringEntry(((("sale2nd_status_" + caller) + "_") + nftId), "OPEN"), StringEntry(("current_owner_on_dapp_" + nftId), caller)]
378378 }
379379 }
380380
381381
382382
383383 @Callable(i)
384384 func updateSalePrice (nftId,price,asset) = {
385- let $t01454914642 = provideBaseData(i, nftId)
386- let id = $t01454914642._1
387- let caller = $t01454914642._2
388- let date = $t01454914642._3
389- let isValidNFT = $t01454914642._4
390- let artId = $t01454914642._5
391- let creatorAddr = $t01454914642._6
392- let artSignID = $t01454914642._7
385+ let $t01455214645 = provideBaseData(i, nftId)
386+ let id = $t01455214645._1
387+ let caller = $t01455214645._2
388+ let date = $t01455214645._3
389+ let isValidNFT = $t01455214645._4
390+ let artId = $t01455214645._5
391+ let creatorAddr = $t01455214645._6
392+ let artSignID = $t01455214645._7
393393 if ((size(artSignID) == 0))
394394 then throw("Artwork not found on SIGN Art, cancel your sale.")
395395 else if (!(isValidNFT))
396396 then throw("Not a valid nft")
397397 else {
398398 let saleOwner = getStrByK(("current_owner_on_dapp_" + nftId))
399399 if ((saleOwner != caller))
400400 then throw("You don't own this NFT")
401401 else {
402402 let saleStatus = getStrByK(((("sale2nd_status_" + caller) + "_") + nftId))
403403 if ((saleStatus != "OPEN"))
404404 then throw("Sale not active")
405405 else if (!(acceptedAssetIds(asset)))
406406 then throw("Only SIGN, USDN, USDT or WAVES accepted")
407407 else if (!(validateMinSell(price)))
408408 then throw("Wrong minimum sell price")
409409 else {
410410 let saleKey = getSaleKey(caller, nftId, artId, creatorAddr)
411411 let saleInfo = split(getStrByK((saleKey + "_OPEN")), "_")
412412 [StringEntry((saleKey + "_OPEN"), ((((((((((((saleInfo[0] + "_") + toString(price)) + "_") + asset) + "_") + saleInfo[3]) + "_") + saleInfo[4]) + "_") + saleInfo[5]) + "_") + saleInfo[6]))]
413413 }
414414 }
415415 }
416416 }
417417
418418
419419
420420 @Callable(i)
421421 func cancelSale (nftId) = {
422- let $t01578316024 = provideBaseData(i, nftId)
423- let id = $t01578316024._1
424- let caller = $t01578316024._2
425- let date = $t01578316024._3
426- let isValidNFT = $t01578316024._4
427- let artId = $t01578316024._5
428- let creatorAddr = $t01578316024._6
429- let artSignID = $t01578316024._7
422+ let $t01578616027 = provideBaseData(i, nftId)
423+ let id = $t01578616027._1
424+ let caller = $t01578616027._2
425+ let date = $t01578616027._3
426+ let isValidNFT = $t01578616027._4
427+ let artId = $t01578616027._5
428+ let creatorAddr = $t01578616027._6
429+ let artSignID = $t01578616027._7
430430 let saleOwner = getStrByK(("current_owner_on_dapp_" + nftId))
431431 if ((saleOwner != caller))
432432 then throw("You don't own this NFT")
433433 else {
434434 let saleStatus = getStrByK(((("sale2nd_status_" + caller) + "_") + nftId))
435435 if ((saleStatus != "OPEN"))
436436 then throw("Sale not active")
437437 else {
438438 let saleKey = getSaleKey(caller, nftId, artId, creatorAddr)
439439 let saleInfo = getStrByK((saleKey + "_OPEN"))
440440 [DeleteEntry((saleKey + "_OPEN")), DeleteEntry(((("sale2nd_status_" + caller) + "_") + nftId)), DeleteEntry(("current_owner_on_dapp_" + nftId)), StringEntry((((saleKey + "_") + id) + "_CANCELLED"), ((((saleInfo + "_CANCELLED_") + toString(date)) + "_") + id)), ScriptTransfer(Address(fromBase58String(caller)), 1, fromBase58String(nftId))]
441441 }
442442 }
443443 }
444444
445445
446446
447447 @Callable(i)
448448 func buyNFT (nftId) = {
449- let $t01685516948 = provideBaseData(i, nftId)
450- let id = $t01685516948._1
451- let caller = $t01685516948._2
452- let date = $t01685516948._3
453- let isValidNFT = $t01685516948._4
454- let artId = $t01685516948._5
455- let creatorAddr = $t01685516948._6
456- let artSignID = $t01685516948._7
449+ let $t01685816951 = provideBaseData(i, nftId)
450+ let id = $t01685816951._1
451+ let caller = $t01685816951._2
452+ let date = $t01685816951._3
453+ let isValidNFT = $t01685816951._4
454+ let artId = $t01685816951._5
455+ let creatorAddr = $t01685816951._6
456+ let artSignID = $t01685816951._7
457457 if ((size(artSignID) == 0))
458458 then throw("Artwork not found on SIGN Art, cancel your sale.")
459459 else if (!(isValidNFT))
460460 then throw("Not a valid nft")
461461 else {
462462 let saleOwner = getSaleOwnerAndStatus(nftId)
463463 let saleKey = getSaleKey(saleOwner, nftId, artId, creatorAddr)
464464 let saleInfo = getStrByK((saleKey + "_OPEN"))
465465 if ((size(saleInfo) == 0))
466466 then throw("Sale Not found!")
467467 else {
468468 let saleInfoArray = split(saleInfo, "_")
469469 if ((parseInt(saleInfoArray[1]) == 0))
470470 then throw("Offer only")
471471 else {
472- let $t01744517481 = isPayment(i)
473- let payment = $t01744517481._1
474- let amount = $t01744517481._2
472+ let $t01744817484 = isPayment(i)
473+ let payment = $t01744817484._1
474+ let amount = $t01744817484._2
475475 let paymentAssetStr = if (isDefined(payment.assetId))
476476 then toBase58String(value(payment.assetId))
477477 else ""
478478 if (if ((saleInfoArray[1] != toString(amount)))
479479 then true
480480 else (saleInfoArray[2] != paymentAssetStr))
481481 then throw("Payment infos don't match.")
482482 else {
483- let $t01799418133 = setTransfers(amount, payment.assetId, nftId, creatorAddr, saleOwner, caller, artId)
484- let commissions = $t01799418133._1
485- let creatorFee = $t01799418133._2
486- let ownerFee = $t01799418133._3
487- let collectorNFT = $t01799418133._4
483+ let $t01799718136 = setTransfers(amount, payment.assetId, nftId, creatorAddr, saleOwner, caller, artId)
484+ let commissions = $t01799718136._1
485+ let creatorFee = $t01799718136._2
486+ let ownerFee = $t01799718136._3
487+ let collectorNFT = $t01799718136._4
488488 (([DeleteEntry((saleKey + "_OPEN")), DeleteEntry(((("sale2nd_status_" + saleOwner) + "_") + nftId)), DeleteEntry(("current_owner_on_dapp_" + nftId)), StringEntry((((saleKey + "_") + id) + "_CLOSED"), ((((((saleInfo + "_CLOSED_") + toString(date)) + "_") + id) + "_") + caller)), updateNumSales(), ownerFee, collectorNFT] ++ creatorFee) ++ commissions)
489489 }
490490 }
491491 }
492492 }
493493 }
494494
495495
496496
497497 @Callable(i)
498498 func setOffer (nftId) = {
499- let $t01854418641 = provideBaseData(i, nftId)
500- let id = $t01854418641._1
501- let offerOwner = $t01854418641._2
502- let date = $t01854418641._3
503- let isValidNFT = $t01854418641._4
504- let artId = $t01854418641._5
505- let creatorAddr = $t01854418641._6
506- let artSignID = $t01854418641._7
499+ let $t01854718644 = provideBaseData(i, nftId)
500+ let id = $t01854718644._1
501+ let offerOwner = $t01854718644._2
502+ let date = $t01854718644._3
503+ let isValidNFT = $t01854718644._4
504+ let artId = $t01854718644._5
505+ let creatorAddr = $t01854718644._6
506+ let artSignID = $t01854718644._7
507507 if (!(isValidNFT))
508508 then throw("Not a valid nft")
509509 else {
510- let $t01870218738 = isPayment(i)
511- let payment = $t01870218738._1
512- let amount = $t01870218738._2
510+ let $t01870518741 = isPayment(i)
511+ let payment = $t01870518741._1
512+ let amount = $t01870518741._2
513513 let assetId = if (!(isDefined(payment.assetId)))
514514 then "WAVES"
515515 else toBase58String(value(payment.assetId))
516516 if (!(acceptedAssetIds(assetId)))
517517 then throw("asset not accepted")
518518 else if ((amount == 0))
519519 then throw("Offer of 0 not allowed")
520520 else if (!(validateMinSell(amount)))
521521 then throw("Wrong minimum sell price")
522522 else {
523523 let saleOwner = getSaleOwnerAndStatus(nftId)
524524 [StringEntry((getBidKey(offerOwner, nftId, saleOwner, id) + "_OPEN"), ((((((((((((((toString(date) + "_") + toString(amount)) + "_") + assetId) + "_") + nftId) + "_") + artId) + "_") + creatorAddr) + "_") + offerOwner) + "_") + id))]
525525 }
526526 }
527527 }
528528
529529
530530
531531 @Callable(i)
532532 func acceptOffer (nftId,offerId,offerOwner) = {
533- let $t01953119624 = provideBaseData(i, nftId)
534- let id = $t01953119624._1
535- let caller = $t01953119624._2
536- let date = $t01953119624._3
537- let isValidNFT = $t01953119624._4
538- let artId = $t01953119624._5
539- let creatorAddr = $t01953119624._6
540- let artSignID = $t01953119624._7
533+ let $t01953419627 = provideBaseData(i, nftId)
534+ let id = $t01953419627._1
535+ let caller = $t01953419627._2
536+ let date = $t01953419627._3
537+ let isValidNFT = $t01953419627._4
538+ let artId = $t01953419627._5
539+ let creatorAddr = $t01953419627._6
540+ let artSignID = $t01953419627._7
541541 if (!(isValidNFT))
542542 then throw("Not a valid nft")
543543 else {
544544 let saleOwner = getSaleOwnerAndStatus(nftId)
545545 if ((caller != saleOwner))
546546 then throw("Only sale owner can accept offer")
547547 else {
548548 let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
549- let $t01987819933 = getBidData(bidKey)
550- let bidDataArr = $t01987819933._1
551- let assetId = $t01987819933._2
552- let bidData = $t01987819933._3
549+ let $t01988119936 = getBidData(bidKey)
550+ let bidDataArr = $t01988119936._1
551+ let assetId = $t01988119936._2
552+ let bidData = $t01988119936._3
553553 let saleKey = getSaleKey(saleOwner, nftId, artId, creatorAddr)
554554 let saleInfo = getStrByK((saleKey + "_OPEN"))
555555 if ((size(saleInfo) == 0))
556556 then throw("Sale Not found!")
557557 else {
558558 let amount = value(parseInt(bidDataArr[1]))
559- let $t02016920307 = setTransfers(amount, assetId, nftId, creatorAddr, saleOwner, bidDataArr[6], artId)
560- let commissions = $t02016920307._1
561- let creatorFee = $t02016920307._2
562- let ownerFee = $t02016920307._3
563- let collectorNFT = $t02016920307._4
559+ let $t02017220310 = setTransfers(amount, assetId, nftId, creatorAddr, saleOwner, bidDataArr[6], artId)
560+ let commissions = $t02017220310._1
561+ let creatorFee = $t02017220310._2
562+ let ownerFee = $t02017220310._3
563+ let collectorNFT = $t02017220310._4
564564 let assetIdStr = if (isDefined(assetId))
565565 then toBase58String(value(assetId))
566566 else "WAVES"
567567 (([DeleteEntry((saleKey + "_OPEN")), DeleteEntry((bidKey + "_OPEN")), DeleteEntry(((("sale2nd_status_" + saleOwner) + "_") + nftId)), DeleteEntry(("current_owner_on_dapp_" + nftId)), StringEntry((bidKey + "_CLOSED"), ((((bidData + "_CLOSED_") + toString(date)) + "_") + id)), StringEntry((((saleKey + "_") + id) + "_CLOSED"), ((((((((((saleInfo + "_CLOSED-OFFER_") + toString(date)) + "_") + id) + "_") + offerOwner) + "_") + toString(amount)) + "_") + assetIdStr)), updateNumSales(), ownerFee, collectorNFT] ++ creatorFee) ++ commissions)
568568 }
569569 }
570570 }
571571 }
572572
573573
574574
575575 @Callable(i)
576576 func cancelOffer (nftId,offerId,offerOwner,saleOwner) = {
577- let $t02110721181 = idCallerDate(i)
578- let id = $t02110721181._1
579- let caller = $t02110721181._2
580- let date = $t02110721181._3
577+ let $t02111021184 = idCallerDate(i)
578+ let id = $t02111021184._1
579+ let caller = $t02111021184._2
580+ let date = $t02111021184._3
581581 if (if ((caller != offerOwner))
582582 then (caller != saleOwner)
583583 else false)
584584 then throw("You cannot cancel this offer.")
585585 else {
586586 let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
587- let $t02135321408 = getBidData(bidKey)
588- let bidDataArr = $t02135321408._1
589- let assetId = $t02135321408._2
590- let bidData = $t02135321408._3
587+ let $t02135621411 = getBidData(bidKey)
588+ let bidDataArr = $t02135621411._1
589+ let assetId = $t02135621411._2
590+ let bidData = $t02135621411._3
591591 [DeleteEntry((bidKey + "_OPEN")), StringEntry((bidKey + "_CANCELLED"), ((((bidData + "_CANCELLED_") + toString(date)) + "_") + id)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
592592 }
593593 }
594594
595595

github/deemru/w8io/6500d08 
127.71 ms