tx · DKmqewW2WgqVWmd4uwALQekfKvT6Zj84SdtGsPWcu5Ai

3N2eA4yzXa4wTj7pP8r6G144RRxZW7cmq4p:  -0.01700000 Waves

2023.10.10 11:53 [2792313] smart account 3N2eA4yzXa4wTj7pP8r6G144RRxZW7cmq4p > SELF 0.00000000 Waves

{ "type": 13, "id": "DKmqewW2WgqVWmd4uwALQekfKvT6Zj84SdtGsPWcu5Ai", "fee": 1700000, "feeAssetId": null, "timestamp": 1696928089816, "version": 2, "chainId": 84, "sender": "3N2eA4yzXa4wTj7pP8r6G144RRxZW7cmq4p", "senderPublicKey": "Hh3eFP2XFetZSfTxQiM1Ps96f68zi8Zh5ghhCZdjgdFs", "proofs": [ "3NjW9qEV6J8NJgM86S61FivY87ZxpKWHHzYfxem7wzqZrU8MJwSXDd5mh28mRTVghLUgE5YfGVars9SnxDj97BTH" ], "script": "base64:BgI5CAISBAoCCAgSBAoCBAgSBAoCAQgSBQoDCAEIEgMKAQgSAwoBCBIDCgEIEgUKAwgICBIGCgQICAgIRwAHVkVSU0lPTgIFMi4wLjABCWdldFN0ckJ5SwEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEJZ2V0U3RyQnlLAQIPY29uZl9vcmFjbGVfZmVlAAhzaWduRGFwcAkBBXZhbHVlAQkApggBCQEJZ2V0U3RyQnlLAQIRY29uZl9zaWdud2ViX2RhcHAAC2ZlZVJlY2VpdmVyCQEJZ2V0U3RyQnlLAQIRY29uZl9mZWVfcmVjZWl2ZXIADGFydHdvcmtzRGFwcAkBBXZhbHVlAQkApggBCQEJZ2V0U3RyQnlLAQISY29uZl9hcnR3b3Jrc19kYXBwAAh1c2VyRGFwcAMFCHVuaXRUZXN0CQEFdmFsdWUBCQCmCAECIzNNdDRSR01FeWpTV1lBb2NUUHFkNTV3ZEhRUUIzUFUyVUNtCQEFdmFsdWUBCQCmCAEJAQlnZXRTdHJCeUsBAg9jb25mX3VzZXJzX2RhcHAADXdoaXRlbGlzdERhcHAJAQV2YWx1ZQEJAKYIAQkBCWdldFN0ckJ5SwECE2NvbmZfd2hpdGVsaXN0X2RhcHAAD3B1enpsZV9hcnRfcG9vbAkBCWdldFN0ckJ5SwECFGNvbmZfcHV6emxlX2FydF9wb29sABF1c2R0UFBBc3NldElkX3N0cgkBCWdldFN0ckJ5SwECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEVF9QUAAOYXJ0QXNzZXRJZF9zdHIJAQlnZXRTdHJCeUsBAhdjb25mX2FjY2VwdGVkX2Fzc2V0X0FSVAARdXNkY1BQQXNzZXRJZF9zdHIJAQlnZXRTdHJCeUsBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRENfUFAAD2Vhc3RBc3NldElkX3N0cgkBCWdldFN0ckJ5SwECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfRUFTVAARcHV6emxlQXNzZXRJZF9zdHIJAQlnZXRTdHJCeUsBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X1BVWlpMRQAQZXRoUFBBc3NldElkX3N0cgkBCWdldFN0ckJ5SwECGmNvbmZfYWNjZXB0ZWRfYXNzZXRfRVRIX1BQABB3YXZlc0Fzc2V0SWRfc3RyAgVXQVZFUwANdXNkdFBQQXNzZXRJZAkA2QQBBRF1c2R0UFBBc3NldElkX3N0cgAKYXJ0QXNzZXRJZAkA2QQBBQ5hcnRBc3NldElkX3N0cgANdXNkY1BQQXNzZXRJZAkA2QQBBRF1c2RjUFBBc3NldElkX3N0cgALZWFzdEFzc2V0SWQJANkEAQUPZWFzdEFzc2V0SWRfc3RyAA1wdXp6bGVBc3NldElkCQDZBAEFEXB1enpsZUFzc2V0SWRfc3RyAAxldGhQUEFzc2V0SWQJANkEAQUQZXRoUFBBc3NldElkX3N0cgAMd2F2ZXNBc3NldElkAQAAE2FsbF9hY2NlcHRlZF9hc3NldHMJAMwIAgURdXNkdFBQQXNzZXRJZF9zdHIJAMwIAgUOYXJ0QXNzZXRJZF9zdHIJAMwIAgURdXNkY1BQQXNzZXRJZF9zdHIJAMwIAgUPZWFzdEFzc2V0SWRfc3RyCQDMCAIFEXB1enpsZUFzc2V0SWRfc3RyCQDMCAIFEHdhdmVzQXNzZXRJZF9zdHIJAMwIAgUQZXRoUFBBc3NldElkX3N0cgUDbmlsAAVjaHJpcwkBCWdldFN0ckJ5SwECDGNvbmZfYWRtaW5fMQAOY29tbWlzc2lvbl9mZWUAAwANdXNlclN1c3BlbmRlZAIJU1VTUEVOREVEAAt1c2VyUmVtb3ZlZAIHUkVNT1ZFRAAKYXJ0SWxsZWdhbAIHSUxMRUdBTAAMYXJ0U3VzcGVuZGVkAglTVVNQRU5ERUQADmRhcHBSdW5uaW5nS2V5AhRjb25mX2RhcHBfaXNfcnVubmluZwARbWFpbnRlbmFuY2VNU0dLZXkCFGNvbmZfbWFpbnRlbmFuY2VfbXNnAAtkYXBwUnVubmluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ5kYXBwUnVubmluZ0tleQYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFEW1haW50ZW5hbmNlTVNHS2V5AgAACW51bVNhbGVzSwIJbnVtX3NhbGVzAQ1nZXRVc2VyU3RyQnlLAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAFA2tleQIFRXJyb3IBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQxhcnR3b3Jrc0RhcHAFA2tleQDoBwEMZ2V0QXJ0U3RyQnlLAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUMYXJ0d29ya3NEYXBwBQNrZXkCAAEJZ2V0SW50QnlLAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABDWtleVVzZXJTdGF0dXMBBGFkZHIJAKwCAgIMdXNlcl9zdGF0dXNfBQRhZGRyARNrZXlBcnR3b3JrUm95YWx0aWVzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDmFydF9yb3lhbHRpZXNfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlTaWduSUQCCmFydGlzdEFkZHIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQVhcnRJZAIBXwUKYXJ0aXN0QWRkcgEHa2V5RmxhZwIKYXJ0aXN0QWRkcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2ZsYWdfBQVhcnRJZAIBXwUKYXJ0aXN0QWRkcgEKa2V5TkZURGF0YQECaWQJAKwCAgIEbmZ0XwUCaWQBCmdldFNhbGVLZXkEBmNhbGxlcgVuZnRJZAVhcnRJZAtjcmVhdG9yQWRkcgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1zYWxlMm5kX2luZm9fBQZjYWxsZXICAV8FBW5mdElkAgFfBQVhcnRJZAIBXwULY3JlYXRvckFkZHIBCWdldEJpZEtleQQKb2ZmZXJPd25lcgVuZnRJZAlzYWxlT3duZXIHb2ZmZXJJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglvZmZlcjJuZF8FCm9mZmVyT3duZXICAV8FBW5mdElkAgFfBQlzYWxlT3duZXICAV8FB29mZmVySWQBE2dldEludEJ5S0Zyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQETZ2V0SW50QnlLRnJvbU9yYWNsZQEJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEFCmFydEFzc2V0SWQBEmtleUFydGlzdEFnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAg1hcnRpc3RfYWdlbnRfBQphcnRpc3RBZGRyARZrZXlTZWNvbmRhcnlTaGFyZUFnZW50AQphcnRpc3RBZGRyCQCsAgICF2FydGlzdF9hZ2VudF9zZWNvbmRhcnlfBQphcnRpc3RBZGRyARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgIUYXJ0aXN0X3B1YmxpY19hZ2VudF8FCmFydGlzdEFkZHIBHGtleVNlY29uZGFyeVNoYXJlUHVibGljQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIeYXJ0aXN0X3B1YmxpY19hZ2VudF9zZWNvbmRhcnlfBQphcnRpc3RBZGRyAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQlpc1BheW1lbnQBAWkDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQJAQV2YWx1ZQEIBQdwYXltZW50BmFtb3VudAkAlAoCBQdwYXltZW50BQZhbW91bnQBDGFzc2V0SXNWYWxpZAEMYXNzZXREZXRhaWxzAwMDCQAAAggFDGFzc2V0RGV0YWlscwhxdWFudGl0eQABCQAAAggFDGFzc2V0RGV0YWlscwhkZWNpbWFscwAABwkAAAIIBQxhc3NldERldGFpbHMKcmVpc3N1YWJsZQcHCQAAAggFDGFzc2V0RGV0YWlscwZpc3N1ZXIFDGFydHdvcmtzRGFwcAcBDGlzU2lnbkFydE5GVAECaWQEDGFzc2V0RGV0YWlscwkBBXZhbHVlAQkA7AcBBQJpZAkBDGFzc2V0SXNWYWxpZAEFDGFzc2V0RGV0YWlscwEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFE2FsbF9hY2NlcHRlZF9hc3NldHMFB2Fzc2V0SWQJAAIBAkBPbmx5ICRBUlQsIFVTRFQtUFAsIFVTREMtUFAsIEVBU1QsIFBVWlpMRSwgRVRIIG9yIFdBVkVTIGFjY2VwdGVkBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARVnZXRTYWxlT3duZXJBbmRTdGF0dXMBBW5mdGlkBAlzYWxlT3duZXIJAQlnZXRTdHJCeUsBCQCsAgICFmN1cnJlbnRfb3duZXJfb25fZGFwcF8FBW5mdGlkAwkAAAIJALECAQUJc2FsZU93bmVyAAAJAAIBAg1ORlQgbm90IGZvdW5kBApzYWxlU3RhdHVzCQEJZ2V0U3RyQnlLAQkArAICCQCsAgIJAKwCAgIPc2FsZTJuZF9zdGF0dXNfBQlzYWxlT3duZXICAV8FBW5mdGlkAwkBAiE9AgUKc2FsZVN0YXR1cwIET1BFTgkAAgECEE5GVCBub3QgZm9yIHNhbGUFCXNhbGVPd25lcgEKZ2V0QmlkRGF0YQEDa2V5BAdiaWREYXRhCQEJZ2V0U3RyQnlLAQkArAICBQNrZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECD09mZmVyIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgACCQCVCgMFCmJpZERhdGFBcnIFB2Fzc2V0SWQFB2JpZERhdGEBCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEKYXJ0SXNWYWxpZAEJYXJ0U3RhdHVzAwkBAiE9AgUJYXJ0U3RhdHVzBQphcnRJbGxlZ2FsCQECIT0CBQlhcnRTdGF0dXMFDGFydFN1c3BlbmRlZAcBDmNoZWNrQXJ0U3RhdHVzAgRhZGRyAmlkBAlhcnRTdGF0dXMJAQxnZXRBcnRTdHJCeUsBCQEHa2V5RmxhZwIFBGFkZHIFAmlkAwkBCmFydElzVmFsaWQBBQlhcnRTdGF0dXMGCQACAQkArAICAhxPcmlnaW5hbCBBcnR3b3JrIGZsYWdnZWQgYXMgBQlhcnRTdGF0dXMBEWNoZWNrQXJ0aXN0U3RhdHVzAQRhZGRyBAxhcnRpc3RTdGF0dXMJAQ1nZXRVc2VyU3RyQnlLAQkBDWtleVVzZXJTdGF0dXMBBQRhZGRyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUNdXNlclN1c3BlbmRlZAkAzAgCBQt1c2VyUmVtb3ZlZAUDbmlsBQxhcnRpc3RTdGF0dXMJAAIBCQCsAgICEE9yaWdpbmFsIEFydGlzdCAFDGFydGlzdFN0YXR1cwYBDGNoZWNrTkZUSW5mbwEHYXNzZXRJZAQHbmZ0RGF0YQkAtQkCCQEMZ2V0QXJ0U3RyQnlLAQkBCmtleU5GVERhdGEBBQdhc3NldElkAgFfBAlhcnRTaWduSUQJAQxnZXRBcnRTdHJCeUsBCQEJa2V5U2lnbklEAgkAkQMCBQduZnREYXRhAAYJAJEDAgUHbmZ0RGF0YQAFAwMJAQEhAQkBDmNoZWNrQXJ0U3RhdHVzAgkAkQMCBQduZnREYXRhAAYJAJEDAgUHbmZ0RGF0YQAFCQEBIQEJARFjaGVja0FydGlzdFN0YXR1cwEJAJEDAgUHbmZ0RGF0YQAGBwkAlgoEBwkAkQMCBQduZnREYXRhAAUJAJEDAgUHbmZ0RGF0YQAGBQlhcnRTaWduSUQJAJYKBAYJAJEDAgUHbmZ0RGF0YQAFCQCRAwIFB25mdERhdGEABgUJYXJ0U2lnbklEAQ1jaGVja0FSVEV4aXN0AgVhcnRJZAtjcmVhdG9yQWRkcgQJYXJ0U2lnbklECQEMZ2V0QXJ0U3RyQnlLAQkBCWtleVNpZ25JRAIFC2NyZWF0b3JBZGRyBQVhcnRJZAMJAAACCQCxAgEFCWFydFNpZ25JRAAACQACAQIdQXJ0d29yayBub3QgZm91bmQgb24gU0lHTiBBcnQDAwkBASEBCQEOY2hlY2tBcnRTdGF0dXMCBQtjcmVhdG9yQWRkcgUFYXJ0SWQJAQEhAQkBEWNoZWNrQXJ0aXN0U3RhdHVzAQULY3JlYXRvckFkZHIHBwYBDHNldFRyYW5zZmVycwcGYW1vdW50B2Fzc2V0SWQFbmZ0aWQLY3JlYXRvckFkZHIJc2FsZU93bmVyBmNhbGxlcgVhcnRJZAQKY3JlYXRvckN1dAkBE2dldEFydHdvcmtSb3lhbHRpZXMBCQETa2V5QXJ0d29ya1JveWFsdGllcwIFC2NyZWF0b3JBZGRyBQVhcnRJZAQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQtjcmVhdG9yQWRkcgULZmVlUmVjZWl2ZXIECmFnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARZrZXlTZWNvbmRhcnlTaGFyZUFnZW50AQULY3JlYXRvckFkZHIAAAQLcHVibGljQWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBBQtjcmVhdG9yQWRkcgULZmVlUmVjZWl2ZXIEEHB1YmxpY0FnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARxrZXlTZWNvbmRhcnlTaGFyZVB1YmxpY0FnZW50AQULY3JlYXRvckFkZHIAAAQNYW1vdW50Rm9yU2lnbgkAawMFBmFtb3VudAUOY29tbWlzc2lvbl9mZWUAZAQQYW1vdW50Rm9yQ3JlYXRvcgkAawMFBmFtb3VudAUKY3JlYXRvckN1dACQTgQOYW1vdW50Rm9yT3duZXIJAGUCBQZhbW91bnQJAGQCBQ1hbW91bnRGb3JTaWduBRBhbW91bnRGb3JDcmVhdG9yBA5hbW91bnRGb3JBZ2VudAMDCQECIT0CBQVhZ2VudAULZmVlUmVjZWl2ZXIJAGYCBQphZ2VudFNoYXJlAAAHCQBrAwUGYW1vdW50BQphZ2VudFNoYXJlAJBOAAAEFGFtb3VudEZvclB1YmxpY0FnZW50AwMJAQIhPQIFC3B1YmxpY0FnZW50BQtmZWVSZWNlaXZlcgkAZgIFEHB1YmxpY0FnZW50U2hhcmUAAAcJAGsDBQZhbW91bnQFEHB1YmxpY0FnZW50U2hhcmUAkE4AAAQiYW1vdW50X2NvbW1pc3Npb25fZm9yX3NpZ25fdG9fc3dhcAMJAQIhPQIFDmFtb3VudEZvckFnZW50AAAJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAUNYW1vdW50Rm9yU2lnbgQRYW1vdW50X2FydF9iZWZvcmUJAQpnZXRCYWxhbmNlAQUKYXJ0QXNzZXRJZAMJAAACBRFhbW91bnRfYXJ0X2JlZm9yZQURYW1vdW50X2FydF9iZWZvcmUED3N3YXBfZmVlX3RvX2FydAMJAQIhPQIFB2Fzc2V0SWQFCmFydEFzc2V0SWQJAPwHBAkBB0FkZHJlc3MBCQDZBAEFD3B1enpsZV9hcnRfcG9vbAIEc3dhcAkAzAgCBQ5hcnRBc3NldElkX3N0cgkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUiYW1vdW50X2NvbW1pc3Npb25fZm9yX3NpZ25fdG9fc3dhcAUDbmlsBQR1bml0AwkAAAIFD3N3YXBfZmVlX3RvX2FydAUPc3dhcF9mZWVfdG9fYXJ0BBBhbW91bnRfYXJ0X2FmdGVyCQEKZ2V0QmFsYW5jZQEFCmFydEFzc2V0SWQDCQAAAgUQYW1vdW50X2FydF9hZnRlcgUQYW1vdW50X2FydF9hZnRlcgQLY29tbWlzc2lvbnMDCQECIT0CBQ5hbW91bnRGb3JBZ2VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgMJAAACBQdhc3NldElkBQphcnRBc3NldElkCQBlAgUNYW1vdW50Rm9yU2lnbgUOYW1vdW50Rm9yQWdlbnQJAGUCBRBhbW91bnRfYXJ0X2FmdGVyBRFhbW91bnRfYXJ0X2JlZm9yZQUKYXJ0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUFYWdlbnQFDmFtb3VudEZvckFnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyAwkAAAIFB2Fzc2V0SWQFCmFydEFzc2V0SWQFDWFtb3VudEZvclNpZ24JAGUCBRBhbW91bnRfYXJ0X2FmdGVyBRFhbW91bnRfYXJ0X2JlZm9yZQUKYXJ0QXNzZXRJZAUDbmlsBApjcmVhdG9yRmVlAwkBAiE9AgUUYW1vdW50Rm9yUHVibGljQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULcHVibGljQWdlbnQFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtjcmVhdG9yQWRkcgkAZQIFEGFtb3VudEZvckNyZWF0b3IFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2NyZWF0b3JBZGRyBRBhbW91bnRGb3JDcmVhdG9yBQdhc3NldElkBQNuaWwECG93bmVyRmVlCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUJc2FsZU93bmVyBQ5hbW91bnRGb3JPd25lcgUHYXNzZXRJZAQMY29sbGVjdG9yTkZUCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAEJANkEAQUFbmZ0aWQJAJYKBAULY29tbWlzc2lvbnMFCmNyZWF0b3JGZWUFCG93bmVyRmVlBQxjb2xsZWN0b3JORlQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD3ZhbGlkYXRlTWluU2VsbAEFcHJpY2UDCQBnAgAABQVwcmljZQkAAgECGFdyb25nIG1pbmltdW0gc2VsbCBwcmljZQYBD3Byb3ZpZGVCYXNlRGF0YQIBaQVuZnRJZAQNJHQwMTE5MTIxMTk1MgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTE5MTIxMTk1MgJfMQQGY2FsbGVyCAUNJHQwMTE5MTIxMTk1MgJfMgQEZGF0ZQgFDSR0MDExOTEyMTE5NTICXzMEDSR0MDExOTU1MTIwMjQJAQxjaGVja05GVEluZm8BBQVuZnRJZAQKaXNWYWxpZE5GVAgFDSR0MDExOTU1MTIwMjQCXzEEBWFydElkCAUNJHQwMTE5NTUxMjAyNAJfMgQLY3JlYXRvckFkZHIIBQ0kdDAxMTk1NTEyMDI0Al8zBAlhcnRTaWduSUQIBQ0kdDAxMTk1NTEyMDI0Al80CQCZCgcFAmlkBQZjYWxsZXIFBGRhdGUFCmlzVmFsaWRORlQFBWFydElkBQtjcmVhdG9yQWRkcgUJYXJ0U2lnbklEAQ51cGRhdGVOdW1TYWxlcwAECG51bVNhbGVzCQEJZ2V0SW50QnlLAQUJbnVtU2FsZXNLCQEMSW50ZWdlckVudHJ5AgUJbnVtU2FsZXNLCQBkAgUIbnVtU2FsZXMAAQkGaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBCGNvbnRhaW5zAgUDa2V5AgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzBmludm9rZQEKYXBwUnVubmluZwIGaXNMaXZlB21lc3NhZ2UEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgQCaWQJANgEAQgFBmludm9rZQ10cmFuc2FjdGlvbklkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUOZGFwcFJ1bm5pbmdLZXkFBmlzTGl2ZQkAzAgCCQELU3RyaW5nRW50cnkCBRFtYWludGVuYW5jZU1TR0tleQUHbWVzc2FnZQUDbmlsCQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwFpAQdzZWxsTkZUAgVwcmljZQVhc3NldAQNJHQwMTMwODkxMzEyNQkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAxMzA4OTEzMTI1Al8xBAZhbW91bnQIBQ0kdDAxMzA4OTEzMTI1Al8yAwkBAiE9AgUGYW1vdW50AAEJAAIBAg9ObyBORlQgYXR0YWNoZWQEBW5mdElkAwMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQEMaXNTaWduQXJ0TkZUAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAcJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAkAAgECG09ubHkgU0lHTiBBcnQgTkZUIGFjY2VwdGVkLgQNJHQwMTMzNTkxMzQ1MgkBD3Byb3ZpZGVCYXNlRGF0YQIFAWkFBW5mdElkBAJpZAgFDSR0MDEzMzU5MTM0NTICXzEEBmNhbGxlcggFDSR0MDEzMzU5MTM0NTICXzIEBGRhdGUIBQ0kdDAxMzM1OTEzNDUyAl8zBAppc1ZhbGlkTkZUCAUNJHQwMTMzNTkxMzQ1MgJfNAQFYXJ0SWQIBQ0kdDAxMzM1OTEzNDUyAl81BAtjcmVhdG9yQWRkcggFDSR0MDEzMzU5MTM0NTICXzYECWFydFNpZ25JRAgFDSR0MDEzMzU5MTM0NTICXzcDCQAAAgkAsQIBBQlhcnRTaWduSUQAAAkAAgECHUFydHdvcmsgbm90IGZvdW5kIG9uIFNJR04gQXJ0AwkBASEBBQppc1ZhbGlkTkZUCQACAQIPTm90IGEgdmFsaWQgbmZ0AwkBASEBCQEQYWNjZXB0ZWRBc3NldElkcwEFBWFzc2V0CQACAQInT25seSBTSUdOLCBVU0ROLCBVU0RUIG9yIFdBVkVTIGFjY2VwdGVkAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUFcHJpY2UJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQEKZ2V0U2FsZUtleQQFBmNhbGxlcgUFbmZ0SWQFBWFydElkBQtjcmVhdG9yQWRkcgIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKQDAQUEZGF0ZQIBXwkApAMBBQVwcmljZQIBXwUFYXNzZXQCAV8FBW5mdElkAgFfBQVhcnRJZAIBXwULY3JlYXRvckFkZHICAV8FAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgICD3NhbGUybmRfc3RhdHVzXwUGY2FsbGVyAgFfBQVuZnRJZAIET1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICFmN1cnJlbnRfb3duZXJfb25fZGFwcF8FBW5mdElkBQZjYWxsZXIFA25pbAFpAQ91cGRhdGVTYWxlUHJpY2UDBW5mdElkBXByaWNlBWFzc2V0BA0kdDAxNDMyNTE0NDE4CQEPcHJvdmlkZUJhc2VEYXRhAgUBaQUFbmZ0SWQEAmlkCAUNJHQwMTQzMjUxNDQxOAJfMQQGY2FsbGVyCAUNJHQwMTQzMjUxNDQxOAJfMgQEZGF0ZQgFDSR0MDE0MzI1MTQ0MTgCXzMECmlzVmFsaWRORlQIBQ0kdDAxNDMyNTE0NDE4Al80BAVhcnRJZAgFDSR0MDE0MzI1MTQ0MTgCXzUEC2NyZWF0b3JBZGRyCAUNJHQwMTQzMjUxNDQxOAJfNgQJYXJ0U2lnbklECAUNJHQwMTQzMjUxNDQxOAJfNwMJAAACCQCxAgEFCWFydFNpZ25JRAAACQACAQIwQXJ0d29yayBub3QgZm91bmQgb24gU0lHTiBBcnQsIGNhbmNlbCB5b3VyIHNhbGUuAwkBASEBBQppc1ZhbGlkTkZUCQACAQIPTm90IGEgdmFsaWQgbmZ0BAlzYWxlT3duZXIJAQlnZXRTdHJCeUsBCQCsAgICFmN1cnJlbnRfb3duZXJfb25fZGFwcF8FBW5mdElkAwkBAiE9AgUJc2FsZU93bmVyBQZjYWxsZXIJAAIBAhZZb3UgZG9uJ3Qgb3duIHRoaXMgTkZUBApzYWxlU3RhdHVzCQEJZ2V0U3RyQnlLAQkArAICCQCsAgIJAKwCAgIPc2FsZTJuZF9zdGF0dXNfBQZjYWxsZXICAV8FBW5mdElkAwkBAiE9AgUKc2FsZVN0YXR1cwIET1BFTgkAAgECD1NhbGUgbm90IGFjdGl2ZQMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQVhc3NldAkAAgECJ09ubHkgU0lHTiwgVVNETiwgVVNEVCBvciBXQVZFUyBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAEFBXByaWNlCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBAdzYWxlS2V5CQEKZ2V0U2FsZUtleQQFBmNhbGxlcgUFbmZ0SWQFBWFydElkBQtjcmVhdG9yQWRkcgQIc2FsZUluZm8JALUJAgkBCWdldFN0ckJ5SwEJAKwCAgUHc2FsZUtleQIFX09QRU4CAV8JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdzYWxlS2V5AgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkAkQMCBQhzYWxlSW5mbwAAAgFfCQCkAwEFBXByaWNlAgFfBQVhc3NldAIBXwkAkQMCBQhzYWxlSW5mbwADAgFfCQCRAwIFCHNhbGVJbmZvAAQCAV8JAJEDAgUIc2FsZUluZm8ABQIBXwkAkQMCBQhzYWxlSW5mbwAGBQNuaWwBaQEKY2FuY2VsU2FsZQEFbmZ0SWQEDSR0MDE1NTU5MTU4MDAJAQ9wcm92aWRlQmFzZURhdGECBQFpBQVuZnRJZAQCaWQIBQ0kdDAxNTU1OTE1ODAwAl8xBAZjYWxsZXIIBQ0kdDAxNTU1OTE1ODAwAl8yBARkYXRlCAUNJHQwMTU1NTkxNTgwMAJfMwQKaXNWYWxpZE5GVAgFDSR0MDE1NTU5MTU4MDACXzQEBWFydElkCAUNJHQwMTU1NTkxNTgwMAJfNQQLY3JlYXRvckFkZHIIBQ0kdDAxNTU1OTE1ODAwAl82BAlhcnRTaWduSUQIBQ0kdDAxNTU1OTE1ODAwAl83BAlzYWxlT3duZXIJAQlnZXRTdHJCeUsBCQCsAgICFmN1cnJlbnRfb3duZXJfb25fZGFwcF8FBW5mdElkAwkBAiE9AgUJc2FsZU93bmVyBQZjYWxsZXIJAAIBAhZZb3UgZG9uJ3Qgb3duIHRoaXMgTkZUBApzYWxlU3RhdHVzCQEJZ2V0U3RyQnlLAQkArAICCQCsAgIJAKwCAgIPc2FsZTJuZF9zdGF0dXNfBQZjYWxsZXICAV8FBW5mdElkAwkBAiE9AgUKc2FsZVN0YXR1cwIET1BFTgkAAgECD1NhbGUgbm90IGFjdGl2ZQQHc2FsZUtleQkBCmdldFNhbGVLZXkEBQZjYWxsZXIFBW5mdElkBQVhcnRJZAULY3JlYXRvckFkZHIECHNhbGVJbmZvCQEJZ2V0U3RyQnlLAQkArAICBQdzYWxlS2V5AgVfT1BFTgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFB3NhbGVLZXkCBV9PUEVOCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgICD3NhbGUybmRfc3RhdHVzXwUGY2FsbGVyAgFfBQVuZnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICFmN1cnJlbnRfb3duZXJfb25fZGFwcF8FBW5mdElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFB3NhbGVLZXkCAV8FAmlkAgpfQ0FOQ0VMTEVECQCsAgIJAKwCAgkArAICCQCsAgIFCHNhbGVJbmZvAgtfQ0FOQ0VMTEVEXwkApAMBBQRkYXRlAgFfBQJpZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAEJANkEAQUFbmZ0SWQFA25pbAFpAQZidXlORlQBBW5mdElkBA0kdDAxNjYzMTE2NzI0CQEPcHJvdmlkZUJhc2VEYXRhAgUBaQUFbmZ0SWQEAmlkCAUNJHQwMTY2MzExNjcyNAJfMQQGY2FsbGVyCAUNJHQwMTY2MzExNjcyNAJfMgQEZGF0ZQgFDSR0MDE2NjMxMTY3MjQCXzMECmlzVmFsaWRORlQIBQ0kdDAxNjYzMTE2NzI0Al80BAVhcnRJZAgFDSR0MDE2NjMxMTY3MjQCXzUEC2NyZWF0b3JBZGRyCAUNJHQwMTY2MzExNjcyNAJfNgQJYXJ0U2lnbklECAUNJHQwMTY2MzExNjcyNAJfNwMJAAACCQCxAgEFCWFydFNpZ25JRAAACQACAQIwQXJ0d29yayBub3QgZm91bmQgb24gU0lHTiBBcnQsIGNhbmNlbCB5b3VyIHNhbGUuAwkBASEBBQppc1ZhbGlkTkZUCQACAQIPTm90IGEgdmFsaWQgbmZ0BAlzYWxlT3duZXIJARVnZXRTYWxlT3duZXJBbmRTdGF0dXMBBQVuZnRJZAQHc2FsZUtleQkBCmdldFNhbGVLZXkEBQlzYWxlT3duZXIFBW5mdElkBQVhcnRJZAULY3JlYXRvckFkZHIECHNhbGVJbmZvCQEJZ2V0U3RyQnlLAQkArAICBQdzYWxlS2V5AgVfT1BFTgMJAAACCQCxAgEFCHNhbGVJbmZvAAAJAAIBAg9TYWxlIE5vdCBmb3VuZCEEDXNhbGVJbmZvQXJyYXkJALUJAgUIc2FsZUluZm8CAV8DCQAAAgkAtgkBCQCRAwIFDXNhbGVJbmZvQXJyYXkAAQAACQACAQIKT2ZmZXIgb25seQQNJHQwMTcyMjExNzI1NwkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAxNzIyMTE3MjU3Al8xBAZhbW91bnQIBQ0kdDAxNzIyMTE3MjU3Al8yBA9wYXltZW50QXNzZXRTdHIDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkAgADAwkBAiE9AgkAkQMCBQ1zYWxlSW5mb0FycmF5AAEJAKQDAQUGYW1vdW50BgkBAiE9AgkAkQMCBQ1zYWxlSW5mb0FycmF5AAIFD3BheW1lbnRBc3NldFN0cgkAAgECGlBheW1lbnQgaW5mb3MgZG9uJ3QgbWF0Y2guBA0kdDAxNzc3MDE3OTA5CQEMc2V0VHJhbnNmZXJzBwUGYW1vdW50CAUHcGF5bWVudAdhc3NldElkBQVuZnRJZAULY3JlYXRvckFkZHIFCXNhbGVPd25lcgUGY2FsbGVyBQVhcnRJZAQLY29tbWlzc2lvbnMIBQ0kdDAxNzc3MDE3OTA5Al8xBApjcmVhdG9yRmVlCAUNJHQwMTc3NzAxNzkwOQJfMgQIb3duZXJGZWUIBQ0kdDAxNzc3MDE3OTA5Al8zBAxjb2xsZWN0b3JORlQIBQ0kdDAxNzc3MDE3OTA5Al80CQDOCAIJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFB3NhbGVLZXkCBV9PUEVOCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgICD3NhbGUybmRfc3RhdHVzXwUJc2FsZU93bmVyAgFfBQVuZnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICFmN1cnJlbnRfb3duZXJfb25fZGFwcF8FBW5mdElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFB3NhbGVLZXkCAV8FAmlkAgdfQ0xPU0VECQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQhzYWxlSW5mbwIIX0NMT1NFRF8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8FBmNhbGxlcgkAzAgCCQEOdXBkYXRlTnVtU2FsZXMACQDMCAIFCG93bmVyRmVlCQDMCAIFDGNvbGxlY3Rvck5GVAUDbmlsBQpjcmVhdG9yRmVlBQtjb21taXNzaW9ucwFpAQhzZXRPZmZlcgEFbmZ0SWQEDSR0MDE4MzIwMTg0MTcJAQ9wcm92aWRlQmFzZURhdGECBQFpBQVuZnRJZAQCaWQIBQ0kdDAxODMyMDE4NDE3Al8xBApvZmZlck93bmVyCAUNJHQwMTgzMjAxODQxNwJfMgQEZGF0ZQgFDSR0MDE4MzIwMTg0MTcCXzMECmlzVmFsaWRORlQIBQ0kdDAxODMyMDE4NDE3Al80BAVhcnRJZAgFDSR0MDE4MzIwMTg0MTcCXzUEC2NyZWF0b3JBZGRyCAUNJHQwMTgzMjAxODQxNwJfNgQJYXJ0U2lnbklECAUNJHQwMTgzMjAxODQxNwJfNwMJAQEhAQUKaXNWYWxpZE5GVAkAAgECD05vdCBhIHZhbGlkIG5mdAQNJHQwMTg0NzgxODUxNAkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAxODQ3ODE4NTE0Al8xBAZhbW91bnQIBQ0kdDAxODQ3ODE4NTE0Al8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkAAAIFBmFtb3VudAAACQACAQIWT2ZmZXIgb2YgMCBub3QgYWxsb3dlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAEFBmFtb3VudAkAAgECGFdyb25nIG1pbmltdW0gc2VsbCBwcmljZQQJc2FsZU93bmVyCQEVZ2V0U2FsZU93bmVyQW5kU3RhdHVzAQUFbmZ0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQEJZ2V0QmlkS2V5BAUKb2ZmZXJPd25lcgUFbmZ0SWQFCXNhbGVPd25lcgUCaWQCBV9PUEVOCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApAMBBQRkYXRlAgFfCQCkAwEFBmFtb3VudAIBXwUHYXNzZXRJZAIBXwUFbmZ0SWQCAV8FBWFydElkAgFfBQtjcmVhdG9yQWRkcgIBXwUKb2ZmZXJPd25lcgIBXwUCaWQFA25pbAFpAQthY2NlcHRPZmZlcgMFbmZ0SWQHb2ZmZXJJZApvZmZlck93bmVyBA0kdDAxOTMwNzE5NDAwCQEPcHJvdmlkZUJhc2VEYXRhAgUBaQUFbmZ0SWQEAmlkCAUNJHQwMTkzMDcxOTQwMAJfMQQGY2FsbGVyCAUNJHQwMTkzMDcxOTQwMAJfMgQEZGF0ZQgFDSR0MDE5MzA3MTk0MDACXzMECmlzVmFsaWRORlQIBQ0kdDAxOTMwNzE5NDAwAl80BAVhcnRJZAgFDSR0MDE5MzA3MTk0MDACXzUEC2NyZWF0b3JBZGRyCAUNJHQwMTkzMDcxOTQwMAJfNgQJYXJ0U2lnbklECAUNJHQwMTkzMDcxOTQwMAJfNwMJAQEhAQUKaXNWYWxpZE5GVAkAAgECD05vdCBhIHZhbGlkIG5mdAQJc2FsZU93bmVyCQEVZ2V0U2FsZU93bmVyQW5kU3RhdHVzAQUFbmZ0SWQDCQECIT0CBQZjYWxsZXIFCXNhbGVPd25lcgkAAgECIE9ubHkgc2FsZSBvd25lciBjYW4gYWNjZXB0IG9mZmVyBAZiaWRLZXkJAQlnZXRCaWRLZXkEBQpvZmZlck93bmVyBQVuZnRJZAUJc2FsZU93bmVyBQdvZmZlcklkBA0kdDAxOTY1NDE5NzA5CQEKZ2V0QmlkRGF0YQEFBmJpZEtleQQKYmlkRGF0YUFycggFDSR0MDE5NjU0MTk3MDkCXzEEB2Fzc2V0SWQIBQ0kdDAxOTY1NDE5NzA5Al8yBAdiaWREYXRhCAUNJHQwMTk2NTQxOTcwOQJfMwQHc2FsZUtleQkBCmdldFNhbGVLZXkEBQlzYWxlT3duZXIFBW5mdElkBQVhcnRJZAULY3JlYXRvckFkZHIECHNhbGVJbmZvCQEJZ2V0U3RyQnlLAQkArAICBQdzYWxlS2V5AgVfT1BFTgMJAAACCQCxAgEFCHNhbGVJbmZvAAAJAAIBAg9TYWxlIE5vdCBmb3VuZCEEBmFtb3VudAkBBXZhbHVlAQkAtgkBCQCRAwIFCmJpZERhdGFBcnIAAQQNJHQwMTk5NDUyMDA4MwkBDHNldFRyYW5zZmVycwcFBmFtb3VudAUHYXNzZXRJZAUFbmZ0SWQFC2NyZWF0b3JBZGRyBQlzYWxlT3duZXIJAJEDAgUKYmlkRGF0YUFycgAGBQVhcnRJZAQLY29tbWlzc2lvbnMIBQ0kdDAxOTk0NTIwMDgzAl8xBApjcmVhdG9yRmVlCAUNJHQwMTk5NDUyMDA4MwJfMgQIb3duZXJGZWUIBQ0kdDAxOTk0NTIwMDgzAl8zBAxjb2xsZWN0b3JORlQIBQ0kdDAxOTk0NTIwMDgzAl80BAphc3NldElkU3RyAwkBCWlzRGVmaW5lZAEFB2Fzc2V0SWQJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAIFV0FWRVMJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUHc2FsZUtleQIFX09QRU4JAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZiaWRLZXkCBV9PUEVOCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgICD3NhbGUybmRfc3RhdHVzXwUJc2FsZU93bmVyAgFfBQVuZnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICFmN1cnJlbnRfb3duZXJfb25fZGFwcF8FBW5mdElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGYmlkS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgkArAICCQCsAgIFB2JpZERhdGECCF9DTE9TRURfCQCkAwEFBGRhdGUCAV8FAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFB3NhbGVLZXkCAV8FAmlkAgdfQ0xPU0VECQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFCHNhbGVJbmZvAg5fQ0xPU0VELU9GRkVSXwkApAMBBQRkYXRlAgFfBQJpZAIBXwUKb2ZmZXJPd25lcgIBXwkApAMBBQZhbW91bnQCAV8FCmFzc2V0SWRTdHIJAMwIAgkBDnVwZGF0ZU51bVNhbGVzAAkAzAgCBQhvd25lckZlZQkAzAgCBQxjb2xsZWN0b3JORlQFA25pbAUKY3JlYXRvckZlZQULY29tbWlzc2lvbnMBaQELY2FuY2VsT2ZmZXIEBW5mdElkB29mZmVySWQKb2ZmZXJPd25lcglzYWxlT3duZXIEDSR0MDIwODgzMjA5NTcJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDIwODgzMjA5NTcCXzEEBmNhbGxlcggFDSR0MDIwODgzMjA5NTcCXzIEBGRhdGUIBQ0kdDAyMDg4MzIwOTU3Al8zAwMJAQIhPQIFBmNhbGxlcgUKb2ZmZXJPd25lcgkBAiE9AgUGY2FsbGVyBQlzYWxlT3duZXIHCQACAQIdWW91IGNhbm5vdCBjYW5jZWwgdGhpcyBvZmZlci4EBmJpZEtleQkBCWdldEJpZEtleQQFCm9mZmVyT3duZXIFBW5mdElkBQlzYWxlT3duZXIFB29mZmVySWQEDSR0MDIxMTI5MjExODQJAQpnZXRCaWREYXRhAQUGYmlkS2V5BApiaWREYXRhQXJyCAUNJHQwMjExMjkyMTE4NAJfMQQHYXNzZXRJZAgFDSR0MDIxMTI5MjExODQCXzIEB2JpZERhdGEIBQ0kdDAyMTEyOTIxMTg0Al8zCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGYmlkS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBmJpZEtleQIKX0NBTkNFTExFRAkArAICCQCsAgIJAKwCAgkArAICBQdiaWREYXRhAgtfQ0FOQ0VMTEVEXwkApAMBBQRkYXRlAgFfBQJpZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwAGtbg5g==", "height": 2792313, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DY5wqCZdAqyxB5Xp8tPDjZGfeEqcGaY7gySvH5FJyNHU Next: 2u5sHiaMmydfZDL3tV6RstoJv4f1ZcBhRtbv8qyCanCD Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let VERSION = "1.1.5"
4+let VERSION = "2.0.0"
55
66 func getStrByK (key) = valueOrElse(getString(this, key), "")
77
2222
2323 let whitelistDapp = value(addressFromString(getStrByK("conf_whitelist_dapp")))
2424
25-let signAssetId = fromBase58String(getStrByK("conf_accepted_asset_SIGN"))
25+let puzzle_art_pool = getStrByK("conf_puzzle_art_pool")
2626
27-let usdnAssetId = fromBase58String(getStrByK("conf_accepted_asset_USDN"))
27+let usdtPPAssetId_str = getStrByK("conf_accepted_asset_USDT_PP")
2828
29-let usdtAssetId = fromBase58String(getStrByK("conf_accepted_asset_USDT"))
29+let artAssetId_str = getStrByK("conf_accepted_asset_ART")
30+
31+let usdcPPAssetId_str = getStrByK("conf_accepted_asset_USDC_PP")
32+
33+let eastAssetId_str = getStrByK("conf_accepted_asset_EAST")
34+
35+let puzzleAssetId_str = getStrByK("conf_accepted_asset_PUZZLE")
36+
37+let ethPPAssetId_str = getStrByK("conf_accepted_asset_ETH_PP")
38+
39+let wavesAssetId_str = "WAVES"
40+
41+let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
42+
43+let artAssetId = fromBase58String(artAssetId_str)
44+
45+let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
46+
47+let eastAssetId = fromBase58String(eastAssetId_str)
48+
49+let puzzleAssetId = fromBase58String(puzzleAssetId_str)
50+
51+let ethPPAssetId = fromBase58String(ethPPAssetId_str)
3052
3153 let wavesAssetId = base58''
3254
55+let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
56+
3357 let chris = getStrByK("conf_admin_1")
3458
35-let signCut = 3
59+let commission_fee = 3
3660
3761 let userSuspended = "SUSPENDED"
3862
88112 func getIntByKFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
89113
90114
91-let currentCertificationPrice = getIntByKFromOracle(("certification_fee_" + toBase58String(signAssetId)))
115+let currentCertificationPrice = getIntByKFromOracle(("certification_fee_" + toBase58String(artAssetId)))
92116
93117 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
94118
131155 }
132156
133157
134-func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
135- then (assetId != toBase58String(wavesAssetId))
136- else false)
137- then (assetId != "WAVES")
138- else false)
139- then (assetId != toBase58String(usdnAssetId))
140- else false)
141- then (assetId != toBase58String(usdtAssetId))
142- else false)
143- then false
158+func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
159+ then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
144160 else true
145161
146162
172188 $Tuple3(bidDataArr, assetId, bidData)
173189 }
174190 }
191+
192+
193+func getBalance (assetId) = match assetId {
194+ case b: ByteVector =>
195+ assetBalance(this, b)
196+ case _ =>
197+ wavesBalance(this).available
198+}
175199
176200
177201 func artIsValid (artStatus) = if ((artStatus != artIllegal))
224248 let agentShare = valueOrElse(getInteger(userDapp, keySecondaryShareAgent(creatorAddr)), 0)
225249 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(creatorAddr)), feeReceiver)
226250 let publicAgentShare = valueOrElse(getInteger(userDapp, keySecondarySharePublicAgent(creatorAddr)), 0)
227- let amountForSign = fraction(amount, signCut, 100)
251+ let amountForSign = fraction(amount, commission_fee, 100)
228252 let amountForCreator = fraction(amount, creatorCut, 10000)
229253 let amountForOwner = (amount - (amountForSign + amountForCreator))
230254 let amountForAgent = if (if ((agent != feeReceiver))
237261 else false)
238262 then fraction(amount, publicAgentShare, 10000)
239263 else 0
240- let commissions = if ((amountForAgent != 0))
241- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
242- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
243- let creatorFee = if ((amountForPublicAgent != 0))
244- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(creatorAddr)), (amountForCreator - amountForPublicAgent), assetId)]
245- else [ScriptTransfer(Address(fromBase58String(creatorAddr)), amountForCreator, assetId)]
246- let ownerFee = ScriptTransfer(Address(fromBase58String(saleOwner)), amountForOwner, assetId)
247- let collectorNFT = ScriptTransfer(Address(fromBase58String(caller)), 1, fromBase58String(nftid))
248- $Tuple4(commissions, creatorFee, ownerFee, collectorNFT)
264+ let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
265+ then (amountForSign - amountForAgent)
266+ else amountForSign
267+ let amount_art_before = getBalance(artAssetId)
268+ if ((amount_art_before == amount_art_before))
269+ then {
270+ let swap_fee_to_art = if ((assetId != artAssetId))
271+ then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
272+ else unit
273+ if ((swap_fee_to_art == swap_fee_to_art))
274+ then {
275+ let amount_art_after = getBalance(artAssetId)
276+ if ((amount_art_after == amount_art_after))
277+ then {
278+ let commissions = if ((amountForAgent != 0))
279+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
280+ then (amountForSign - amountForAgent)
281+ else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
282+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
283+ then amountForSign
284+ else (amount_art_after - amount_art_before), artAssetId)]
285+ let creatorFee = if ((amountForPublicAgent != 0))
286+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(creatorAddr)), (amountForCreator - amountForPublicAgent), assetId)]
287+ else [ScriptTransfer(Address(fromBase58String(creatorAddr)), amountForCreator, assetId)]
288+ let ownerFee = ScriptTransfer(Address(fromBase58String(saleOwner)), amountForOwner, assetId)
289+ let collectorNFT = ScriptTransfer(Address(fromBase58String(caller)), 1, fromBase58String(nftid))
290+ $Tuple4(commissions, creatorFee, ownerFee, collectorNFT)
291+ }
292+ else throw("Strict value is not equal to itself.")
293+ }
294+ else throw("Strict value is not equal to itself.")
295+ }
296+ else throw("Strict value is not equal to itself.")
249297 }
250298
251299
252-func validateMinSell (assetId,price) = {
253- let minSellWaves = if (unitTest)
254- then 10
255- else getIntByKFromOracle("waves_min_sell")
256- let minSellUsdn = 1000000
257- let minSellSign = if (unitTest)
258- then 1
259- else (currentCertificationPrice * 2)
260- if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
261- then (minSellUsdn > price)
262- else false)
263- then (price != 0)
264- else false)
265- then true
266- else if (if ((assetId == toBase58String(usdtAssetId)))
267- then (minSellUsdn > price)
268- else false)
269- then (price != 0)
270- else false)
271- then true
272- else if (if ((assetId == toBase58String(signAssetId)))
273- then (minSellSign > price)
274- else false)
275- then (price != 0)
276- else false)
277- then true
278- else if (if (if ((assetId == toBase58String(wavesAssetId)))
279- then true
280- else (assetId == "WAVES"))
281- then (minSellWaves > price)
282- else false)
283- then (price != 0)
284- else false)
285- then false
286- else true
287- }
300+func validateMinSell (price) = if ((0 >= price))
301+ then throw("Wrong minimum sell price")
302+ else true
288303
289304
290305 func provideBaseData (i,nftId) = {
291- let $t01082610866 = idCallerDate(i)
292- let id = $t01082610866._1
293- let caller = $t01082610866._2
294- let date = $t01082610866._3
295- let $t01086910938 = checkNFTInfo(nftId)
296- let isValidNFT = $t01086910938._1
297- let artId = $t01086910938._2
298- let creatorAddr = $t01086910938._3
299- let artSignID = $t01086910938._4
306+ let $t01191211952 = idCallerDate(i)
307+ let id = $t01191211952._1
308+ let caller = $t01191211952._2
309+ let date = $t01191211952._3
310+ let $t01195512024 = checkNFTInfo(nftId)
311+ let isValidNFT = $t01195512024._1
312+ let artId = $t01195512024._2
313+ let creatorAddr = $t01195512024._3
314+ let artSignID = $t01195512024._4
300315 $Tuple7(id, caller, date, isValidNFT, artId, creatorAddr, artSignID)
301316 }
302317
332347
333348 @Callable(i)
334349 func sellNFT (price,asset) = {
335- let $t01200312039 = isPayment(i)
336- let payment = $t01200312039._1
337- let amount = $t01200312039._2
350+ let $t01308913125 = isPayment(i)
351+ let payment = $t01308913125._1
352+ let amount = $t01308913125._2
338353 if ((amount != 1))
339354 then throw("No NFT attached")
340355 else {
343358 else false)
344359 then toBase58String(value(payment.assetId))
345360 else throw("Only SIGN Art NFT accepted.")
346- let $t01227312366 = provideBaseData(i, nftId)
347- let id = $t01227312366._1
348- let caller = $t01227312366._2
349- let date = $t01227312366._3
350- let isValidNFT = $t01227312366._4
351- let artId = $t01227312366._5
352- let creatorAddr = $t01227312366._6
353- let artSignID = $t01227312366._7
361+ let $t01335913452 = provideBaseData(i, nftId)
362+ let id = $t01335913452._1
363+ let caller = $t01335913452._2
364+ let date = $t01335913452._3
365+ let isValidNFT = $t01335913452._4
366+ let artId = $t01335913452._5
367+ let creatorAddr = $t01335913452._6
368+ let artSignID = $t01335913452._7
354369 if ((size(artSignID) == 0))
355370 then throw("Artwork not found on SIGN Art")
356371 else if (!(isValidNFT))
357372 then throw("Not a valid nft")
358373 else if (!(acceptedAssetIds(asset)))
359374 then throw("Only SIGN, USDN, USDT or WAVES accepted")
360- else if (!(validateMinSell(asset, price)))
375+ else if (!(validateMinSell(price)))
361376 then throw("Wrong minimum sell price")
362377 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)]
363378 }
367382
368383 @Callable(i)
369384 func updateSalePrice (nftId,price,asset) = {
370- let $t01324613339 = provideBaseData(i, nftId)
371- let id = $t01324613339._1
372- let caller = $t01324613339._2
373- let date = $t01324613339._3
374- let isValidNFT = $t01324613339._4
375- let artId = $t01324613339._5
376- let creatorAddr = $t01324613339._6
377- let artSignID = $t01324613339._7
385+ let $t01432514418 = provideBaseData(i, nftId)
386+ let id = $t01432514418._1
387+ let caller = $t01432514418._2
388+ let date = $t01432514418._3
389+ let isValidNFT = $t01432514418._4
390+ let artId = $t01432514418._5
391+ let creatorAddr = $t01432514418._6
392+ let artSignID = $t01432514418._7
378393 if ((size(artSignID) == 0))
379394 then throw("Artwork not found on SIGN Art, cancel your sale.")
380395 else if (!(isValidNFT))
389404 then throw("Sale not active")
390405 else if (!(acceptedAssetIds(asset)))
391406 then throw("Only SIGN, USDN, USDT or WAVES accepted")
392- else if (!(validateMinSell(asset, price)))
407+ else if (!(validateMinSell(price)))
393408 then throw("Wrong minimum sell price")
394409 else {
395410 let saleKey = getSaleKey(caller, nftId, artId, creatorAddr)
404419
405420 @Callable(i)
406421 func cancelSale (nftId) = {
407- let $t01448714728 = provideBaseData(i, nftId)
408- let id = $t01448714728._1
409- let caller = $t01448714728._2
410- let date = $t01448714728._3
411- let isValidNFT = $t01448714728._4
412- let artId = $t01448714728._5
413- let creatorAddr = $t01448714728._6
414- let artSignID = $t01448714728._7
422+ let $t01555915800 = provideBaseData(i, nftId)
423+ let id = $t01555915800._1
424+ let caller = $t01555915800._2
425+ let date = $t01555915800._3
426+ let isValidNFT = $t01555915800._4
427+ let artId = $t01555915800._5
428+ let creatorAddr = $t01555915800._6
429+ let artSignID = $t01555915800._7
415430 let saleOwner = getStrByK(("current_owner_on_dapp_" + nftId))
416431 if ((saleOwner != caller))
417432 then throw("You don't own this NFT")
431446
432447 @Callable(i)
433448 func buyNFT (nftId) = {
434- let $t01555915652 = provideBaseData(i, nftId)
435- let id = $t01555915652._1
436- let caller = $t01555915652._2
437- let date = $t01555915652._3
438- let isValidNFT = $t01555915652._4
439- let artId = $t01555915652._5
440- let creatorAddr = $t01555915652._6
441- let artSignID = $t01555915652._7
449+ let $t01663116724 = provideBaseData(i, nftId)
450+ let id = $t01663116724._1
451+ let caller = $t01663116724._2
452+ let date = $t01663116724._3
453+ let isValidNFT = $t01663116724._4
454+ let artId = $t01663116724._5
455+ let creatorAddr = $t01663116724._6
456+ let artSignID = $t01663116724._7
442457 if ((size(artSignID) == 0))
443458 then throw("Artwork not found on SIGN Art, cancel your sale.")
444459 else if (!(isValidNFT))
454469 if ((parseInt(saleInfoArray[1]) == 0))
455470 then throw("Offer only")
456471 else {
457- let $t01614916185 = isPayment(i)
458- let payment = $t01614916185._1
459- let amount = $t01614916185._2
472+ let $t01722117257 = isPayment(i)
473+ let payment = $t01722117257._1
474+ let amount = $t01722117257._2
460475 let paymentAssetStr = if (isDefined(payment.assetId))
461476 then toBase58String(value(payment.assetId))
462477 else ""
465480 else (saleInfoArray[2] != paymentAssetStr))
466481 then throw("Payment infos don't match.")
467482 else {
468- let $t01669116830 = setTransfers(amount, payment.assetId, nftId, creatorAddr, saleOwner, caller, artId)
469- let commissions = $t01669116830._1
470- let creatorFee = $t01669116830._2
471- let ownerFee = $t01669116830._3
472- let collectorNFT = $t01669116830._4
483+ let $t01777017909 = setTransfers(amount, payment.assetId, nftId, creatorAddr, saleOwner, caller, artId)
484+ let commissions = $t01777017909._1
485+ let creatorFee = $t01777017909._2
486+ let ownerFee = $t01777017909._3
487+ let collectorNFT = $t01777017909._4
473488 (([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)
474489 }
475490 }
481496
482497 @Callable(i)
483498 func setOffer (nftId) = {
484- let $t01724117338 = provideBaseData(i, nftId)
485- let id = $t01724117338._1
486- let offerOwner = $t01724117338._2
487- let date = $t01724117338._3
488- let isValidNFT = $t01724117338._4
489- let artId = $t01724117338._5
490- let creatorAddr = $t01724117338._6
491- let artSignID = $t01724117338._7
499+ let $t01832018417 = provideBaseData(i, nftId)
500+ let id = $t01832018417._1
501+ let offerOwner = $t01832018417._2
502+ let date = $t01832018417._3
503+ let isValidNFT = $t01832018417._4
504+ let artId = $t01832018417._5
505+ let creatorAddr = $t01832018417._6
506+ let artSignID = $t01832018417._7
492507 if (!(isValidNFT))
493508 then throw("Not a valid nft")
494509 else {
495- let $t01739917435 = isPayment(i)
496- let payment = $t01739917435._1
497- let amount = $t01739917435._2
510+ let $t01847818514 = isPayment(i)
511+ let payment = $t01847818514._1
512+ let amount = $t01847818514._2
498513 let assetId = if (!(isDefined(payment.assetId)))
499514 then "WAVES"
500515 else toBase58String(value(payment.assetId))
502517 then throw("asset not accepted")
503518 else if ((amount == 0))
504519 then throw("Offer of 0 not allowed")
505- else if (!(validateMinSell(assetId, amount)))
520+ else if (!(validateMinSell(amount)))
506521 then throw("Wrong minimum sell price")
507522 else {
508523 let saleOwner = getSaleOwnerAndStatus(nftId)
515530
516531 @Callable(i)
517532 func acceptOffer (nftId,offerId,offerOwner) = {
518- let $t01823718330 = provideBaseData(i, nftId)
519- let id = $t01823718330._1
520- let caller = $t01823718330._2
521- let date = $t01823718330._3
522- let isValidNFT = $t01823718330._4
523- let artId = $t01823718330._5
524- let creatorAddr = $t01823718330._6
525- let artSignID = $t01823718330._7
533+ let $t01930719400 = provideBaseData(i, nftId)
534+ let id = $t01930719400._1
535+ let caller = $t01930719400._2
536+ let date = $t01930719400._3
537+ let isValidNFT = $t01930719400._4
538+ let artId = $t01930719400._5
539+ let creatorAddr = $t01930719400._6
540+ let artSignID = $t01930719400._7
526541 if (!(isValidNFT))
527542 then throw("Not a valid nft")
528543 else {
531546 then throw("Only sale owner can accept offer")
532547 else {
533548 let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
534- let $t01858418639 = getBidData(bidKey)
535- let bidDataArr = $t01858418639._1
536- let assetId = $t01858418639._2
537- let bidData = $t01858418639._3
549+ let $t01965419709 = getBidData(bidKey)
550+ let bidDataArr = $t01965419709._1
551+ let assetId = $t01965419709._2
552+ let bidData = $t01965419709._3
538553 let saleKey = getSaleKey(saleOwner, nftId, artId, creatorAddr)
539554 let saleInfo = getStrByK((saleKey + "_OPEN"))
540555 if ((size(saleInfo) == 0))
541556 then throw("Sale Not found!")
542557 else {
543558 let amount = value(parseInt(bidDataArr[1]))
544- let $t01887519013 = setTransfers(amount, assetId, nftId, creatorAddr, saleOwner, bidDataArr[6], artId)
545- let commissions = $t01887519013._1
546- let creatorFee = $t01887519013._2
547- let ownerFee = $t01887519013._3
548- let collectorNFT = $t01887519013._4
559+ let $t01994520083 = setTransfers(amount, assetId, nftId, creatorAddr, saleOwner, bidDataArr[6], artId)
560+ let commissions = $t01994520083._1
561+ let creatorFee = $t01994520083._2
562+ let ownerFee = $t01994520083._3
563+ let collectorNFT = $t01994520083._4
549564 let assetIdStr = if (isDefined(assetId))
550565 then toBase58String(value(assetId))
551566 else "WAVES"
559574
560575 @Callable(i)
561576 func cancelOffer (nftId,offerId,offerOwner,saleOwner) = {
562- let $t01981319887 = idCallerDate(i)
563- let id = $t01981319887._1
564- let caller = $t01981319887._2
565- let date = $t01981319887._3
577+ let $t02088320957 = idCallerDate(i)
578+ let id = $t02088320957._1
579+ let caller = $t02088320957._2
580+ let date = $t02088320957._3
566581 if (if ((caller != offerOwner))
567582 then (caller != saleOwner)
568583 else false)
569584 then throw("You cannot cancel this offer.")
570585 else {
571586 let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
572- let $t02005920114 = getBidData(bidKey)
573- let bidDataArr = $t02005920114._1
574- let assetId = $t02005920114._2
575- let bidData = $t02005920114._3
587+ let $t02112921184 = getBidData(bidKey)
588+ let bidDataArr = $t02112921184._1
589+ let assetId = $t02112921184._2
590+ let bidData = $t02112921184._3
576591 [DeleteEntry((bidKey + "_OPEN")), StringEntry((bidKey + "_CANCELLED"), ((((bidData + "_CANCELLED_") + toString(date)) + "_") + id)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
577592 }
578593 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let VERSION = "1.1.5"
4+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
25-let signAssetId = fromBase58String(getStrByK("conf_accepted_asset_SIGN"))
25+let puzzle_art_pool = getStrByK("conf_puzzle_art_pool")
2626
27-let usdnAssetId = fromBase58String(getStrByK("conf_accepted_asset_USDN"))
27+let usdtPPAssetId_str = getStrByK("conf_accepted_asset_USDT_PP")
2828
29-let usdtAssetId = fromBase58String(getStrByK("conf_accepted_asset_USDT"))
29+let artAssetId_str = getStrByK("conf_accepted_asset_ART")
30+
31+let usdcPPAssetId_str = getStrByK("conf_accepted_asset_USDC_PP")
32+
33+let eastAssetId_str = getStrByK("conf_accepted_asset_EAST")
34+
35+let puzzleAssetId_str = getStrByK("conf_accepted_asset_PUZZLE")
36+
37+let ethPPAssetId_str = getStrByK("conf_accepted_asset_ETH_PP")
38+
39+let wavesAssetId_str = "WAVES"
40+
41+let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
42+
43+let artAssetId = fromBase58String(artAssetId_str)
44+
45+let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
46+
47+let eastAssetId = fromBase58String(eastAssetId_str)
48+
49+let puzzleAssetId = fromBase58String(puzzleAssetId_str)
50+
51+let ethPPAssetId = fromBase58String(ethPPAssetId_str)
3052
3153 let wavesAssetId = base58''
3254
55+let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
56+
3357 let chris = getStrByK("conf_admin_1")
3458
35-let signCut = 3
59+let commission_fee = 3
3660
3761 let userSuspended = "SUSPENDED"
3862
3963 let userRemoved = "REMOVED"
4064
4165 let artIllegal = "ILLEGAL"
4266
4367 let artSuspended = "SUSPENDED"
4468
4569 let dappRunningKey = "conf_dapp_is_running"
4670
4771 let maintenanceMSGKey = "conf_maintenance_msg"
4872
4973 let dappRunning = valueOrElse(getBoolean(this, dappRunningKey), true)
5074
5175 let maintenanceMSG = valueOrElse(getString(this, maintenanceMSGKey), "")
5276
5377 let numSalesK = "num_sales"
5478
5579 func getUserStrByK (key) = valueOrElse(getString(userDapp, key), "Error")
5680
5781
5882 func getArtworkRoyalties (key) = valueOrElse(getInteger(artworksDapp, key), 1000)
5983
6084
6185 func getArtStrByK (key) = valueOrElse(getString(artworksDapp, key), "")
6286
6387
6488 func getIntByK (key) = valueOrElse(getInteger(this, key), 0)
6589
6690
6791 func keyUserStatus (addr) = ("user_status_" + addr)
6892
6993
7094 func keyArtworkRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
7195
7296
7397 func keySignID (artistAddr,artId) = ((("art_signid_" + artId) + "_") + artistAddr)
7498
7599
76100 func keyFlag (artistAddr,artId) = ((("art_flag_" + artId) + "_") + artistAddr)
77101
78102
79103 func keyNFTData (id) = ("nft_" + id)
80104
81105
82106 func getSaleKey (caller,nftId,artId,creatorAddr) = ((((((("sale2nd_info_" + caller) + "_") + nftId) + "_") + artId) + "_") + creatorAddr)
83107
84108
85109 func getBidKey (offerOwner,nftId,saleOwner,offerId) = ((((((("offer2nd_" + offerOwner) + "_") + nftId) + "_") + saleOwner) + "_") + offerId)
86110
87111
88112 func getIntByKFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
89113
90114
91-let currentCertificationPrice = getIntByKFromOracle(("certification_fee_" + toBase58String(signAssetId)))
115+let currentCertificationPrice = getIntByKFromOracle(("certification_fee_" + toBase58String(artAssetId)))
92116
93117 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
94118
95119
96120 func keySecondaryShareAgent (artistAddr) = ("artist_agent_secondary_" + artistAddr)
97121
98122
99123 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
100124
101125
102126 func keySecondarySharePublicAgent (artistAddr) = ("artist_public_agent_secondary_" + artistAddr)
103127
104128
105129 func idCallerDate (i) = if (!(dappRunning))
106130 then throw(maintenanceMSG)
107131 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
108132
109133
110134 func isPayment (i) = if ((size(i.payments) == 0))
111135 then throw("No payment attached")
112136 else {
113137 let payment = value(i.payments[0])
114138 let amount = value(payment.amount)
115139 $Tuple2(payment, amount)
116140 }
117141
118142
119143 func assetIsValid (assetDetails) = if (if (if ((assetDetails.quantity == 1))
120144 then (assetDetails.decimals == 0)
121145 else false)
122146 then (assetDetails.reissuable == false)
123147 else false)
124148 then (assetDetails.issuer == artworksDapp)
125149 else false
126150
127151
128152 func isSignArtNFT (id) = {
129153 let assetDetails = value(assetInfo(id))
130154 assetIsValid(assetDetails)
131155 }
132156
133157
134-func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
135- then (assetId != toBase58String(wavesAssetId))
136- else false)
137- then (assetId != "WAVES")
138- else false)
139- then (assetId != toBase58String(usdnAssetId))
140- else false)
141- then (assetId != toBase58String(usdtAssetId))
142- else false)
143- then false
158+func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
159+ then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
144160 else true
145161
146162
147163 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
148164 then unit
149165 else fromBase58String(assetId)
150166
151167
152168 func getSaleOwnerAndStatus (nftid) = {
153169 let saleOwner = getStrByK(("current_owner_on_dapp_" + nftid))
154170 if ((size(saleOwner) == 0))
155171 then throw("NFT not found")
156172 else {
157173 let saleStatus = getStrByK(((("sale2nd_status_" + saleOwner) + "_") + nftid))
158174 if ((saleStatus != "OPEN"))
159175 then throw("NFT not for sale")
160176 else saleOwner
161177 }
162178 }
163179
164180
165181 func getBidData (key) = {
166182 let bidData = getStrByK((key + "_OPEN"))
167183 if ((bidData == ""))
168184 then throw("Offer not found")
169185 else {
170186 let bidDataArr = split(bidData, "_")
171187 let assetId = getBidAssetId(bidDataArr[2])
172188 $Tuple3(bidDataArr, assetId, bidData)
173189 }
174190 }
191+
192+
193+func getBalance (assetId) = match assetId {
194+ case b: ByteVector =>
195+ assetBalance(this, b)
196+ case _ =>
197+ wavesBalance(this).available
198+}
175199
176200
177201 func artIsValid (artStatus) = if ((artStatus != artIllegal))
178202 then (artStatus != artSuspended)
179203 else false
180204
181205
182206 func checkArtStatus (addr,id) = {
183207 let artStatus = getArtStrByK(keyFlag(addr, id))
184208 if (artIsValid(artStatus))
185209 then true
186210 else throw(("Original Artwork flagged as " + artStatus))
187211 }
188212
189213
190214 func checkArtistStatus (addr) = {
191215 let artistStatus = getUserStrByK(keyUserStatus(addr))
192216 if (containsElement([userSuspended, userRemoved], artistStatus))
193217 then throw(("Original Artist " + artistStatus))
194218 else true
195219 }
196220
197221
198222 func checkNFTInfo (assetId) = {
199223 let nftData = split(getArtStrByK(keyNFTData(assetId)), "_")
200224 let artSignID = getArtStrByK(keySignID(nftData[6], nftData[5]))
201225 if (if (!(checkArtStatus(nftData[6], nftData[5])))
202226 then !(checkArtistStatus(nftData[6]))
203227 else false)
204228 then $Tuple4(false, nftData[5], nftData[6], artSignID)
205229 else $Tuple4(true, nftData[5], nftData[6], artSignID)
206230 }
207231
208232
209233 func checkARTExist (artId,creatorAddr) = {
210234 let artSignID = getArtStrByK(keySignID(creatorAddr, artId))
211235 if ((size(artSignID) == 0))
212236 then throw("Artwork not found on SIGN Art")
213237 else if (if (!(checkArtStatus(creatorAddr, artId)))
214238 then !(checkArtistStatus(creatorAddr))
215239 else false)
216240 then false
217241 else true
218242 }
219243
220244
221245 func setTransfers (amount,assetId,nftid,creatorAddr,saleOwner,caller,artId) = {
222246 let creatorCut = getArtworkRoyalties(keyArtworkRoyalties(creatorAddr, artId))
223247 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(creatorAddr)), feeReceiver)
224248 let agentShare = valueOrElse(getInteger(userDapp, keySecondaryShareAgent(creatorAddr)), 0)
225249 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(creatorAddr)), feeReceiver)
226250 let publicAgentShare = valueOrElse(getInteger(userDapp, keySecondarySharePublicAgent(creatorAddr)), 0)
227- let amountForSign = fraction(amount, signCut, 100)
251+ let amountForSign = fraction(amount, commission_fee, 100)
228252 let amountForCreator = fraction(amount, creatorCut, 10000)
229253 let amountForOwner = (amount - (amountForSign + amountForCreator))
230254 let amountForAgent = if (if ((agent != feeReceiver))
231255 then (agentShare > 0)
232256 else false)
233257 then fraction(amount, agentShare, 10000)
234258 else 0
235259 let amountForPublicAgent = if (if ((publicAgent != feeReceiver))
236260 then (publicAgentShare > 0)
237261 else false)
238262 then fraction(amount, publicAgentShare, 10000)
239263 else 0
240- let commissions = if ((amountForAgent != 0))
241- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
242- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
243- let creatorFee = if ((amountForPublicAgent != 0))
244- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(creatorAddr)), (amountForCreator - amountForPublicAgent), assetId)]
245- else [ScriptTransfer(Address(fromBase58String(creatorAddr)), amountForCreator, assetId)]
246- let ownerFee = ScriptTransfer(Address(fromBase58String(saleOwner)), amountForOwner, assetId)
247- let collectorNFT = ScriptTransfer(Address(fromBase58String(caller)), 1, fromBase58String(nftid))
248- $Tuple4(commissions, creatorFee, ownerFee, collectorNFT)
264+ let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
265+ then (amountForSign - amountForAgent)
266+ else amountForSign
267+ let amount_art_before = getBalance(artAssetId)
268+ if ((amount_art_before == amount_art_before))
269+ then {
270+ let swap_fee_to_art = if ((assetId != artAssetId))
271+ then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
272+ else unit
273+ if ((swap_fee_to_art == swap_fee_to_art))
274+ then {
275+ let amount_art_after = getBalance(artAssetId)
276+ if ((amount_art_after == amount_art_after))
277+ then {
278+ let commissions = if ((amountForAgent != 0))
279+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
280+ then (amountForSign - amountForAgent)
281+ else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
282+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
283+ then amountForSign
284+ else (amount_art_after - amount_art_before), artAssetId)]
285+ let creatorFee = if ((amountForPublicAgent != 0))
286+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(creatorAddr)), (amountForCreator - amountForPublicAgent), assetId)]
287+ else [ScriptTransfer(Address(fromBase58String(creatorAddr)), amountForCreator, assetId)]
288+ let ownerFee = ScriptTransfer(Address(fromBase58String(saleOwner)), amountForOwner, assetId)
289+ let collectorNFT = ScriptTransfer(Address(fromBase58String(caller)), 1, fromBase58String(nftid))
290+ $Tuple4(commissions, creatorFee, ownerFee, collectorNFT)
291+ }
292+ else throw("Strict value is not equal to itself.")
293+ }
294+ else throw("Strict value is not equal to itself.")
295+ }
296+ else throw("Strict value is not equal to itself.")
249297 }
250298
251299
252-func validateMinSell (assetId,price) = {
253- let minSellWaves = if (unitTest)
254- then 10
255- else getIntByKFromOracle("waves_min_sell")
256- let minSellUsdn = 1000000
257- let minSellSign = if (unitTest)
258- then 1
259- else (currentCertificationPrice * 2)
260- if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
261- then (minSellUsdn > price)
262- else false)
263- then (price != 0)
264- else false)
265- then true
266- else if (if ((assetId == toBase58String(usdtAssetId)))
267- then (minSellUsdn > price)
268- else false)
269- then (price != 0)
270- else false)
271- then true
272- else if (if ((assetId == toBase58String(signAssetId)))
273- then (minSellSign > price)
274- else false)
275- then (price != 0)
276- else false)
277- then true
278- else if (if (if ((assetId == toBase58String(wavesAssetId)))
279- then true
280- else (assetId == "WAVES"))
281- then (minSellWaves > price)
282- else false)
283- then (price != 0)
284- else false)
285- then false
286- else true
287- }
300+func validateMinSell (price) = if ((0 >= price))
301+ then throw("Wrong minimum sell price")
302+ else true
288303
289304
290305 func provideBaseData (i,nftId) = {
291- let $t01082610866 = idCallerDate(i)
292- let id = $t01082610866._1
293- let caller = $t01082610866._2
294- let date = $t01082610866._3
295- let $t01086910938 = checkNFTInfo(nftId)
296- let isValidNFT = $t01086910938._1
297- let artId = $t01086910938._2
298- let creatorAddr = $t01086910938._3
299- let artSignID = $t01086910938._4
306+ let $t01191211952 = idCallerDate(i)
307+ let id = $t01191211952._1
308+ let caller = $t01191211952._2
309+ let date = $t01191211952._3
310+ let $t01195512024 = checkNFTInfo(nftId)
311+ let isValidNFT = $t01195512024._1
312+ let artId = $t01195512024._2
313+ let creatorAddr = $t01195512024._3
314+ let artSignID = $t01195512024._4
300315 $Tuple7(id, caller, date, isValidNFT, artId, creatorAddr, artSignID)
301316 }
302317
303318
304319 func updateNumSales () = {
305320 let numSales = getIntByK(numSalesK)
306321 IntegerEntry(numSalesK, (numSales + 1))
307322 }
308323
309324
310325 @Callable(invoke)
311326 func setConf (key,val) = {
312327 let caller = toString(invoke.caller)
313328 if (containsElement([chris, toString(this)], caller))
314329 then if (contains(key, "conf_"))
315330 then [StringEntry(key, val)]
316331 else throw("Entries starting with conf_ only")
317332 else throw("You are not allowed to change this")
318333 }
319334
320335
321336
322337 @Callable(invoke)
323338 func appRunning (isLive,message) = {
324339 let caller = toString(invoke.caller)
325340 let id = toBase58String(invoke.transactionId)
326341 if (containsElement([chris, toString(this)], caller))
327342 then [BooleanEntry(dappRunningKey, isLive), StringEntry(maintenanceMSGKey, message)]
328343 else throw("You are not allowed to change this")
329344 }
330345
331346
332347
333348 @Callable(i)
334349 func sellNFT (price,asset) = {
335- let $t01200312039 = isPayment(i)
336- let payment = $t01200312039._1
337- let amount = $t01200312039._2
350+ let $t01308913125 = isPayment(i)
351+ let payment = $t01308913125._1
352+ let amount = $t01308913125._2
338353 if ((amount != 1))
339354 then throw("No NFT attached")
340355 else {
341356 let nftId = if (if (isDefined(payment.assetId))
342357 then isSignArtNFT(value(payment.assetId))
343358 else false)
344359 then toBase58String(value(payment.assetId))
345360 else throw("Only SIGN Art NFT accepted.")
346- let $t01227312366 = provideBaseData(i, nftId)
347- let id = $t01227312366._1
348- let caller = $t01227312366._2
349- let date = $t01227312366._3
350- let isValidNFT = $t01227312366._4
351- let artId = $t01227312366._5
352- let creatorAddr = $t01227312366._6
353- let artSignID = $t01227312366._7
361+ let $t01335913452 = provideBaseData(i, nftId)
362+ let id = $t01335913452._1
363+ let caller = $t01335913452._2
364+ let date = $t01335913452._3
365+ let isValidNFT = $t01335913452._4
366+ let artId = $t01335913452._5
367+ let creatorAddr = $t01335913452._6
368+ let artSignID = $t01335913452._7
354369 if ((size(artSignID) == 0))
355370 then throw("Artwork not found on SIGN Art")
356371 else if (!(isValidNFT))
357372 then throw("Not a valid nft")
358373 else if (!(acceptedAssetIds(asset)))
359374 then throw("Only SIGN, USDN, USDT or WAVES accepted")
360- else if (!(validateMinSell(asset, price)))
375+ else if (!(validateMinSell(price)))
361376 then throw("Wrong minimum sell price")
362377 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)]
363378 }
364379 }
365380
366381
367382
368383 @Callable(i)
369384 func updateSalePrice (nftId,price,asset) = {
370- let $t01324613339 = provideBaseData(i, nftId)
371- let id = $t01324613339._1
372- let caller = $t01324613339._2
373- let date = $t01324613339._3
374- let isValidNFT = $t01324613339._4
375- let artId = $t01324613339._5
376- let creatorAddr = $t01324613339._6
377- let artSignID = $t01324613339._7
385+ let $t01432514418 = provideBaseData(i, nftId)
386+ let id = $t01432514418._1
387+ let caller = $t01432514418._2
388+ let date = $t01432514418._3
389+ let isValidNFT = $t01432514418._4
390+ let artId = $t01432514418._5
391+ let creatorAddr = $t01432514418._6
392+ let artSignID = $t01432514418._7
378393 if ((size(artSignID) == 0))
379394 then throw("Artwork not found on SIGN Art, cancel your sale.")
380395 else if (!(isValidNFT))
381396 then throw("Not a valid nft")
382397 else {
383398 let saleOwner = getStrByK(("current_owner_on_dapp_" + nftId))
384399 if ((saleOwner != caller))
385400 then throw("You don't own this NFT")
386401 else {
387402 let saleStatus = getStrByK(((("sale2nd_status_" + caller) + "_") + nftId))
388403 if ((saleStatus != "OPEN"))
389404 then throw("Sale not active")
390405 else if (!(acceptedAssetIds(asset)))
391406 then throw("Only SIGN, USDN, USDT or WAVES accepted")
392- else if (!(validateMinSell(asset, price)))
407+ else if (!(validateMinSell(price)))
393408 then throw("Wrong minimum sell price")
394409 else {
395410 let saleKey = getSaleKey(caller, nftId, artId, creatorAddr)
396411 let saleInfo = split(getStrByK((saleKey + "_OPEN")), "_")
397412 [StringEntry((saleKey + "_OPEN"), ((((((((((((saleInfo[0] + "_") + toString(price)) + "_") + asset) + "_") + saleInfo[3]) + "_") + saleInfo[4]) + "_") + saleInfo[5]) + "_") + saleInfo[6]))]
398413 }
399414 }
400415 }
401416 }
402417
403418
404419
405420 @Callable(i)
406421 func cancelSale (nftId) = {
407- let $t01448714728 = provideBaseData(i, nftId)
408- let id = $t01448714728._1
409- let caller = $t01448714728._2
410- let date = $t01448714728._3
411- let isValidNFT = $t01448714728._4
412- let artId = $t01448714728._5
413- let creatorAddr = $t01448714728._6
414- let artSignID = $t01448714728._7
422+ let $t01555915800 = provideBaseData(i, nftId)
423+ let id = $t01555915800._1
424+ let caller = $t01555915800._2
425+ let date = $t01555915800._3
426+ let isValidNFT = $t01555915800._4
427+ let artId = $t01555915800._5
428+ let creatorAddr = $t01555915800._6
429+ let artSignID = $t01555915800._7
415430 let saleOwner = getStrByK(("current_owner_on_dapp_" + nftId))
416431 if ((saleOwner != caller))
417432 then throw("You don't own this NFT")
418433 else {
419434 let saleStatus = getStrByK(((("sale2nd_status_" + caller) + "_") + nftId))
420435 if ((saleStatus != "OPEN"))
421436 then throw("Sale not active")
422437 else {
423438 let saleKey = getSaleKey(caller, nftId, artId, creatorAddr)
424439 let saleInfo = getStrByK((saleKey + "_OPEN"))
425440 [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))]
426441 }
427442 }
428443 }
429444
430445
431446
432447 @Callable(i)
433448 func buyNFT (nftId) = {
434- let $t01555915652 = provideBaseData(i, nftId)
435- let id = $t01555915652._1
436- let caller = $t01555915652._2
437- let date = $t01555915652._3
438- let isValidNFT = $t01555915652._4
439- let artId = $t01555915652._5
440- let creatorAddr = $t01555915652._6
441- let artSignID = $t01555915652._7
449+ let $t01663116724 = provideBaseData(i, nftId)
450+ let id = $t01663116724._1
451+ let caller = $t01663116724._2
452+ let date = $t01663116724._3
453+ let isValidNFT = $t01663116724._4
454+ let artId = $t01663116724._5
455+ let creatorAddr = $t01663116724._6
456+ let artSignID = $t01663116724._7
442457 if ((size(artSignID) == 0))
443458 then throw("Artwork not found on SIGN Art, cancel your sale.")
444459 else if (!(isValidNFT))
445460 then throw("Not a valid nft")
446461 else {
447462 let saleOwner = getSaleOwnerAndStatus(nftId)
448463 let saleKey = getSaleKey(saleOwner, nftId, artId, creatorAddr)
449464 let saleInfo = getStrByK((saleKey + "_OPEN"))
450465 if ((size(saleInfo) == 0))
451466 then throw("Sale Not found!")
452467 else {
453468 let saleInfoArray = split(saleInfo, "_")
454469 if ((parseInt(saleInfoArray[1]) == 0))
455470 then throw("Offer only")
456471 else {
457- let $t01614916185 = isPayment(i)
458- let payment = $t01614916185._1
459- let amount = $t01614916185._2
472+ let $t01722117257 = isPayment(i)
473+ let payment = $t01722117257._1
474+ let amount = $t01722117257._2
460475 let paymentAssetStr = if (isDefined(payment.assetId))
461476 then toBase58String(value(payment.assetId))
462477 else ""
463478 if (if ((saleInfoArray[1] != toString(amount)))
464479 then true
465480 else (saleInfoArray[2] != paymentAssetStr))
466481 then throw("Payment infos don't match.")
467482 else {
468- let $t01669116830 = setTransfers(amount, payment.assetId, nftId, creatorAddr, saleOwner, caller, artId)
469- let commissions = $t01669116830._1
470- let creatorFee = $t01669116830._2
471- let ownerFee = $t01669116830._3
472- let collectorNFT = $t01669116830._4
483+ let $t01777017909 = setTransfers(amount, payment.assetId, nftId, creatorAddr, saleOwner, caller, artId)
484+ let commissions = $t01777017909._1
485+ let creatorFee = $t01777017909._2
486+ let ownerFee = $t01777017909._3
487+ let collectorNFT = $t01777017909._4
473488 (([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)
474489 }
475490 }
476491 }
477492 }
478493 }
479494
480495
481496
482497 @Callable(i)
483498 func setOffer (nftId) = {
484- let $t01724117338 = provideBaseData(i, nftId)
485- let id = $t01724117338._1
486- let offerOwner = $t01724117338._2
487- let date = $t01724117338._3
488- let isValidNFT = $t01724117338._4
489- let artId = $t01724117338._5
490- let creatorAddr = $t01724117338._6
491- let artSignID = $t01724117338._7
499+ let $t01832018417 = provideBaseData(i, nftId)
500+ let id = $t01832018417._1
501+ let offerOwner = $t01832018417._2
502+ let date = $t01832018417._3
503+ let isValidNFT = $t01832018417._4
504+ let artId = $t01832018417._5
505+ let creatorAddr = $t01832018417._6
506+ let artSignID = $t01832018417._7
492507 if (!(isValidNFT))
493508 then throw("Not a valid nft")
494509 else {
495- let $t01739917435 = isPayment(i)
496- let payment = $t01739917435._1
497- let amount = $t01739917435._2
510+ let $t01847818514 = isPayment(i)
511+ let payment = $t01847818514._1
512+ let amount = $t01847818514._2
498513 let assetId = if (!(isDefined(payment.assetId)))
499514 then "WAVES"
500515 else toBase58String(value(payment.assetId))
501516 if (!(acceptedAssetIds(assetId)))
502517 then throw("asset not accepted")
503518 else if ((amount == 0))
504519 then throw("Offer of 0 not allowed")
505- else if (!(validateMinSell(assetId, amount)))
520+ else if (!(validateMinSell(amount)))
506521 then throw("Wrong minimum sell price")
507522 else {
508523 let saleOwner = getSaleOwnerAndStatus(nftId)
509524 [StringEntry((getBidKey(offerOwner, nftId, saleOwner, id) + "_OPEN"), ((((((((((((((toString(date) + "_") + toString(amount)) + "_") + assetId) + "_") + nftId) + "_") + artId) + "_") + creatorAddr) + "_") + offerOwner) + "_") + id))]
510525 }
511526 }
512527 }
513528
514529
515530
516531 @Callable(i)
517532 func acceptOffer (nftId,offerId,offerOwner) = {
518- let $t01823718330 = provideBaseData(i, nftId)
519- let id = $t01823718330._1
520- let caller = $t01823718330._2
521- let date = $t01823718330._3
522- let isValidNFT = $t01823718330._4
523- let artId = $t01823718330._5
524- let creatorAddr = $t01823718330._6
525- let artSignID = $t01823718330._7
533+ let $t01930719400 = provideBaseData(i, nftId)
534+ let id = $t01930719400._1
535+ let caller = $t01930719400._2
536+ let date = $t01930719400._3
537+ let isValidNFT = $t01930719400._4
538+ let artId = $t01930719400._5
539+ let creatorAddr = $t01930719400._6
540+ let artSignID = $t01930719400._7
526541 if (!(isValidNFT))
527542 then throw("Not a valid nft")
528543 else {
529544 let saleOwner = getSaleOwnerAndStatus(nftId)
530545 if ((caller != saleOwner))
531546 then throw("Only sale owner can accept offer")
532547 else {
533548 let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
534- let $t01858418639 = getBidData(bidKey)
535- let bidDataArr = $t01858418639._1
536- let assetId = $t01858418639._2
537- let bidData = $t01858418639._3
549+ let $t01965419709 = getBidData(bidKey)
550+ let bidDataArr = $t01965419709._1
551+ let assetId = $t01965419709._2
552+ let bidData = $t01965419709._3
538553 let saleKey = getSaleKey(saleOwner, nftId, artId, creatorAddr)
539554 let saleInfo = getStrByK((saleKey + "_OPEN"))
540555 if ((size(saleInfo) == 0))
541556 then throw("Sale Not found!")
542557 else {
543558 let amount = value(parseInt(bidDataArr[1]))
544- let $t01887519013 = setTransfers(amount, assetId, nftId, creatorAddr, saleOwner, bidDataArr[6], artId)
545- let commissions = $t01887519013._1
546- let creatorFee = $t01887519013._2
547- let ownerFee = $t01887519013._3
548- let collectorNFT = $t01887519013._4
559+ let $t01994520083 = setTransfers(amount, assetId, nftId, creatorAddr, saleOwner, bidDataArr[6], artId)
560+ let commissions = $t01994520083._1
561+ let creatorFee = $t01994520083._2
562+ let ownerFee = $t01994520083._3
563+ let collectorNFT = $t01994520083._4
549564 let assetIdStr = if (isDefined(assetId))
550565 then toBase58String(value(assetId))
551566 else "WAVES"
552567 (([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)
553568 }
554569 }
555570 }
556571 }
557572
558573
559574
560575 @Callable(i)
561576 func cancelOffer (nftId,offerId,offerOwner,saleOwner) = {
562- let $t01981319887 = idCallerDate(i)
563- let id = $t01981319887._1
564- let caller = $t01981319887._2
565- let date = $t01981319887._3
577+ let $t02088320957 = idCallerDate(i)
578+ let id = $t02088320957._1
579+ let caller = $t02088320957._2
580+ let date = $t02088320957._3
566581 if (if ((caller != offerOwner))
567582 then (caller != saleOwner)
568583 else false)
569584 then throw("You cannot cancel this offer.")
570585 else {
571586 let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
572- let $t02005920114 = getBidData(bidKey)
573- let bidDataArr = $t02005920114._1
574- let assetId = $t02005920114._2
575- let bidData = $t02005920114._3
587+ let $t02112921184 = getBidData(bidKey)
588+ let bidDataArr = $t02112921184._1
589+ let assetId = $t02112921184._2
590+ let bidData = $t02112921184._3
576591 [DeleteEntry((bidKey + "_OPEN")), StringEntry((bidKey + "_CANCELLED"), ((((bidData + "_CANCELLED_") + toString(date)) + "_") + id)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
577592 }
578593 }
579594
580595

github/deemru/w8io/6500d08 
137.21 ms