tx · F9NU6fsgt2vhzSGwynrfeBkApYHXvtdjntymHD87AQ7h

3P36HH7i6BBuuNp7FHQd6WX8gzfogi778i6:  -0.01300000 Waves

2023.04.20 12:42 [3608269] smart account 3P36HH7i6BBuuNp7FHQd6WX8gzfogi778i6 > SELF 0.00000000 Waves

{ "type": 13, "id": "F9NU6fsgt2vhzSGwynrfeBkApYHXvtdjntymHD87AQ7h", "fee": 1300000, "feeAssetId": null, "timestamp": 1681983771461, "version": 2, "chainId": 87, "sender": "3P36HH7i6BBuuNp7FHQd6WX8gzfogi778i6", "senderPublicKey": "3xRzVfzGz2mW1Y3XAqQwVN4RiiWSgAHpLFmaF24hhfY9", "proofs": [ "4LTccmwnKFvq53YsUErRNDggPbwSfSQTPdmrixgNim8Ly4rHkdTB6RJX3WYrzq5CvJD6fVFgD4NRahpqjQPMRXyR" ], "script": "base64:BgIWCAISAwoBCBIGCgQICAEIEgMKAQgSACABF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEWc3RhdGljS2V5X3NwaWNlQXNzZXRJZAACE3N0YXRpY19zcGljZUFzc2V0SWQBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwACFXN0YXRpY19icmVlZGVyQWRkcmVzcwEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEOa2V5QmxhY2tsaXN0ZWQBCmR1Y2tsaW5nSWQJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCDF9ibGFja2xpc3RlZAEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAmggCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBCWdldE9yYWNsZQAJAQdBZGRyZXNzAQkA2QQBCQEMdHJ5R2V0U3RyaW5nAQkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAEPZ2V0U3BpY2VBc3NldElkAAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFnN0YXRpY0tleV9zcGljZUFzc2V0SWQAARFnZXRCcmVlZGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBB3BheW1lbnQDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAgECGkJEQ0FQOiBQbGVhc2UgYXR0YWNoIHdhdmVzBAlmZWVBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARJzdGF0aWNLZXlfZXh0cmFGZWUAAwkBAiE9AggFB3BheW1lbnQGYW1vdW50BQlmZWVBbW91bnQJAAIBCQCsAgIJAKwCAgIdQkRDQVA6IFBsZWFzZSBhdHRhY2ggZXhhY3RseSAJAKQDAQUJZmVlQW1vdW50AhMgYW1vdW50IG9mIHdhdmVsZXRzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARBnZXRGZWVBZ2dyZWdhdG9yAAUJZmVlQW1vdW50BQR1bml0BQNuaWwAFktHbG9iYWxJc3N1ZWRUaW1lc3RhbXACF2dsb2JhbF9pc3N1ZWRfdGltZXN0YW1wAQxrZXlUb3RhbEZlZWQBCmR1Y2tsaW5nSWQJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCBV9mZWVkAQZrZXlHZW4BCmR1Y2tsaW5nSWQJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCBF9nZW4BDWtleUZlZWROZWVkZWQBCmR1Y2tsaW5nSWQJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCC19mZWVkTmVlZGVkARBnZXREdWNrbGluZ1ByaWNlAQpkdWNrbGluZ0lkBANrZXkJAQ1rZXlGZWVkTmVlZGVkAQUKZHVja2xpbmdJZAQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwCQBoAgUBYgCAwtcvAICg2eYdARtrZXlEdWNrbGluZ0ZlZExhc3RUaW1lc3RhbXABCmR1Y2tsaW5nSWQJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCCl9mZWRMYXN0VHMBEGtleUR1Y2tsaW5nTGV2ZWwBCmR1Y2tsaW5nSWQJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCBl9sZXZlbAEQa2V5RHVja2xpbmdHcm93bgEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAIGX2dyb3duARJrZXlTdGFydFBlcmNlbnRhZ2UBCmR1Y2tsaW5nSWQJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCEF9zdGFydFBlcmNlbnRhZ2UBCGtleU93bmVyAQpkdWNrbGluZ0lkCQCsAgIJAKwCAgIJZHVja2xpbmdfBQpkdWNrbGluZ0lkAgZfb3duZXIBDXRyeUdldEludGVnZXIBA2tleQQDdmFsBAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAUDdmFsAQdnZXRCb29sAQNrZXkEByRtYXRjaDAJAJsIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHARJnZXRDdXJyZW50TGV2ZWxJbnQBCmR1Y2tsaW5nSWQECmtEdWNrTGV2ZWwJARBrZXlEdWNrbGluZ0xldmVsAQUKZHVja2xpbmdJZAQHJG1hdGNoMAkAoggBBQprRHVja0xldmVsAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBDXBhcnNlSW50VmFsdWUBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQEAXUFByRtYXRjaDAAAAkAAgECHUJHQ0xCSTogV2VpcmQgdmFsdWUgZGV0ZWN0ZWQhARNnZXRMYXN0RmVkVGltZXN0YW1wAQpkdWNrbGluZ0lkBBBsYXN0RmVkVGltZXN0YW1wCQENdHJ5R2V0SW50ZWdlcgEJARtrZXlEdWNrbGluZ0ZlZExhc3RUaW1lc3RhbXABBQpkdWNrbGluZ0lkAwkAZgIFEGxhc3RGZWRUaW1lc3RhbXAAAAUQbGFzdEZlZFRpbWVzdGFtcAgFCWxhc3RCbG9jawl0aW1lc3RhbXABGWNhbGN1bGF0ZU5ld0R1Y2tsaW5nTGV2ZWwCCmR1Y2tsaW5nSWQNcGF5bWVudEFtb3VudAQJY3VycmVudFRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQXbGFzdEZlZFRpbWVzdGFtcENoZWNrZWQJARNnZXRMYXN0RmVkVGltZXN0YW1wAQUKZHVja2xpbmdJZAQHZmVkRGlmZgkAZQIFCWN1cnJlbnRUcwUXbGFzdEZlZFRpbWVzdGFtcENoZWNrZWQEBmdyb3d0aAUNcGF5bWVudEFtb3VudAQMY3VycmVudExldmVsCQESZ2V0Q3VycmVudExldmVsSW50AQUKZHVja2xpbmdJZAQIbmV3TGV2ZWwJAGQCBQxjdXJyZW50TGV2ZWwFDXBheW1lbnRBbW91bnQDCQBmAgUIbmV3TGV2ZWwJARBnZXREdWNrbGluZ1ByaWNlAQUKZHVja2xpbmdJZAkAAgEJAKwCAgkArAICAjNCQ05ETDogWW91IGFyZSBmZWVkaW5nIHlvdXIgZHVja2xpbmcgdG8gbXVjaCEgT25seSAJAKQDAQkAZQIJARBnZXREdWNrbGluZ1ByaWNlAQUKZHVja2xpbmdJZAUMY3VycmVudExldmVsAgduZWVkZWQhBAZyZXN1bHQJAKQDAQUIbmV3TGV2ZWwJAJQKAgUGcmVzdWx0CQDMCAIJAKwCAgINY3VycmVudExldmVsPQkApAMBBQxjdXJyZW50TGV2ZWwJAMwIAgkArAICAgluZXdMZXZlbD0JAKQDAQUIbmV3TGV2ZWwJAMwIAgkArAICAgdncm93dGg9CQCkAwEFBmdyb3d0aAkAzAgCCQCsAgICCmxhc3RGZWRUcz0JAKQDAQUXbGFzdEZlZFRpbWVzdGFtcENoZWNrZWQJAMwIAgkArAICAghmZWREaWZmPQkApAMBBQdmZWREaWZmBQNuaWwBBWFzSW50AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAFA2ludAkAAgECHkJBSTogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAENdHJ5R2V0Qm9vbGVhbgEDa2V5BAckbWF0Y2gwCQCgCAEFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEJaXNUZXN0RW52AAkBB2dldEJvb2wBAgdURVNURU5WBAFpAQ9jb25maWd1cmVPcmFjbGUBBm9yYWNsZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECD0JDTzogYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwUGb3JhY2xlBQNuaWwBaQENaXNzdWVEdWNrbGluZwQHYWRkcmVzcwd0eElkU3RyC3NwaWNlQW1vdW50A2dlbgMJAQIhPQIIBQFpBmNhbGxlcgkBEWdldEJyZWVkZXJBZGRyZXNzAAkAAgECIkJJRDogWW91IGNhbid0IGlzc3VlIGZyZWUgZHVja2xpbmcEBWFzc2V0CQDDCAcCEEJBQlktMTExMTExMTEtSFoCAAABAAAHBQR1bml0BQZoZWlnaHQEB2Fzc2V0SWQJALgIAQUFYXNzZXQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQdhZGRyZXNzAgFfBQd0eElkU3RyAgNfZGkJANgEAQUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgIMc3RhdHNfYW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBAgxzdGF0c19hbW91bnQAAQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICCWR1Y2tsaW5nXwkA2AQBBQdhc3NldElkAhFfaXNzdWVkQnlGZWVkQ2FsbAkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVN0YXJ0UGVyY2VudGFnZQEJANgEAQUHYXNzZXRJZAAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAQhrZXlPd25lcgEJANgEAQUHYXNzZXRJZAUHYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQEGa2V5R2VuAQkA2AQBBQdhc3NldElkBQNnZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlGZWVkTmVlZGVkAQkA2AQBBQdhc3NldElkBQtzcGljZUFtb3VudAkAzAgCBQVhc3NldAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEFdmFsdWUBCQCmCAEFB2FkZHJlc3MAAQUHYXNzZXRJZAUDbmlsCQDYBAEFB2Fzc2V0SWQBaQEMZmVlZER1Y2tsaW5nAQpkdWNrbGluZ0lkBA1hZGRyZXNzU3RyaW5nCQClCAEIBQFpBmNhbGxlcgQOcmVhbER1Y2tsaW5nSWQDAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACBgkBAiE9AggJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCQEPZ2V0U3BpY2VBc3NldElkAAkAAgECLkJGRDogQmFkIHBheW1lbnQgYXR0YWNoZWQgKGFzc2V0W3NdIG9yIGFtb3VudCkEC2JsYWNrTGlzdGVkCQENdHJ5R2V0Qm9vbGVhbgEJAQ5rZXlCbGFja2xpc3RlZAEFCmR1Y2tsaW5nSWQDBQtibGFja0xpc3RlZAkAAgECJ0JGRDogQ2FuIG5vdCBmZWVkIGJsYWNrbGlzdGVkIGR1Y2tsaW5nIQMJAQdnZXRCb29sAQkBEGtleUR1Y2tsaW5nR3Jvd24BBQpkdWNrbGluZ0lkCQACAQIeQkZEOiBEdWNrbGluZyBpcyBhbHJlYWR5IGdyb3duAwkAAAIFCmR1Y2tsaW5nSWQCAAkAAgECI0JGRDogUGxlYXNlIGhhdGNoIGEgZHVja2xpbmcgZmlyc3QhBA1kdWNrbGluZ093bmVyCQEMdHJ5R2V0U3RyaW5nAQkBCGtleU93bmVyAQUKZHVja2xpbmdJZAQPZHVja2xpbmdJZENoZWNrCQEFdmFsdWUBCQDsBwEJANkEAQUKZHVja2xpbmdJZAMJAQIhPQIJAPAHAggFAWkGY2FsbGVyCAUPZHVja2xpbmdJZENoZWNrAmlkAAEJAAIBAilCRkQ6IFlvdSdyZSBub3QgdGhlIG93bmVyIG9mIHRoZSBkdWNrbGluZwMJAQIhPQIFDWR1Y2tsaW5nT3duZXIJAKUIAQgFAWkGY2FsbGVyCQACAQI+QkZEOiBZb3UgY2FuIG9ubHkgZmVlZCBkdWNrbGluZ3MgdGhhdCB5b3Ugd29uL2JvdWdodCB5b3Vyc2VsZiEDCQECIT0CCAUPZHVja2xpbmdJZENoZWNrBmlzc3VlcgUEdGhpcwkAAgECJEJGRDogQ2FudCBmaW5kIGR1Y2tsaW5nIHdpdGggc3VjaCBpZAQQZHVja2xpbmdJZFN0cmluZwkA2AQBCAUPZHVja2xpbmdJZENoZWNrAmlkBRBkdWNrbGluZ0lkU3RyaW5nBBJrRHVja2xpbmdMYXN0RmVkVHMJARtrZXlEdWNrbGluZ0ZlZExhc3RUaW1lc3RhbXABBQpkdWNrbGluZ0lkBA5jdXJyZW50UGF5bWVudAgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECWtOZXdMZXZlbAkBEGtleUR1Y2tsaW5nTGV2ZWwBBQ5yZWFsRHVja2xpbmdJZAQKa1RvdGFsRmVlZAkBDGtleVRvdGFsRmVlZAEFDnJlYWxEdWNrbGluZ0lkBAl0b3RhbEZlZWQJAQ10cnlHZXRJbnRlZ2VyAQUKa1RvdGFsRmVlZAQMa0ZlZWRUeFN0YXRzCQCsAgIJAKwCAgkArAICAglkdWNrbGluZ18FDnJlYWxEdWNrbGluZ0lkAgZfc3RhdF8JAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAEDXZhbGlkUGF5bWVudHMJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwABAwkAAAIFDXZhbGlkUGF5bWVudHMFDXZhbGlkUGF5bWVudHMEEGNhbGN1bGF0ZVJlc3VsdHMJARljYWxjdWxhdGVOZXdEdWNrbGluZ0xldmVsAgUOcmVhbER1Y2tsaW5nSWQFDmN1cnJlbnRQYXltZW50CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtEdWNrbGluZ0xhc3RGZWRUcwgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIFCmtUb3RhbEZlZWQJAGQCBQl0b3RhbEZlZWQFDmN1cnJlbnRQYXltZW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrRmVlZFR4U3RhdHMFDmN1cnJlbnRQYXltZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtOZXdMZXZlbAgFEGNhbGN1bGF0ZVJlc3VsdHMCXzEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQxrRmVlZFR4U3RhdHMCBl9kZWJ1ZwkAuQkCCAUQY2FsY3VsYXRlUmVzdWx0cwJfMgIBOwUDbmlsBQ12YWxpZFBheW1lbnRzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFHR1cm5EdWNrbGluZ0ludG9EdWNrAAQNdmFsaWRQYXltZW50cwkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAEDCQAAAgUNdmFsaWRQYXltZW50cwUNdmFsaWRQYXltZW50cwMJAQIhPQIIBQFpBmNhbGxlcgkBEWdldEJyZWVkZXJBZGRyZXNzAAkAAgECHkJURElUOiBZb3UgY2FuJ3QgdHVybiBkdWNrbGluZwQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEBHR4SWQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAQUbGFzdElzc3VlZER1Y2tsaW5nVHMJAQ10cnlHZXRJbnRlZ2VyAQUWS0dsb2JhbElzc3VlZFRpbWVzdGFtcAQLZml2ZU1pbkluTXMJAGgCCQBoAgABADwA6AcECHRpbWVEaWZmCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGQCBRRsYXN0SXNzdWVkRHVja2xpbmdUcwULZml2ZU1pbkluTXMDAwkAZgIFFGxhc3RJc3N1ZWREdWNrbGluZ1RzAAAJAGYCAAAFCHRpbWVEaWZmBwkAAgEJAKwCAgkArAICAkRCVERJVDogQ2FuIGlzc3VlIGR1Y2tsaW5ncyBvbmx5IG9uY2UgcGVyIDEgbWludXRlcywgcGxlYXNlIHdhaXQgZm9yIAkApAMBCQBrAwUIdGltZURpZmYAAQDoBwIFIHNlYy4DCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAIJAAIBAjBCVERJVDogQmFkIHBheW1lbnQgYXR0YWNoZWQgKGFzc2V0W3NdIG9yIGFtb3VudCkDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABCQACAQIbQlRESVQ6IFBsZWFzZSBhdHRhY2ggYSBuZnQhBANwbXQJAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAVwcmljZQkBEGdldER1Y2tsaW5nUHJpY2UBCQDYBAEIBQNwbXQCaWQDCQBmAgUFcHJpY2UJARJnZXRDdXJyZW50TGV2ZWxJbnQBCQDYBAEIBQNwbXQCaWQJAAIBCQCsAgIJAKwCAgkArAICAiNCVERJVDogRHVja2xpbmcgaXMgbm90IGdyb3duIHlldC4uLgkApAMBCQESZ2V0Q3VycmVudExldmVsSW50AQkA2AQBCAUDcG10AmlkAgEgCQCkAwEFBXByaWNlAwkBAiE9AggFA3BtdAZpc3N1ZXIFBHRoaXMJAAIBAixCVERJVDogQ2FuIHVzZSBvbmx5IGR1Y2tsaW5ncyBmcm9tIHRoaXMgZEFwcAQOa0R1Y2tsaW5nR3Jvd24JARBrZXlEdWNrbGluZ0dyb3duAQkA2AQBCAUDcG10AmlkCQCUCgIJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUOa0R1Y2tsaW5nR3Jvd24GCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZLR2xvYmFsSXNzdWVkVGltZXN0YW1wCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUDbmlsBQ12YWxpZFBheW1lbnRzCQDYBAEIBQNwbXQCaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEg3tbGUeRTFtBlgOsBmioL0PeXUfocdpF+m44GQ3cXvSUECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAAC23uhAQ==", "height": 3608269, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GhNAuW8gTmnPPDdzupogpyqYLvtKyx7udXPqhshxuMVi Next: yaaTrxGu2HVtnpkQtfHSdrRtW1cJ38n5JMRmP3HdVDV Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+func staticKey_oracleAddress () = "static_oracleAddress"
5+
6+
7+func staticKey_extraFee () = "static_extraFee"
8+
9+
10+func staticKey_spiceAssetId () = "static_spiceAssetId"
11+
12+
13+func staticKey_breederAddress () = "static_breederAddress"
14+
15+
16+func staticKey_feeAggregator () = "static_feeAggregator"
17+
18+
419 func tryGetStringExternal (address,key) = match getString(address, key) {
520 case a: String =>
621 a
2338 func tryGetString (key) = tryGetStringExternal(this, key)
2439
2540
26-func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
41+func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
2742
2843
29-func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_spiceAssetId"))
44+func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
3045
3146
32-func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress")))
47+func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
48+
49+
50+func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
51+
52+
53+func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
54+ then throw("BDCAP: Please attach waves")
55+ else {
56+ let feeAmount = getIntegerValue(this, staticKey_extraFee())
57+ if ((payment.amount != feeAmount))
58+ then throw((("BDCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
59+ else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
60+ }
3361
3462
3563 let KGlobalIssuedTimestamp = "global_issued_timestamp"
165193 @Callable(i)
166194 func feedDuckling (ducklingId) = {
167195 let addressString = toString(i.caller)
168- let realDucklingId = if (if ((size(i.payments) != 1))
196+ let realDucklingId = if (if ((size(i.payments) != 2))
169197 then true
170198 else (value(i.payments[0]).assetId != getSpiceAssetId()))
171199 then throw("BFD: Bad payment attached (asset[s] or amount)")
198226 let kTotalFeed = keyTotalFeed(realDucklingId)
199227 let totalFeed = tryGetInteger(kTotalFeed)
200228 let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp))
201- let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
202-[IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))]
229+ let validPayments = checkAdditionalPayment(i.payments[1])
230+ if ((validPayments == validPayments))
231+ then {
232+ let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
233+ ([IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))] ++ validPayments)
234+ }
235+ else throw("Strict value is not equal to itself.")
203236 }
204237
205238
206239
207240 @Callable(i)
208-func turnDucklingIntoDuck () = if ((i.caller != getBreederAddress()))
209- then throw("BTDIT: You can't turn duckling")
210- else {
211- let address = toString(i.caller)
212- let txId = toBase58String(i.transactionId)
213- let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
214- let fiveMinInMs = ((1 * 60) * 1000)
215- let timeDiff = (lastBlock.timestamp - (lastIssuedDucklingTs + fiveMinInMs))
216- if (if ((lastIssuedDucklingTs > 0))
217- then (0 > timeDiff)
218- else false)
219- then throw((("BTDIT: Can issue ducklings only once per 1 minutes, please wait for " + toString(fraction(timeDiff, 1, 1000))) + " sec."))
220- else if ((size(i.payments) != 1))
221- then throw("BTDIT: Bad payment attached (asset[s] or amount)")
222- else if ((i.payments[0].amount != 1))
223- then throw("BTDIT: Please attach a nft!")
224- else {
225- let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
226- let price = getDucklingPrice(toBase58String(pmt.id))
227- if ((price > getCurrentLevelInt(toBase58String(pmt.id))))
228- then throw(((("BTDIT: Duckling is not grown yet..." + toString(getCurrentLevelInt(toBase58String(pmt.id)))) + " ") + toString(price)))
229- else if ((pmt.issuer != this))
230- then throw("BTDIT: Can use only ducklings from this dApp")
231- else {
232- let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
233- $Tuple2([BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)], toBase58String(pmt.id))
234- }
235- }
236- }
241+func turnDucklingIntoDuck () = {
242+ let validPayments = checkAdditionalPayment(i.payments[1])
243+ if ((validPayments == validPayments))
244+ then if ((i.caller != getBreederAddress()))
245+ then throw("BTDIT: You can't turn duckling")
246+ else {
247+ let address = toString(i.caller)
248+ let txId = toBase58String(i.transactionId)
249+ let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
250+ let fiveMinInMs = ((1 * 60) * 1000)
251+ let timeDiff = (lastBlock.timestamp - (lastIssuedDucklingTs + fiveMinInMs))
252+ if (if ((lastIssuedDucklingTs > 0))
253+ then (0 > timeDiff)
254+ else false)
255+ then throw((("BTDIT: Can issue ducklings only once per 1 minutes, please wait for " + toString(fraction(timeDiff, 1, 1000))) + " sec."))
256+ else if ((size(i.payments) != 2))
257+ then throw("BTDIT: Bad payment attached (asset[s] or amount)")
258+ else if ((i.payments[0].amount != 1))
259+ then throw("BTDIT: Please attach a nft!")
260+ else {
261+ let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
262+ let price = getDucklingPrice(toBase58String(pmt.id))
263+ if ((price > getCurrentLevelInt(toBase58String(pmt.id))))
264+ then throw(((("BTDIT: Duckling is not grown yet..." + toString(getCurrentLevelInt(toBase58String(pmt.id)))) + " ") + toString(price)))
265+ else if ((pmt.issuer != this))
266+ then throw("BTDIT: Can use only ducklings from this dApp")
267+ else {
268+ let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
269+ $Tuple2(([BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)] ++ validPayments), toBase58String(pmt.id))
270+ }
271+ }
272+ }
273+ else throw("Strict value is not equal to itself.")
274+ }
237275
238276
239277 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+func staticKey_oracleAddress () = "static_oracleAddress"
5+
6+
7+func staticKey_extraFee () = "static_extraFee"
8+
9+
10+func staticKey_spiceAssetId () = "static_spiceAssetId"
11+
12+
13+func staticKey_breederAddress () = "static_breederAddress"
14+
15+
16+func staticKey_feeAggregator () = "static_feeAggregator"
17+
18+
419 func tryGetStringExternal (address,key) = match getString(address, key) {
520 case a: String =>
621 a
722 case _ =>
823 ""
924 }
1025
1126
1227 func keyBlacklisted (ducklingId) = (("duckling_" + ducklingId) + "_blacklisted")
1328
1429
1530 func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
1631 case b: Int =>
1732 b
1833 case _ =>
1934 0
2035 }
2136
2237
2338 func tryGetString (key) = tryGetStringExternal(this, key)
2439
2540
26-func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
41+func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
2742
2843
29-func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_spiceAssetId"))
44+func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
3045
3146
32-func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress")))
47+func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
48+
49+
50+func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
51+
52+
53+func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
54+ then throw("BDCAP: Please attach waves")
55+ else {
56+ let feeAmount = getIntegerValue(this, staticKey_extraFee())
57+ if ((payment.amount != feeAmount))
58+ then throw((("BDCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
59+ else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
60+ }
3361
3462
3563 let KGlobalIssuedTimestamp = "global_issued_timestamp"
3664
3765 func keyTotalFeed (ducklingId) = (("duckling_" + ducklingId) + "_feed")
3866
3967
4068 func keyGen (ducklingId) = (("duckling_" + ducklingId) + "_gen")
4169
4270
4371 func keyFeedNeeded (ducklingId) = (("duckling_" + ducklingId) + "_feedNeeded")
4472
4573
4674 func getDucklingPrice (ducklingId) = {
4775 let key = keyFeedNeeded(ducklingId)
4876 match getInteger(this, key) {
4977 case b: Int =>
5078 (b * 100000000)
5179 case _ =>
5280 8000000000
5381 }
5482 }
5583
5684
5785 func keyDucklingFedLastTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedLastTs")
5886
5987
6088 func keyDucklingLevel (ducklingId) = (("duckling_" + ducklingId) + "_level")
6189
6290
6391 func keyDucklingGrown (ducklingId) = (("duckling_" + ducklingId) + "_grown")
6492
6593
6694 func keyStartPercentage (ducklingId) = (("duckling_" + ducklingId) + "_startPercentage")
6795
6896
6997 func keyOwner (ducklingId) = (("duckling_" + ducklingId) + "_owner")
7098
7199
72100 func tryGetInteger (key) = {
73101 let val = match getInteger(this, key) {
74102 case b: Int =>
75103 b
76104 case _ =>
77105 0
78106 }
79107 val
80108 }
81109
82110
83111 func getBool (key) = match getBoolean(this, key) {
84112 case b: Boolean =>
85113 b
86114 case _ =>
87115 false
88116 }
89117
90118
91119 func getCurrentLevelInt (ducklingId) = {
92120 let kDuckLevel = keyDucklingLevel(ducklingId)
93121 match getString(kDuckLevel) {
94122 case s: String =>
95123 parseIntValue(s)
96124 case u: Unit =>
97125 0
98126 case _ =>
99127 throw("BGCLBI: Weird value detected!")
100128 }
101129 }
102130
103131
104132 func getLastFedTimestamp (ducklingId) = {
105133 let lastFedTimestamp = tryGetInteger(keyDucklingFedLastTimestamp(ducklingId))
106134 if ((lastFedTimestamp > 0))
107135 then lastFedTimestamp
108136 else lastBlock.timestamp
109137 }
110138
111139
112140 func calculateNewDucklingLevel (ducklingId,paymentAmount) = {
113141 let currentTs = lastBlock.timestamp
114142 let lastFedTimestampChecked = getLastFedTimestamp(ducklingId)
115143 let fedDiff = (currentTs - lastFedTimestampChecked)
116144 let growth = paymentAmount
117145 let currentLevel = getCurrentLevelInt(ducklingId)
118146 let newLevel = (currentLevel + paymentAmount)
119147 if ((newLevel > getDucklingPrice(ducklingId)))
120148 then throw((("BCNDL: You are feeding your duckling to much! Only " + toString((getDucklingPrice(ducklingId) - currentLevel))) + "needed!"))
121149 else {
122150 let result = toString(newLevel)
123151 $Tuple2(result, [("currentLevel=" + toString(currentLevel)), ("newLevel=" + toString(newLevel)), ("growth=" + toString(growth)), ("lastFedTs=" + toString(lastFedTimestampChecked)), ("fedDiff=" + toString(fedDiff))])
124152 }
125153 }
126154
127155
128156 func asInt (value) = match value {
129157 case int: Int =>
130158 int
131159 case _ =>
132160 throw("BAI: wrong type, expected: Int")
133161 }
134162
135163
136164 func tryGetBoolean (key) = match getBoolean(key) {
137165 case b: Boolean =>
138166 b
139167 case _ =>
140168 false
141169 }
142170
143171
144172 func isTestEnv () = getBool("TESTENV")
145173
146174
147175 @Callable(i)
148176 func configureOracle (oracle) = if ((i.caller != this))
149177 then throw("BCO: admin only")
150178 else [StringEntry("static_oracleAddress", oracle)]
151179
152180
153181
154182 @Callable(i)
155183 func issueDuckling (address,txIdStr,spiceAmount,gen) = if ((i.caller != getBreederAddress()))
156184 then throw("BID: You can't issue free duckling")
157185 else {
158186 let asset = Issue("BABY-11111111-HZ", "", 1, 0, false, unit, height)
159187 let assetId = calculateAssetId(asset)
160188 $Tuple2([StringEntry((((address + "_") + txIdStr) + "_di"), toBase58String(assetId)), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), BooleanEntry((("duckling_" + toBase58String(assetId)) + "_issuedByFeedCall"), (i.caller == this)), IntegerEntry(keyStartPercentage(toBase58String(assetId)), 0), StringEntry(keyOwner(toBase58String(assetId)), address), StringEntry(keyGen(toBase58String(assetId)), gen), IntegerEntry(keyFeedNeeded(toBase58String(assetId)), spiceAmount), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
161189 }
162190
163191
164192
165193 @Callable(i)
166194 func feedDuckling (ducklingId) = {
167195 let addressString = toString(i.caller)
168- let realDucklingId = if (if ((size(i.payments) != 1))
196+ let realDucklingId = if (if ((size(i.payments) != 2))
169197 then true
170198 else (value(i.payments[0]).assetId != getSpiceAssetId()))
171199 then throw("BFD: Bad payment attached (asset[s] or amount)")
172200 else {
173201 let blackListed = tryGetBoolean(keyBlacklisted(ducklingId))
174202 if (blackListed)
175203 then throw("BFD: Can not feed blacklisted duckling!")
176204 else if (getBool(keyDucklingGrown(ducklingId)))
177205 then throw("BFD: Duckling is already grown")
178206 else if ((ducklingId == ""))
179207 then throw("BFD: Please hatch a duckling first!")
180208 else {
181209 let ducklingOwner = tryGetString(keyOwner(ducklingId))
182210 let ducklingIdCheck = value(assetInfo(fromBase58String(ducklingId)))
183211 if ((assetBalance(i.caller, ducklingIdCheck.id) != 1))
184212 then throw("BFD: You're not the owner of the duckling")
185213 else if ((ducklingOwner != toString(i.caller)))
186214 then throw("BFD: You can only feed ducklings that you won/bought yourself!")
187215 else if ((ducklingIdCheck.issuer != this))
188216 then throw("BFD: Cant find duckling with such id")
189217 else {
190218 let ducklingIdString = toBase58String(ducklingIdCheck.id)
191219 ducklingIdString
192220 }
193221 }
194222 }
195223 let kDucklingLastFedTs = keyDucklingFedLastTimestamp(ducklingId)
196224 let currentPayment = value(i.payments[0]).amount
197225 let kNewLevel = keyDucklingLevel(realDucklingId)
198226 let kTotalFeed = keyTotalFeed(realDucklingId)
199227 let totalFeed = tryGetInteger(kTotalFeed)
200228 let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp))
201- let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
202-[IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))]
229+ let validPayments = checkAdditionalPayment(i.payments[1])
230+ if ((validPayments == validPayments))
231+ then {
232+ let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
233+ ([IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))] ++ validPayments)
234+ }
235+ else throw("Strict value is not equal to itself.")
203236 }
204237
205238
206239
207240 @Callable(i)
208-func turnDucklingIntoDuck () = if ((i.caller != getBreederAddress()))
209- then throw("BTDIT: You can't turn duckling")
210- else {
211- let address = toString(i.caller)
212- let txId = toBase58String(i.transactionId)
213- let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
214- let fiveMinInMs = ((1 * 60) * 1000)
215- let timeDiff = (lastBlock.timestamp - (lastIssuedDucklingTs + fiveMinInMs))
216- if (if ((lastIssuedDucklingTs > 0))
217- then (0 > timeDiff)
218- else false)
219- then throw((("BTDIT: Can issue ducklings only once per 1 minutes, please wait for " + toString(fraction(timeDiff, 1, 1000))) + " sec."))
220- else if ((size(i.payments) != 1))
221- then throw("BTDIT: Bad payment attached (asset[s] or amount)")
222- else if ((i.payments[0].amount != 1))
223- then throw("BTDIT: Please attach a nft!")
224- else {
225- let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
226- let price = getDucklingPrice(toBase58String(pmt.id))
227- if ((price > getCurrentLevelInt(toBase58String(pmt.id))))
228- then throw(((("BTDIT: Duckling is not grown yet..." + toString(getCurrentLevelInt(toBase58String(pmt.id)))) + " ") + toString(price)))
229- else if ((pmt.issuer != this))
230- then throw("BTDIT: Can use only ducklings from this dApp")
231- else {
232- let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
233- $Tuple2([BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)], toBase58String(pmt.id))
234- }
235- }
236- }
241+func turnDucklingIntoDuck () = {
242+ let validPayments = checkAdditionalPayment(i.payments[1])
243+ if ((validPayments == validPayments))
244+ then if ((i.caller != getBreederAddress()))
245+ then throw("BTDIT: You can't turn duckling")
246+ else {
247+ let address = toString(i.caller)
248+ let txId = toBase58String(i.transactionId)
249+ let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
250+ let fiveMinInMs = ((1 * 60) * 1000)
251+ let timeDiff = (lastBlock.timestamp - (lastIssuedDucklingTs + fiveMinInMs))
252+ if (if ((lastIssuedDucklingTs > 0))
253+ then (0 > timeDiff)
254+ else false)
255+ then throw((("BTDIT: Can issue ducklings only once per 1 minutes, please wait for " + toString(fraction(timeDiff, 1, 1000))) + " sec."))
256+ else if ((size(i.payments) != 2))
257+ then throw("BTDIT: Bad payment attached (asset[s] or amount)")
258+ else if ((i.payments[0].amount != 1))
259+ then throw("BTDIT: Please attach a nft!")
260+ else {
261+ let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
262+ let price = getDucklingPrice(toBase58String(pmt.id))
263+ if ((price > getCurrentLevelInt(toBase58String(pmt.id))))
264+ then throw(((("BTDIT: Duckling is not grown yet..." + toString(getCurrentLevelInt(toBase58String(pmt.id)))) + " ") + toString(price)))
265+ else if ((pmt.issuer != this))
266+ then throw("BTDIT: Can use only ducklings from this dApp")
267+ else {
268+ let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
269+ $Tuple2(([BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)] ++ validPayments), toBase58String(pmt.id))
270+ }
271+ }
272+ }
273+ else throw("Strict value is not equal to itself.")
274+ }
237275
238276
239277 @Verifier(tx)
240278 func verify () = if (isTestEnv())
241279 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
242280 else {
243281 let firstUser = base58'FzsTVRXqD46KW5yj6qGNVrsouvWjpCQvD1446A96iGt4'
244282 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
245283 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
246284 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
247285 then 1
248286 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
249287 then 1
250288 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
251289 then 1
252290 else 0
253291 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
254292 then 1
255293 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
256294 then 1
257295 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
258296 then 1
259297 else 0
260298 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
261299 then 1
262300 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
263301 then 1
264302 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
265303 then 1
266304 else 0
267305 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
268306 match tx {
269307 case _ =>
270308 (signaturesCount >= 2)
271309 }
272310 }
273311

github/deemru/w8io/3ef1775 
44.84 ms