tx · GN4TE8Gv3yQ1Kw8zNmBVnerSx6fUdJ8YZa8mhNEmSA6g

3P96rN9M2g7E8WtgLC6XQgoJ2rz341tpkbG:  -0.01600000 Waves

2023.03.29 16:42 [3576918] smart account 3P96rN9M2g7E8WtgLC6XQgoJ2rz341tpkbG > SELF 0.00000000 Waves

{ "type": 13, "id": "GN4TE8Gv3yQ1Kw8zNmBVnerSx6fUdJ8YZa8mhNEmSA6g", "fee": 1600000, "feeAssetId": null, "timestamp": 1680097398167, "version": 2, "chainId": 87, "sender": "3P96rN9M2g7E8WtgLC6XQgoJ2rz341tpkbG", "senderPublicKey": "D627TuphR2x4Z5yLbJjyhoM9KBhfjUPSRgKAUiQthmoi", "proofs": [ "2ogqe1F9Reou2VQrc9zPJw1w88CbPKxa72B92fXDemb29KqeaAsWRoVb1F8EVhuSSPrZ3vJFQnse6BtRGnWRVXMF" ], "script": "base64:BgJWCAISBAoCCAESBAoCCAgSBAoCCAQSBAoCCAISAwoBCBIGCgQICAgIEgMKAQgSABIAEgASAwoBCBIAEgMKAQgSAwoBCBIECgIICBIDCgEIEgYKBAgBBAghAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAARVrZXlCb3VnaHRCb29zdGVyTGV2ZWwBCmFkZHJlc3NTdHIJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgITX2JvdWdodEJvb3N0ZXJMZXZlbAEVa2V5RHVja1BsYXlVbmxvY2tUaW1lAQdhc3NldElkCQCsAgIJAKwCAgIFZHVja18JANgEAQUHYXNzZXRJZAILX3VubG9ja1RpbWUBF2tleUR1Y2tGaW5pc2hVbmxvY2tUaW1lAQdhc3NldElkCQCsAgIJAKwCAgIFZHVja18JANgEAQUHYXNzZXRJZAIRZmluaXNoX3VubG9ja1RpbWUBDGtleUR1Y2tPd25lcgEHYXNzZXRJZAkArAICCQCsAgICBWR1Y2tfCQDYBAEFB2Fzc2V0SWQCBl9vd25lcgEOa2V5U3BvdHNCb3VnaHQBCmFkZHJlc3NTdHIJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIMX3Nwb3RzQm91Z2h0AQxrZXlTcG90c0J1c3kBCmFkZHJlc3NTdHIJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIKX3Nwb3RzQnVzeQETa2V5TG9ja2VkRHVja1N0YXR1cwIKYWRkcmVzc1N0cgphc3NldElkU3RyCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgxfbG9ja2VkRHVja18FCmFzc2V0SWRTdHICB19zdGF0dXMBDmdldER1Y2tEZXRhaWxzAQdhc3NldElkBAlhc3NldE5hbWUJAQV2YWx1ZQEICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEbmFtZQQOYXNzZXROYW1lUGFydHMJALUJAgUJYXNzZXROYW1lAgAECWlzSmFja3BvdAkAAAIJAJEDAgUOYXNzZXROYW1lUGFydHMJAGUCCQCQAwEFDmFzc2V0TmFtZVBhcnRzAAICAUoECmFzc2V0Q29sb3IDBQlpc0phY2twb3QCAUIJAJEDAgUOYXNzZXROYW1lUGFydHMJAGUCCQCQAwEFDmFzc2V0TmFtZVBhcnRzAAEJAJQKAgUKYXNzZXRDb2xvcgUJaXNKYWNrcG90ARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAAQx0cnlHZXRTdHJpbmcBA2tleQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgUEdGhpcwUDa2V5AQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwECFHN0YXRpY19vcmFjbGVBZGRyZXNzAQtnZXRHYW1lTmFtZQAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBAhRzdGF0aWNfc2hvcnRHYW1lTmFtZQIkM0dHTjogVGhlcmUgaXMgbm8gZ2FtZSBuYW1lIGRlZmluZWQhAQ9nZXRMb25nR2FtZU5hbWUACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQITc3RhdGljX2xvbmdHYW1lTmFtZQIqM0dMR046IFRoZXJlIGlzIG5vIGxvbmcgZ2FtZSBuYW1lIGRlZmluZWQhAQpnZXRORlROYW1lAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAECDnN0YXRpY19uZnROYW1lAiMzR05OOiBUaGVyZSBpcyBubyBuZnQgbmFtZSBkZWZpbmVkIQETZ2V0SW5jdWJhdG9yQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MBEWdldFJlbnRpbmdBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhVzdGF0aWNfcmVudGluZ0FkZHJlc3MBEWdldEZhcm1pbmdBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhVzdGF0aWNfZmFybWluZ0FkZHJlc3MBDWdldEVnZ0Fzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhFzdGF0aWNfZWdnQXNzZXRJZAEQZ2V0QmFja2VuZFB1YktleQAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACFHN0YXRpY19iYWNrZW5kUHViS2V5ARRnZXRBY2Nlc3NJdGVtQXNzZXRJZAAJANkEAQkBDHRyeUdldFN0cmluZwECGHN0YXRpY19hY2Nlc3NJdGVtQXNzZXRJZAESZ2V0QWNjZXNzSXRlbVByaWNlAAkBDXRyeUdldEludGVnZXIBAhZzdGF0aWNfYWNjZXNzSXRlbVByaWNlARJnZXRNaW5Mb2NrRHVyYXRpb24ACQENdHJ5R2V0SW50ZWdlcgECFnN0YXRpY19taW5Mb2NrRHVyYXRpb24BEWdldFVubG9ja0R1cmF0aW9uAAkBDXRyeUdldEludGVnZXIBAhVzdGF0aWNfVW5sb2NrRHVyYXRpb24BE2dldEJvc3RlckJ1eUFzc2V0SWQACQDZBAEJAQx0cnlHZXRTdHJpbmcBAhhzdGF0aWNfYm9vc3RlckJ1eUFzc2V0SWQBFmdldEJvc3RlclByaWNlRm9yTGV2ZWwBBWxldmVsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICAhlzdGF0aWNfYm9vc3RlclByaWNlTGV2ZWxfCQCkAwEFBWxldmVsAjkzR0JQRkw6IFRoZXJlIGlzIG5vIHByaWNlIHZhbHVlIGZvciB0aGlzIGxldmVsIG9mIGJvb3N0ZXIBFWdldEJvc3Rlck5hbWVGb3JMZXZlbAEFbGV2ZWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgICE3N0YXRpY19ib29zdGVyTmFtZV8JAKQDAQUFbGV2ZWwCIDNHQk5GTDogVGhlcmUgaXMgbm8gc3VjaCBib29zdGVyAQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAiEzQVM6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcBEGxvY2tEdWNrSW50ZXJuYWwDCmFkZHJlc3NTdHINdGFrZVNwb3RzRnJvbQNwbXQEB2Fzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQLYXNzZXRJc3N1ZXIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyBAx0RHVja0RldGFpbHMJAQ5nZXREdWNrRGV0YWlscwEFB2Fzc2V0SWQECmFzc2V0Q29sb3IIBQx0RHVja0RldGFpbHMCXzEECWlzSmFja3BvdAgFDHREdWNrRGV0YWlscwJfMgQKa1Nwb3RzQnVzeQkBDGtleVNwb3RzQnVzeQEFDXRha2VTcG90c0Zyb20ECXNwb3RzQnVzeQkBDXRyeUdldEludGVnZXIBBQprU3BvdHNCdXN5BAxrU3BvdHNCb3VnaHQJAQ5rZXlTcG90c0JvdWdodAEFDXRha2VTcG90c0Zyb20EFWFkZHJlc3NTcG90c0F2YWlsYWJsZQkAZQIJAQ10cnlHZXRJbnRlZ2VyAQUMa1Nwb3RzQm91Z2h0BQlzcG90c0J1c3kDCQECIT0CCAUDcG10BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAMDCQECIT0CBQthc3NldElzc3VlcgkBE2dldEluY3ViYXRvckFkZHJlc3MACQECIT0CBQthc3NldElzc3VlcgkBEWdldEJyZWVkZXJBZGRyZXNzAAcJAAIBAhNpdmFsaWQgTkZUIGF0dGFjaGVkAwkAZwIAAAUVYWRkcmVzc1Nwb3RzQXZhaWxhYmxlCQACAQISTm8gc3BvdHMgYXZhaWxhYmxlBBFrUGVyY2hlc0F2YWlsYWJsZQkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18JAKUIAQUEdGhpcwISX3BlcmNoZXNBdmFpbGFibGVfBQphc3NldENvbG9yBBBwZXJjaGVzQXZhaWxhYmxlBAckbWF0Y2gwCQCaCAIJARFnZXRGYXJtaW5nQWRkcmVzcwAFEWtQZXJjaGVzQXZhaWxhYmxlAwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAwkAAAIFEHBlcmNoZXNBdmFpbGFibGUFEHBlcmNoZXNBdmFpbGFibGUECmVnZ0Fzc2V0SWQJAQ1nZXRFZ2dBc3NldElkAAQEaW52MQMJAGYCBRBwZXJjaGVzQXZhaWxhYmxlAAAFBHVuaXQJAPwHBAkBEWdldEZhcm1pbmdBZGRyZXNzAAIIYnV5UGVyY2gJAMwIAgUKYXNzZXRDb2xvcgkAzAgCAgAFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKZWdnQXNzZXRJZACAwtcvBQNuaWwDCQAAAgUEaW52MQUEaW52MQQEaW52MgMJAAACBQlpc0phY2twb3QHCQD8BwQJARFnZXRGYXJtaW5nQWRkcmVzcwACCHN0YWtlTkZUBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQAAQUDbmlsCQD8BwQJARFnZXRGYXJtaW5nQWRkcmVzcwACDHN0YWtlSmFja3BvdAkAzAgCBQphc3NldENvbG9yBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQAAQUDbmlsAwkAAAIFBGludjIFBGludjIJAMwIAgkBDEludGVnZXJFbnRyeQIFCmtTcG90c0J1c3kJAGQCBQlzcG90c0J1c3kAAQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RHVja093bmVyAQUHYXNzZXRJZAUKYWRkcmVzc1N0cgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBE2tleUxvY2tlZER1Y2tTdGF0dXMCBQphZGRyZXNzU3RyCQDYBAEFB2Fzc2V0SWQGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVa2V5RHVja1BsYXlVbmxvY2tUaW1lAQUHYXNzZXRJZAkAZAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQESZ2V0TWluTG9ja0R1cmF0aW9uAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ5pbml0VW5sb2NrRHVjawIKYXNzZXRJZFN0cgphZGRyZXNzU3RyBAdhc3NldElkCQDZBAEFCmFzc2V0SWRTdHIEDHREdWNrRGV0YWlscwkBDmdldER1Y2tEZXRhaWxzAQUHYXNzZXRJZAQKYXNzZXRDb2xvcggFDHREdWNrRGV0YWlscwJfMQQJaXNKYWNrcG90CAUMdER1Y2tEZXRhaWxzAl8yBAprU3BvdHNCdXN5CQEMa2V5U3BvdHNCdXN5AQUKYWRkcmVzc1N0cgQKa0R1Y2tPd25lcgkBDGtleUR1Y2tPd25lcgEFB2Fzc2V0SWQEEnJlbWFpbmluZ0ZvclVubG9jawkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkBFWtleUR1Y2tQbGF5VW5sb2NrVGltZQEFB2Fzc2V0SWQIBQlsYXN0QmxvY2sJdGltZXN0YW1wAwkBAiE9AgkBDHRyeUdldFN0cmluZwEFCmtEdWNrT3duZXIFCmFkZHJlc3NTdHIJAAIBAhwzSVVMRDogVGhlIGR1Y2sgaXMgbm90IHlvdXJzAwkAZgIFEnJlbWFpbmluZ0ZvclVubG9jawAACQACAQkArAICCQCsAgICITNJVUw6IFlvdSBuZWVkIHRvIHdhaXQgdG8gdW5sb2NrIAkApAMBCQBpAgUScmVtYWluaW5nRm9yVW5sb2NrAOgHAgggc2Vjb25kcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2tleUR1Y2tGaW5pc2hVbmxvY2tUaW1lAQUHYXNzZXRJZAkAZAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQERZ2V0VW5sb2NrRHVyYXRpb24ABQNuaWwBC3Vuc3Rha2VEdWNrAwphc3NldElkU3RyCmFkZHJlc3NTdHIPYWRkU3BvdHNUb3dhcmRzBAdhc3NldElkCQDZBAEFCmFzc2V0SWRTdHIEDHREdWNrRGV0YWlscwkBDmdldER1Y2tEZXRhaWxzAQUHYXNzZXRJZAQKYXNzZXRDb2xvcggFDHREdWNrRGV0YWlscwJfMQQJaXNKYWNrcG90CAUMdER1Y2tEZXRhaWxzAl8yBAprU3BvdHNCdXN5CQEMa2V5U3BvdHNCdXN5AQUPYWRkU3BvdHNUb3dhcmRzBAprRHVja093bmVyCQEMa2V5RHVja093bmVyAQUHYXNzZXRJZAQScmVtYWluaW5nRm9yVW5sb2NrCQBlAgkBDXRyeUdldEludGVnZXIBCQEXa2V5RHVja0ZpbmlzaFVubG9ja1RpbWUBBQdhc3NldElkCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAQIhPQIJAQx0cnlHZXRTdHJpbmcBBQprRHVja093bmVyBQphZGRyZXNzU3RyCQACAQIaM1VEOiBUaGUgZHVjayBpcyBub3QgeW91cnMDCQBmAgUScmVtYWluaW5nRm9yVW5sb2NrAAAJAAIBCQCsAgIJAKwCAgIgM1VEOiBZb3UgbmVlZCB0byB3YWl0IHRvIHVubG9jayAJAKQDAQkAaQIFEnJlbWFpbmluZ0ZvclVubG9jawDoBwIIIHNlY29uZHMED3Vuc3Rha2VGdW5jTmFtZQMJAAACBQlpc0phY2twb3QGAh11bnN0YWtlSmFja3BvdFdpdGhvdXRDbGFpbUVnZwIWdW5zdGFrZU5GVFdpdGhvdXRDbGFpbQQEaW52MQkA/AcECQERZ2V0RmFybWluZ0FkZHJlc3MABQ91bnN0YWtlRnVuY05hbWUJAMwIAgUKYXNzZXRJZFN0cgUDbmlsBQNuaWwDCQAAAgUEaW52MQUEaW52MQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUKYWRkcmVzc1N0cgABBQdhc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARNrZXlMb2NrZWREdWNrU3RhdHVzAgUKYWRkcmVzc1N0cgUKYXNzZXRJZFN0cgkAzAgCCQELRGVsZXRlRW50cnkBBQprRHVja093bmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQprU3BvdHNCdXN5CQBlAgkBDXRyeUdldEludGVnZXIBBQprU3BvdHNCdXN5AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEVdXBkYXRlU2V0dGluZ0ludGVybmFsAwFpA2tleQV2YWx1ZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECJ09ubHkgYWRtaW5pc3RyYXRvciBjYW4gY2FsbCB0aGlzIG1ldGhvZAQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAJAMwIAgkBDEludGVnZXJFbnRyeQIFA2tleQUDaW50BQNuaWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUBcwUDbmlsAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAJAMwIAgkBDEJvb2xlYW5FbnRyeQIFA2tleQUBYgUDbmlsAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmJ2BQckbWF0Y2gwCQDMCAIJAQtCaW5hcnlFbnRyeQIFA2tleQUCYnYFA25pbAkAAgECDkJhZCB2YWx1ZSB0eXBlEQFpARB1cGRhdGVTZXR0aW5nSW50AgNrZXkFdmFsdWUJARV1cGRhdGVTZXR0aW5nSW50ZXJuYWwDBQFpBQNrZXkFBXZhbHVlAWkBEHVwZGF0ZVNldHRpbmdTdHICA2tleQV2YWx1ZQkBFXVwZGF0ZVNldHRpbmdJbnRlcm5hbAMFAWkFA2tleQUFdmFsdWUBaQEUdXBkYXRlU2V0dGluZ0Jvb2xlYW4CA2tleQV2YWx1ZQkBFXVwZGF0ZVNldHRpbmdJbnRlcm5hbAMFAWkFA2tleQUFdmFsdWUBaQEXdXBkYXRlU2V0dGluZ0J5dGVWZWN0b3ICA2tleQV2YWx1ZQkBFXVwZGF0ZVNldHRpbmdJbnRlcm5hbAMFAWkFA2tleQUFdmFsdWUBaQEVYnV5QWNjZXNzSXRlbUludGVybmFsAQphZGRyZXNzU3RyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIYM0JBSUk6IGludGVybmFsIHVzZSBvbmx5BA9pc3N1ZUFjY2Vzc0l0ZW0JAMIIBQkArAICAgdBQ0NFU1MtCQELZ2V0R2FtZU5hbWUACQCsAgIJAKwCAgkArAICAglbQWNjZXNzXSAJAQ9nZXRMb25nR2FtZU5hbWUAAhAgYWNjZXNzIE5GVCBmb3IgCQEKZ2V0TkZUTmFtZQAAAQAABwQRYWNjZXNzUmFjZUFzc2V0SWQJANgEAQkAuAgBBQ9pc3N1ZUFjY2Vzc0l0ZW0EDGtTcG90c0JvdWdodAkBDmtleVNwb3RzQm91Z2h0AQUKYWRkcmVzc1N0cgkAlAoCCQDMCAIFD2lzc3VlQWNjZXNzSXRlbQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgILYWNjZXNzSXRlbV8FEWFjY2Vzc1JhY2VBc3NldElkAgZfb3duZXIFCmFkZHJlc3NTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgdfb3duaW5nBRFhY2Nlc3NSYWNlQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1Nwb3RzQm91Z2h0CQBkAgkBDXRyeUdldEludGVnZXIBBQxrU3BvdHNCb3VnaHQAAQUDbmlsBRFhY2Nlc3NSYWNlQXNzZXRJZAFpAQ9jb25maWd1cmVPcmFjbGUEBm9yYWNsZQlzaG9ydG5hbWUIbG9uZ25hbWUHbmZ0TmFtZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDzNDTzogYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwUGb3JhY2xlCQDMCAIJAQtTdHJpbmdFbnRyeQICFHN0YXRpY19zaG9ydEdhbWVOYW1lBQlzaG9ydG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgITc3RhdGljX2xvbmdHYW1lTmFtZQUIbG9uZ25hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgIOc3RhdGljX25mdE5hbWUFB25mdE5hbWUFA25pbAFpAQ1kZWxldGVTZXR0aW5nAQNrZXkDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAiwzRFM6IE9ubHkgYWRtaW5pc3RyYXRvciBjYW4gY2FsbCB0aGlzIG1ldGhvZAkAzAgCCQELRGVsZXRlRW50cnkBBQNrZXkFA25pbAFpAQpidXlCb29zdGVyAAQMa0JvdWdodExldmVsCQEVa2V5Qm91Z2h0Qm9vc3RlckxldmVsAQkApQgBCAUBaQZjYWxsZXIEEmJvdWdodEJvb3N0ZXJMZXZlbAkBDXRyeUdldEludGVnZXIBBQxrQm91Z2h0TGV2ZWwECG5ld0xldmVsCQBkAgUSYm91Z2h0Qm9vc3RlckxldmVsAAEEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAVwcmljZQkBFmdldEJvc3RlclByaWNlRm9yTGV2ZWwBBQhuZXdMZXZlbAQPZXhwZWN0ZWRBc3NldElkCQETZ2V0Qm9zdGVyQnV5QXNzZXRJZAADCQECIT0CCAUDcG10BmFtb3VudAUFcHJpY2UJAAIBCQCsAgICHjNCQjogQmFkIHByaWNlLCBpdCBzaG91bGQgYmU6IAkApAMBBQVwcmljZQMJAQIhPQIIBQNwbXQHYXNzZXRJZAUPZXhwZWN0ZWRBc3NldElkCQACAQkArAICAikzQkI6IEJhZCBwYXltZW50IGF0dGFjaGVkLCBpdCBzaG91bGQgYmU6IAkA2AQBBQ9leHBlY3RlZEFzc2V0SWQEBG5hbWUJARVnZXRCb3N0ZXJOYW1lRm9yTGV2ZWwBBQhuZXdMZXZlbAQLYm9vc3Rlckl0ZW0JAMIIBQkArAICCQCsAgIJAQtnZXRHYW1lTmFtZQACAS0FBG5hbWUJAKwCAgkArAICCQCsAgICCltCb29zdGVyXSAJAQ9nZXRMb25nR2FtZU5hbWUAAh8gYm9vc3RlciBmb3IgdGhlIGdhbWUsIGxldmVsID0gCQCkAwEFCG5ld0xldmVsAAEAAAcEEmJvb3N0ZXJJdGVtQXNzZXRJZAkAuAgBBQtib29zdGVySXRlbQkAzAgCBQtib29zdGVySXRlbQkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa0JvdWdodExldmVsBQhuZXdMZXZlbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQUSYm9vc3Rlckl0ZW1Bc3NldElkBQNuaWwBaQEYYnV5QWNjZXNzSXRlbUFuZExvY2tEdWNrAAQKZWdnUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAtkdWNrUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAphZGRyZXNzU3RyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgMJAQIhPQIIBQplZ2dQYXltZW50B2Fzc2V0SWQJARRnZXRBY2Nlc3NJdGVtQXNzZXRJZAAJAAIBAhozQkFJOiBXcm9uZyBhc3NldCBhdHRhY2hlZAMJAQIhPQIIBQplZ2dQYXltZW50BmFtb3VudAkBEmdldEFjY2Vzc0l0ZW1QcmljZQAJAAIBAiUzQkFJOiBXcm9uZyBhbW91bnQgb2YgYXNzZXRzIGF0dGFjaGVkBA5hY2Nlc3NJdGVtRGF0YQkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhVidXlBY2Nlc3NJdGVtSW50ZXJuYWwJAMwIAgUKYWRkcmVzc1N0cgUDbmlsBQNuaWwDCQAAAgUOYWNjZXNzSXRlbURhdGEFDmFjY2Vzc0l0ZW1EYXRhBAhsb2NrRGF0YQkBEGxvY2tEdWNrSW50ZXJuYWwDBQphZGRyZXNzU3RyBQphZGRyZXNzU3RyBQtkdWNrUGF5bWVudAkAlAoCBQhsb2NrRGF0YQUOYWNjZXNzSXRlbURhdGEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENYnV5QWNjZXNzSXRlbQAECmFkZHJlc3NTdHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAplZ2dQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCAUKZWdnUGF5bWVudAdhc3NldElkCQEUZ2V0QWNjZXNzSXRlbUFzc2V0SWQACQACAQIaM0JBSTogV3JvbmcgYXNzZXQgYXR0YWNoZWQDCQECIT0CCAUKZWdnUGF5bWVudAZhbW91bnQJARJnZXRBY2Nlc3NJdGVtUHJpY2UACQACAQIlM0JBSTogV3JvbmcgYW1vdW50IG9mIGFzc2V0cyBhdHRhY2hlZAQOYWNjZXNzSXRlbURhdGEJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIVYnV5QWNjZXNzSXRlbUludGVybmFsCQDMCAIFCmFkZHJlc3NTdHIFA25pbAUDbmlsAwkAAAIFDmFjY2Vzc0l0ZW1EYXRhBQ5hY2Nlc3NJdGVtRGF0YQkAlAoCBQNuaWwFDmFjY2Vzc0l0ZW1EYXRhCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEmJ1eUFjY2Vzc0l0ZW1PdGhlcgEMYWRkcmVzc090aGVyBAplZ2dQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCAUKZWdnUGF5bWVudAdhc3NldElkCQEUZ2V0QWNjZXNzSXRlbUFzc2V0SWQACQACAQIaM0JBSTogV3JvbmcgYXNzZXQgYXR0YWNoZWQDCQECIT0CCAUKZWdnUGF5bWVudAZhbW91bnQJARJnZXRBY2Nlc3NJdGVtUHJpY2UACQACAQIlM0JBSTogV3JvbmcgYW1vdW50IG9mIGFzc2V0cyBhdHRhY2hlZAQOYWNjZXNzSXRlbURhdGEJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIVYnV5QWNjZXNzSXRlbUludGVybmFsCQDMCAIFDGFkZHJlc3NPdGhlcgUDbmlsBQNuaWwDCQAAAgUOYWNjZXNzSXRlbURhdGEFDmFjY2Vzc0l0ZW1EYXRhCQCUCgIFA25pbAUOYWNjZXNzSXRlbURhdGEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIbG9ja0R1Y2sABAphZGRyZXNzU3RyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQLZHVja1BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAkBEGxvY2tEdWNrSW50ZXJuYWwDBQphZGRyZXNzU3RyBQphZGRyZXNzU3RyBQtkdWNrUGF5bWVudAFpAQppbml0VW5sb2NrAQphc3NldElkU3RyBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgkBDmluaXRVbmxvY2tEdWNrAgUKYXNzZXRJZFN0cgUKYWRkcmVzc1N0cgFpAQ9sb2NrRHVja1JlbnRpbmcBFGFkZHJlc3NUYWtlU3BvdHNGcm9tAwkBAiE9AggFAWkGY2FsbGVyCQERZ2V0UmVudGluZ0FkZHJlc3MACQACAQITM1VETzogUmVudGluZyBvbmx5IQQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEC2R1Y2tQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAJARBsb2NrRHVja0ludGVybmFsAwUKYWRkcmVzc1N0cgUUYWRkcmVzc1Rha2VTcG90c0Zyb20FC2R1Y2tQYXltZW50AWkBEXVubG9ja0R1Y2tSZW50aW5nAgphc3NldElkU3RyD2FkZFNwb3RzVG93YXJkcwMJAQIhPQIIBQFpBmNhbGxlcgkBEWdldFJlbnRpbmdBZGRyZXNzAAkAAgECEzNVRE86IFJlbnRpbmcgb25seSEECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyCQELdW5zdGFrZUR1Y2sDBQphc3NldElkU3RyBQphZGRyZXNzU3RyBQ9hZGRTcG90c1Rvd2FyZHMBaQEPdW5sb2NrRHVja090aGVyAQphc3NldElkU3RyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRM1VETzogQWRtaW4gb25seSEECG93bmVyS2V5CQEMdHJ5R2V0U3RyaW5nAQkBDGtleUR1Y2tPd25lcgEJANkEAQUKYXNzZXRJZFN0cgkBC3Vuc3Rha2VEdWNrAwUKYXNzZXRJZFN0cgUIb3duZXJLZXkFCG93bmVyS2V5AWkBCnVubG9ja0R1Y2sECmFzc2V0SWRTdHICdHMHYWxsb3dlZAlzaWduYXR1cmUDCQECIT0CBQdhbGxvd2VkBgkAAgECJDNVRDogTm90IGFsbG93ZWQgdG8gdW5sb2NrIHRoZSBkdWNrIQQITVNJTkhPVVIAgN3bAQQJY3VycmVudFRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAGYCBQljdXJyZW50VHMJAGQCBQJ0cwUITVNJTkhPVVIJAAIBAhgzVUQ6IE91dGRhdGVkIHNpZ25hdHVyZSEECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAR0ZXh0CQC5CQIJAMwIAgUKYXNzZXRJZFN0cgkAzAgCCQCkAwEFAnRzCQDMCAIJAKUDAQUHYWxsb3dlZAUDbmlsAgE7AwkBASEBCQDEEwMJAJsDAQUEdGV4dAkA2QQBBQlzaWduYXR1cmUJARBnZXRCYWNrZW5kUHViS2V5AAkAAgEJAKwCAgkArAICCQCsAgICIzNVRDogSW52YWxpZCBwcm9vZiBmcm9tIGJhY2tlbmQga2V5CQDYBAEJARBnZXRCYWNrZW5kUHViS2V5AAIBIAUEdGV4dAkBC3Vuc3Rha2VEdWNrAwUKYXNzZXRJZFN0cgUKYWRkcmVzc1N0cgUKYWRkcmVzc1N0cgBmmYmu", "height": 3576918, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: E361Skp76C554RccsissxVqGsvx51tCMnTndaW4cd7Y4 Next: 5B8uZ3oWz2bM83fstsqgzXwoZD7vu9ux98upq3QjVaCQ Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetInteger (key) = match getInteger(this, key) {
55 case b: Int =>
66 b
77 case _ =>
88 0
99 }
1010
1111
1212 func keyBoughtBoosterLevel (addressStr) = (("address_" + addressStr) + "_boughtBoosterLevel")
1313
1414
1515 func keyDuckPlayUnlockTime (assetId) = (("duck_" + toBase58String(assetId)) + "_unlockTime")
1616
1717
1818 func keyDuckFinishUnlockTime (assetId) = (("duck_" + toBase58String(assetId)) + "finish_unlockTime")
1919
2020
2121 func keyDuckOwner (assetId) = (("duck_" + toBase58String(assetId)) + "_owner")
2222
2323
2424 func keySpotsBought (addressStr) = (("address_" + addressStr) + "_spotsBought")
2525
2626
2727 func keySpotsBusy (addressStr) = (("address_" + addressStr) + "_spotsBusy")
2828
2929
3030 func keyLockedDuckStatus (addressStr,assetIdStr) = (((("address_" + addressStr) + "_lockedDuck_") + assetIdStr) + "_status")
3131
3232
3333 func getDuckDetails (assetId) = {
3434 let assetName = value(value(assetInfo(assetId)).name)
3535 let assetNameParts = split(assetName, "")
3636 let isJackpot = (assetNameParts[(size(assetNameParts) - 2)] == "J")
3737 let assetColor = if (isJackpot)
3838 then "B"
3939 else assetNameParts[(size(assetNameParts) - 1)]
4040 $Tuple2(assetColor, isJackpot)
4141 }
4242
4343
4444 func tryGetStringExternal (address,key) = match getString(address, key) {
4545 case a: String =>
4646 a
4747 case _ =>
4848 ""
4949 }
5050
5151
5252 func tryGetString (key) = tryGetStringExternal(this, key)
5353
5454
5555 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
5656
5757
5858 func getGameName () = valueOrErrorMessage(getString("static_shortGameName"), "3GGN: There is no game name defined!")
5959
6060
6161 func getLongGameName () = valueOrErrorMessage(getString("static_longGameName"), "3GLGN: There is no long game name defined!")
6262
6363
6464 func getNFTName () = valueOrErrorMessage(getString("static_nftName"), "3GNN: There is no nft name defined!")
6565
6666
6767 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
6868
6969
7070 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress")))
7171
7272
7373 func getRentingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rentingAddress")))
7474
7575
7676 func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_farmingAddress")))
7777
7878
7979 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
8080
8181
8282 func getBackendPubKey () = fromBase58String(tryGetStringExternal(getOracle(), "static_backendPubKey"))
8383
8484
8585 func getAccessItemAssetId () = fromBase58String(tryGetString("static_accessItemAssetId"))
8686
8787
8888 func getAccessItemPrice () = tryGetInteger("static_accessItemPrice")
8989
9090
9191 func getMinLockDuration () = tryGetInteger("static_minLockDuration")
9292
9393
9494 func getUnlockDuration () = tryGetInteger("static_UnlockDuration")
9595
9696
9797 func getBosterBuyAssetId () = fromBase58String(tryGetString("static_boosterBuyAssetId"))
9898
9999
100100 func getBosterPriceForLevel (level) = valueOrErrorMessage(getInteger(("static_boosterPriceLevel_" + toString(level))), "3GBPFL: There is no price value for this level of booster")
101101
102102
103103 func getBosterNameForLevel (level) = valueOrErrorMessage(getString(("static_boosterName_" + toString(level))), "3GBNFL: There is no such booster")
104104
105105
106106 func asString (value) = match value {
107107 case string: String =>
108108 string
109109 case _ =>
110110 throw("3AS: wrong type, expected: String")
111111 }
112112
113113
114114 func lockDuckInternal (addressStr,takeSpotsFrom,pmt) = {
115115 let assetId = value(pmt.assetId)
116116 let assetIssuer = value(assetInfo(assetId)).issuer
117117 let tDuckDetails = getDuckDetails(assetId)
118118 let assetColor = tDuckDetails._1
119119 let isJackpot = tDuckDetails._2
120120 let kSpotsBusy = keySpotsBusy(takeSpotsFrom)
121121 let spotsBusy = tryGetInteger(kSpotsBusy)
122122 let kSpotsBought = keySpotsBought(takeSpotsFrom)
123123 let addressSpotsAvailable = (tryGetInteger(kSpotsBought) - spotsBusy)
124124 if ((pmt.amount != 1))
125125 then throw("NFT is not attached")
126126 else if (if ((assetIssuer != getIncubatorAddress()))
127127 then (assetIssuer != getBreederAddress())
128128 else false)
129129 then throw("ivalid NFT attached")
130130 else if ((0 >= addressSpotsAvailable))
131131 then throw("No spots available")
132132 else {
133133 let kPerchesAvailable = ((("address_" + toString(this)) + "_perchesAvailable_") + assetColor)
134134 let perchesAvailable = match getInteger(getFarmingAddress(), kPerchesAvailable) {
135135 case b: Int =>
136136 b
137137 case _ =>
138138 0
139139 }
140140 if ((perchesAvailable == perchesAvailable))
141141 then {
142142 let eggAssetId = getEggAssetId()
143143 let inv1 = if ((perchesAvailable > 0))
144144 then unit
145145 else invoke(getFarmingAddress(), "buyPerch", [assetColor, ""], [AttachedPayment(eggAssetId, 100000000)])
146146 if ((inv1 == inv1))
147147 then {
148148 let inv2 = if ((isJackpot == false))
149149 then invoke(getFarmingAddress(), "stakeNFT", nil, [AttachedPayment(assetId, 1)])
150150 else invoke(getFarmingAddress(), "stakeJackpot", [assetColor], [AttachedPayment(assetId, 1)])
151151 if ((inv2 == inv2))
152152 then [IntegerEntry(kSpotsBusy, (spotsBusy + 1)), StringEntry(keyDuckOwner(assetId), addressStr), BooleanEntry(keyLockedDuckStatus(addressStr, toBase58String(assetId)), true), IntegerEntry(keyDuckPlayUnlockTime(assetId), (lastBlock.timestamp + getMinLockDuration()))]
153153 else throw("Strict value is not equal to itself.")
154154 }
155155 else throw("Strict value is not equal to itself.")
156156 }
157157 else throw("Strict value is not equal to itself.")
158158 }
159159 }
160160
161161
162162 func initUnlockDuck (assetIdStr,addressStr) = {
163163 let assetId = fromBase58String(assetIdStr)
164164 let tDuckDetails = getDuckDetails(assetId)
165165 let assetColor = tDuckDetails._1
166166 let isJackpot = tDuckDetails._2
167167 let kSpotsBusy = keySpotsBusy(addressStr)
168168 let kDuckOwner = keyDuckOwner(assetId)
169169 let remainingForUnlock = (tryGetInteger(keyDuckPlayUnlockTime(assetId)) - lastBlock.timestamp)
170170 if ((tryGetString(kDuckOwner) != addressStr))
171171 then throw("3IULD: The duck is not yours")
172172 else if ((remainingForUnlock > 0))
173173 then throw((("3IUL: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds"))
174174 else [IntegerEntry(keyDuckFinishUnlockTime(assetId), (lastBlock.timestamp + getUnlockDuration()))]
175175 }
176176
177177
178178 func unstakeDuck (assetIdStr,addressStr,addSpotsTowards) = {
179179 let assetId = fromBase58String(assetIdStr)
180180 let tDuckDetails = getDuckDetails(assetId)
181181 let assetColor = tDuckDetails._1
182182 let isJackpot = tDuckDetails._2
183183 let kSpotsBusy = keySpotsBusy(addSpotsTowards)
184184 let kDuckOwner = keyDuckOwner(assetId)
185185 let remainingForUnlock = (tryGetInteger(keyDuckFinishUnlockTime(assetId)) - lastBlock.timestamp)
186186 if ((tryGetString(kDuckOwner) != addressStr))
187187 then throw("3UD: The duck is not yours")
188188 else if ((remainingForUnlock > 0))
189189 then throw((("3UD: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds"))
190190 else {
191191 let unstakeFuncName = if ((isJackpot == true))
192192 then "unstakeJackpotWithoutClaimEgg"
193193 else "unstakeNFTWithoutClaim"
194194 let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil)
195195 if ((inv1 == inv1))
196196 then [ScriptTransfer(Address(fromBase58String(addressStr)), 1, assetId), DeleteEntry(keyLockedDuckStatus(addressStr, assetIdStr)), DeleteEntry(kDuckOwner), IntegerEntry(kSpotsBusy, (tryGetInteger(kSpotsBusy) - 1))]
197197 else throw("Strict value is not equal to itself.")
198198 }
199199 }
200200
201201
202202 func updateSettingInternal (i,key,value) = if ((i.caller != this))
203203 then throw("Only administrator can call this method")
204204 else match value {
205205 case int: Int =>
206206 [IntegerEntry(key, int)]
207207 case s: String =>
208208 [StringEntry(key, s)]
209209 case b: Boolean =>
210210 [BooleanEntry(key, b)]
211211 case bv: ByteVector =>
212212 [BinaryEntry(key, bv)]
213213 case _ =>
214214 throw("Bad value type")
215215 }
216216
217217
218218 @Callable(i)
219219 func updateSettingInt (key,value) = updateSettingInternal(i, key, value)
220220
221221
222222
223223 @Callable(i)
224224 func updateSettingStr (key,value) = updateSettingInternal(i, key, value)
225225
226226
227227
228228 @Callable(i)
229229 func updateSettingBoolean (key,value) = updateSettingInternal(i, key, value)
230230
231231
232232
233233 @Callable(i)
234234 func updateSettingByteVector (key,value) = updateSettingInternal(i, key, value)
235235
236236
237237
238238 @Callable(i)
239239 func buyAccessItemInternal (addressStr) = if ((i.caller != this))
240240 then throw("3BAII: internal use only")
241241 else {
242242 let issueAccessItem = Issue(("ACCESS-" + getGameName()), ((("[Access] " + getLongGameName()) + " access NFT for ") + getNFTName()), 1, 0, false)
243243 let accessRaceAssetId = toBase58String(calculateAssetId(issueAccessItem))
244244 let kSpotsBought = keySpotsBought(addressStr)
245245 $Tuple2([issueAccessItem, StringEntry((("accessItem_" + accessRaceAssetId) + "_owner"), addressStr), StringEntry((("address_" + addressStr) + "_owning"), accessRaceAssetId), IntegerEntry(kSpotsBought, (tryGetInteger(kSpotsBought) + 1))], accessRaceAssetId)
246246 }
247247
248248
249249
250250 @Callable(i)
251251 func configureOracle (oracle,shortname,longname,nftName) = if ((i.caller != this))
252252 then throw("3CO: admin only")
253253 else [StringEntry("static_oracleAddress", oracle), StringEntry("static_shortGameName", shortname), StringEntry("static_longGameName", longname), StringEntry("static_nftName", nftName)]
254254
255255
256256
257257 @Callable(i)
258258 func deleteSetting (key) = if ((i.caller != this))
259259 then throw("3DS: Only administrator can call this method")
260260 else [DeleteEntry(key)]
261261
262262
263263
264264 @Callable(i)
265265 func buyBooster () = {
266266 let kBoughtLevel = keyBoughtBoosterLevel(toString(i.caller))
267267 let boughtBoosterLevel = tryGetInteger(kBoughtLevel)
268268 let newLevel = (boughtBoosterLevel + 1)
269269 let pmt = value(i.payments[0])
270270 let price = getBosterPriceForLevel(newLevel)
271271 let expectedAssetId = getBosterBuyAssetId()
272272 if ((pmt.amount != price))
273273 then throw(("3BB: Bad price, it should be: " + toString(price)))
274274 else if ((pmt.assetId != expectedAssetId))
275275 then throw(("3BB: Bad payment attached, it should be: " + toBase58String(expectedAssetId)))
276276 else {
277277 let name = getBosterNameForLevel(newLevel)
278278 let boosterItem = Issue(((getGameName() + "-") + name), ((("[Booster] " + getLongGameName()) + " booster for the game, level = ") + toString(newLevel)), 1, 0, false)
279279 let boosterItemAssetId = calculateAssetId(boosterItem)
280280 [boosterItem, IntegerEntry(kBoughtLevel, newLevel), ScriptTransfer(i.caller, 1, boosterItemAssetId)]
281281 }
282282 }
283283
284284
285285
286286 @Callable(i)
287287 func buyAccessItemAndLockDuck () = {
288288 let eggPayment = value(i.payments[0])
289289 let duckPayment = value(i.payments[1])
290290 let addressStr = toString(i.originCaller)
291291 if ((eggPayment.assetId != getAccessItemAssetId()))
292292 then throw("3BAI: Wrong asset attached")
293293 else if ((eggPayment.amount != getAccessItemPrice()))
294294 then throw("3BAI: Wrong amount of assets attached")
295295 else {
296296 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil))
297297 if ((accessItemData == accessItemData))
298298 then {
299299 let lockData = lockDuckInternal(addressStr, addressStr, duckPayment)
300300 $Tuple2(lockData, accessItemData)
301301 }
302302 else throw("Strict value is not equal to itself.")
303303 }
304304 }
305305
306306
307307
308308 @Callable(i)
309309 func buyAccessItem () = {
310310 let addressStr = toString(i.originCaller)
311311 let eggPayment = value(i.payments[0])
312312 if ((eggPayment.assetId != getAccessItemAssetId()))
313313 then throw("3BAI: Wrong asset attached")
314314 else if ((eggPayment.amount != getAccessItemPrice()))
315315 then throw("3BAI: Wrong amount of assets attached")
316316 else {
317317 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil))
318318 if ((accessItemData == accessItemData))
319319 then $Tuple2(nil, accessItemData)
320320 else throw("Strict value is not equal to itself.")
321321 }
322322 }
323323
324324
325325
326326 @Callable(i)
327327 func buyAccessItemOther (addressOther) = {
328328 let eggPayment = value(i.payments[0])
329329 if ((eggPayment.assetId != getAccessItemAssetId()))
330330 then throw("3BAI: Wrong asset attached")
331331 else if ((eggPayment.amount != getAccessItemPrice()))
332332 then throw("3BAI: Wrong amount of assets attached")
333333 else {
334334 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressOther], nil))
335335 if ((accessItemData == accessItemData))
336336 then $Tuple2(nil, accessItemData)
337337 else throw("Strict value is not equal to itself.")
338338 }
339339 }
340340
341341
342342
343343 @Callable(i)
344344 func lockDuck () = {
345345 let addressStr = toString(i.originCaller)
346346 let duckPayment = value(i.payments[0])
347347 lockDuckInternal(addressStr, addressStr, duckPayment)
348348 }
349349
350350
351351
352352 @Callable(i)
353353 func initUnlock (assetIdStr) = {
354354 let addressStr = toString(i.caller)
355355 initUnlockDuck(assetIdStr, addressStr)
356356 }
357357
358358
359359
360360 @Callable(i)
361361 func lockDuckRenting (addressTakeSpotsFrom) = if ((i.caller != getRentingAddress()))
362362 then throw("3UDO: Renting only!")
363363 else {
364364 let addressStr = toString(i.caller)
365365 let duckPayment = value(i.payments[0])
366366 lockDuckInternal(addressStr, addressTakeSpotsFrom, duckPayment)
367367 }
368368
369369
370370
371371 @Callable(i)
372372 func unlockDuckRenting (assetIdStr,addSpotsTowards) = if ((i.caller != getRentingAddress()))
373373 then throw("3UDO: Renting only!")
374374 else {
375375 let addressStr = toString(i.caller)
376376 unstakeDuck(assetIdStr, addressStr, addSpotsTowards)
377377 }
378378
379379
380380
381381 @Callable(i)
382382 func unlockDuckOther (assetIdStr) = if ((i.caller != this))
383383 then throw("3UDO: Admin only!")
384384 else {
385385 let ownerKey = tryGetString(keyDuckOwner(fromBase58String(assetIdStr)))
386386 unstakeDuck(assetIdStr, ownerKey, ownerKey)
387387 }
388388
389389
390390
391391 @Callable(i)
392392 func unlockDuck (assetIdStr,ts,allowed,signature) = if ((allowed != true))
393393 then throw("3UD: Not allowed to unlock the duck!")
394394 else {
395395 let MSINHOUR = 3600000
396396 let currentTs = lastBlock.timestamp
397397 if ((currentTs > (ts + MSINHOUR)))
398398 then throw("3UD: Outdated signature!")
399399 else {
400400 let addressStr = toString(i.caller)
401401 let text = makeString([assetIdStr, toString(ts), toString(allowed)], ";")
402402 if (!(sigVerify_8Kb(toBytes(text), fromBase58String(signature), getBackendPubKey())))
403403 then throw(((("3UD: Invalid proof from backend key" + toBase58String(getBackendPubKey())) + " ") + text))
404404 else unstakeDuck(assetIdStr, addressStr, addressStr)
405405 }
406406 }
407407
408408

github/deemru/w8io/3ef1775 
51.83 ms