tx · BLbeS5hHnDSzBYHthNCAvRnD7WUageTojA7CyK19Y6cE

3Mw8EHDvHCbzm6VE777G6EJNQBEe6CeS335:  -0.01900000 Waves

2024.11.11 22:14 [3367194] smart account 3Mw8EHDvHCbzm6VE777G6EJNQBEe6CeS335 > SELF 0.00000000 Waves

{ "type": 13, "id": "BLbeS5hHnDSzBYHthNCAvRnD7WUageTojA7CyK19Y6cE", "fee": 1900000, "feeAssetId": null, "timestamp": 1731352485834, "version": 2, "chainId": 84, "sender": "3Mw8EHDvHCbzm6VE777G6EJNQBEe6CeS335", "senderPublicKey": "4f2Ggz6CqZhqr3FaW8dzR6KoddCudvULpuUfh7ew3Yne", "proofs": [ "3y9ATPrKQ3A1aJ8pC1pVQ8Q9v6DRRnKt9E8cyi32EqSztL2ggSLbfJZNTAYLmyYu2VdbgPcfNkToAZGrTa6EVHn6" ], "script": "base64:BgIZCAISAwoBCBIAEgMKAQgSAwoBCBIECgIICCoBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBBWFzSW50AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAFA2ludAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAkAAgEJAKwCAgIpUkFJOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50LCBidXQgZ290OiAFBnN0cmluZwkAAgECHlJBSTogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAEJYXNCb29sZWFuAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQHYm9vbGVhbgUHJG1hdGNoMAUHYm9vbGVhbgkAAgECIkZBQjogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEJvb2xlYW4BB2dldEJvb2wBA2tleQQHJG1hdGNoMAkAmwgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBCGFzU3RyaW5nAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzAwkAAQIFByRtYXRjaDACA0ludAQBcwUHJG1hdGNoMAkAAgECJndyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcsIGdvdDogSW50AwkAAQIFByRtYXRjaDACBFVuaXQEAXMFByRtYXRjaDAJAAIBAid3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nLCBnb3Q6IFVuaXQJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQlpc1Rlc3RFbnYACQEHZ2V0Qm9vbAECB1RFU1RFTlYBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgEgc3RhdGljS2V5X2NhbmluZUluY3ViYXRvckFkZHJlc3MAAh1zdGF0aWNfY2FuaW5lSW5jdWJhdG9yQWRkcmVzcwEec3RhdGljS2V5X2NhbmluZUJyZWVkZXJBZGRyZXNzAAIbc3RhdGljX2NhbmluZUJyZWVkZXJBZGRyZXNzARhzdGF0aWNLZXlfY291cG9uc0FkZHJlc3MAAhVzdGF0aWNfY291cG9uc0FkZHJlc3MBHnN0YXRpY0tleV9jYW5pbmVTdGFraW5nQWRkcmVzcwACG3N0YXRpY19jYW5pbmVTdGFraW5nQWRkcmVzcwEcc3RhdGljS2V5X2R1Y2tTdGFraW5nQWRkcmVzcwACGHN0YXRpY19mYXJtaW5nQWRkcmVzc05ldwEec3RhdGljS2V5X2R1Y2tJbmN1YmF0b3JBZGRyZXNzAAIXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBFnN0YXRpY0tleV9pdGVtc0FkZHJlc3MAAhNzdGF0aWNfaXRlbXNBZGRyZXNzASFzdGF0aWNLZXlfY2FuaW5lV2F2ZXNSZWJpcnRoUHJpY2UAAh5zdGF0aWNfY2FuaW5lV2F2ZXNSZWJpcnRoUHJpY2UBIHN0YXRpY0tleV90dXJ0bGVJbmN1YmF0b3JBZGRyZXNzAAIdc3RhdGljX3R1cnRsZUluY3ViYXRvckFkZHJlc3MBGXN0YXRpY0tleV9iYWJ5RHVja0FkZHJlc3MAAhZzdGF0aWNfYmFieUR1Y2tBZGRyZXNzAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABF2dldENhbmluZUJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEec3RhdGljS2V5X2NhbmluZUJyZWVkZXJBZGRyZXNzAAEZZ2V0Q2FuaW5lSW5jdWJhdG9yQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBIHN0YXRpY0tleV9jYW5pbmVJbmN1YmF0b3JBZGRyZXNzAAERZ2V0Q291cG9uc0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfY291cG9uc0FkZHJlc3MAARdnZXRDYW5pbmVTdGFraW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV9jYW5pbmVTdGFraW5nQWRkcmVzcwABFWdldER1Y2tTdGFraW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHHN0YXRpY0tleV9kdWNrU3Rha2luZ0FkZHJlc3MAARdnZXREdWNrSW5jdWJhdG9yQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV9kdWNrSW5jdWJhdG9yQWRkcmVzcwABD2dldEl0ZW1zQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFnN0YXRpY0tleV9pdGVtc0FkZHJlc3MAARlnZXRUdXJ0bGVJbmN1YmF0b3JBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEgc3RhdGljS2V5X3R1cnRsZUluY3ViYXRvckFkZHJlc3MAARJnZXRCYWJ5RHVja0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARlzdGF0aWNLZXlfYmFieUR1Y2tBZGRyZXNzAAEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAmggCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiCQACAQIaVFI6IFZhbHVlIG5vdCBmb3VuZCBpbiBzYyEAC3dhdmVzQW1vdW50CQEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgkBCWdldE9yYWNsZQAJASFzdGF0aWNLZXlfY2FuaW5lV2F2ZXNSZWJpcnRoUHJpY2UAABBkZWxheUZvckhhdGNoaW5nAAIBCWNoZWNrUmVhbAEHYXNzZXRJZAMDCQAAAggJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAZpc3N1ZXIJARdnZXRDYW5pbmVCcmVlZGVyQWRkcmVzcwAGCQAAAggJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAZpc3N1ZXIJARlnZXRDYW5pbmVJbmN1YmF0b3JBZGRyZXNzAAgJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAZpc3N1ZXIJAAIBAg1ub3QgdmFsaWQgTkZUARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQdwYXltZW50AwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhlSQ0FQOiBQbGVhc2UgYXR0YWNoIHdhdmVzBAlmZWVBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIJAQlnZXRPcmFjbGUACQESc3RhdGljS2V5X2V4dHJhRmVlAAMJAQIhPQIIBQdwYXltZW50BmFtb3VudAUJZmVlQW1vdW50CQACAQkArAICCQCsAgICHFJDQVA6IFBsZWFzZSBhdHRhY2ggZXhhY3RseSAJAKQDAQUJZmVlQW1vdW50AhMgYW1vdW50IG9mIHdhdmVsZXRzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARBnZXRGZWVBZ2dyZWdhdG9yAAUJZmVlQW1vdW50BQR1bml0BQNuaWwBD2dldFJhbmRvbU51bWJlcgQHb3B0aW9ucwR0eElkFGhhdGNoaW5nRmluaXNoSGVpZ2h0Bm9mZnNldAQPcmFuZG9tU2VlZEJsb2NrCQEFdmFsdWUBCQDtBwEJAGUCBRRoYXRjaGluZ0ZpbmlzaEhlaWdodAABBApyYW5kb21IYXNoCQD3AwEJAMsBAgUEdHhJZAkBBXZhbHVlAQgFD3JhbmRvbVNlZWRCbG9jawN2cmYJAGoCCQCyCQIFCnJhbmRvbUhhc2gJAGgCBQZvZmZzZXQACAUHb3B0aW9ucwENdHJ5R2V0Qm9vbGVhbgEDa2V5BAckbWF0Y2gwCQCgCAEFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEMZ2V0UmFuZG9tV2luAwJ0eAxmaW5pc2hIZWlnaHQNYmxhY2tsaXN0Q29kZQQNamFja3BvdFJhbmRvbQkBD2dldFJhbmRvbU51bWJlcgQAyAEFAnR4BQxmaW5pc2hIZWlnaHQAAQMJAAACBQ1qYWNrcG90UmFuZG9tAAEJAJQKAgUNamFja3BvdFJhbmRvbQIHamFja3BvdAQBbgkBD2dldFJhbmRvbU51bWJlcgQA6AcFAnR4BQxmaW5pc2hIZWlnaHQAAAQGcmVzdWx0AwMJAGYCAMgBBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAglkb2NraW5nX0EHAglkb2NraW5nX0EDAwkAZgIAkAMFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCCWRvY2tpbmdfQgcCCWRvY2tpbmdfQgMDCQBmAgDYBAUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIJZG9ja2luZ19DBwIJZG9ja2luZ19DAwMJAGYCAKAGBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAhFpdGVtIUFSVC1GUkVFR0VORQcCEWl0ZW0hQVJULUZSRUVHRU5FAhBpdGVtIUFSVC1GSVhHRU5FCQCUCgIFAW4FBnJlc3VsdAEPZ2V0UmFuZG9tUmV0dXJuAgJ0eAxmaW5pc2hIZWlnaHQEAW4JAQ9nZXRSYW5kb21OdW1iZXIEAAIFAnR4BQxmaW5pc2hIZWlnaHQAAQMJAAACBQFuAAAGBwEVZmluaXNoUmViaXJ0aEludGVybmFsBgZpbml0VHgHYWRkcmVzcxFhZGRpdGlvbmFsUGF5bWVudAZkb3VibGUNYmxhY2tsaXN0Q29kZQZyZXNjdWUEC2ZpbmlzaEJsb2NrCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCDF9maW5pc2hCbG9jawQGc3RhdHVzCQEMdHJ5R2V0U3RyaW5nAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3N0YXR1cwQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEFEWFkZGl0aW9uYWxQYXltZW50AwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50AwkBAiE9AgUGc3RhdHVzAgRvcGVuCQACAQIfcmViaXJ0aCBpcyBmaW5pc2hlZCBvciBub3Qgb3BlbgMJAGYCBQtmaW5pc2hCbG9jawUGaGVpZ2h0CQACAQIeeW91IGNhbm5vdCBmaW5pc2ggcmViaXJ0aCwgeWV0BAZvdXRwdXQJAQxnZXRSYW5kb21XaW4DCQDZBAEFBmluaXRUeAULZmluaXNoQmxvY2sFDWJsYWNrbGlzdENvZGUEA3dpbggFBm91dHB1dAJfMgQGcmFuZG9tCAUGb3V0cHV0Al8xBAR0eElkBQZpbml0VHgEBnJlc3VsdAMJAQIhPQIJALMJAgUDd2luAgdkb2NraW5nBQR1bml0BAVjb2xvcgkAsgICBQN3aW4AAQQEY2FsbAMJAQEhAQUGZG91YmxlBAVmaXJzdAkA/AcECQEXZ2V0Q2FuaW5lU3Rha2luZ0FkZHJlc3MAAgxhZGRGcmVlUGVyY2gJAMwIAgUHYWRkcmVzcwkAzAgCBQVjb2xvcgkAzAgCAAEFA25pbAUDbmlsAwkAAAIFBWZpcnN0BQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQVmaXJzdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAVmaXJzdAkA/AcECQEXZ2V0Q2FuaW5lU3Rha2luZ0FkZHJlc3MAAgxhZGRGcmVlUGVyY2gJAMwIAgUHYWRkcmVzcwkAzAgCBQVjb2xvcgkAzAgCAAIFA25pbAUDbmlsAwkAAAIFBWZpcnN0BQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AghfcmVzdWx0MQkBCGFzU3RyaW5nAQUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIFX3dpbjEFA3dpbgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBGNhbGwFBGNhbGwFBGNhbGwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUDd2luAgdqYWNrcG90BARjYWxsCQD8BwQJARlnZXRDYW5pbmVJbmN1YmF0b3JBZGRyZXNzAAIMaXNzdWVKYWNrcG90CQDMCAIFB2FkZHJlc3MJAMwIAgUEdHhJZAkAzAgCAghXV1dXSFdURgUDbmlsBQNuaWwDCQAAAgUEY2FsbAUEY2FsbAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQRjYWxsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUDd2luAglpbmN1YmF0b3IEBGNhbGwDCQEBIQEFBmRvdWJsZQQFZmlyc3QJAPwHBAkBGWdldENhbmluZUluY3ViYXRvckFkZHJlc3MAAglpc3N1ZUZyZWUJAMwIAgUHYWRkcmVzcwkAzAgCBQR0eElkBQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQFZmlyc3QJAPwHBAkBGWdldENhbmluZUluY3ViYXRvckFkZHJlc3MAAglpc3N1ZUZyZWUJAMwIAgUHYWRkcmVzcwkAzAgCBQR0eElkBQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QEBnNlY29uZAkA/AcECQEZZ2V0VHVydGxlSW5jdWJhdG9yQWRkcmVzcwACD2lzc3VlRnJlZVR1cnRsZQkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQFA25pbAUDbmlsAwkAAAIFBnNlY29uZAUGc2Vjb25kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yZXN1bHQJAQhhc1N0cmluZwEFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCCF9yZXN1bHQxCQEIYXNTdHJpbmcBBQZzZWNvbmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIFX3dpbjECCWluY3ViYXRvcgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBGNhbGwFBGNhbGwFBGNhbGwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQECIT0CCQCzCQIFA3dpbgIIZHVja2xpbmcFBHVuaXQEBWxldmVsCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCBQN3aW4CAV8AAQQKbGV2ZWxGaW5hbAMFBmRvdWJsZQkAaAIAAgUFbGV2ZWwFBWxldmVsBARjYWxsCQD8BwQJARJnZXRCYWJ5RHVja0FkZHJlc3MAAhFpc3N1ZUZyZWVEdWNrbGluZwkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQJAMwIAgUKbGV2ZWxGaW5hbAUDbmlsBQNuaWwDCQAAAgUEY2FsbAUEY2FsbAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQRjYWxsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUDd2luAg50cnRsX2luY3ViYXRvcgQEY2FsbAMJAQEhAQUGZG91YmxlBAVmaXJzdAkA/AcECQEZZ2V0VHVydGxlSW5jdWJhdG9yQWRkcmVzcwACD2lzc3VlRnJlZVR1cnRsZQkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQFA25pbAUDbmlsAwkAAAIFBWZpcnN0BQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQVmaXJzdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAVmaXJzdAkA/AcECQEZZ2V0VHVydGxlSW5jdWJhdG9yQWRkcmVzcwACD2lzc3VlRnJlZVR1cnRsZQkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQFA25pbAUDbmlsAwkAAAIFBWZpcnN0BQVmaXJzdAQGc2Vjb25kCQD8BwQJARlnZXRDYW5pbmVJbmN1YmF0b3JBZGRyZXNzAAIJaXNzdWVGcmVlCQDMCAIFB2FkZHJlc3MJAMwIAgUEdHhJZAUDbmlsBQNuaWwDCQAAAgUGc2Vjb25kBQZzZWNvbmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIIX3Jlc3VsdDEJAQhhc1N0cmluZwEFBnNlY29uZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgVfd2luMQIOdHJ0bF9pbmN1YmF0b3IFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQRjYWxsBQRjYWxsBQRjYWxsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkBAiE9AgkAswkCBQN3aW4CBGl0ZW0FBHVuaXQECGl0ZW1OYW1lCQCRAwIJALUJAgUDd2luAgEhAAEEBGNhbGwDCQEBIQEFBmRvdWJsZQQFZmlyc3QJAPwHBAkBD2dldEl0ZW1zQWRkcmVzcwACEmlzc3VlQXJ0ZWZhY3RJbmRleAkAzAgCBQhpdGVtTmFtZQkAzAgCBQdhZGRyZXNzCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUFZmlyc3QFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yZXN1bHQJAQhhc1N0cmluZwEFBWZpcnN0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBWZpcnN0CQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhJpc3N1ZUFydGVmYWN0SW5kZXgJAMwIAgUIaXRlbU5hbWUJAMwIAgUHYWRkcmVzcwkAzAgCAAAFA25pbAUDbmlsAwkAAAIFBWZpcnN0BQVmaXJzdAQGc2Vjb25kCQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhJpc3N1ZUFydGVmYWN0SW5kZXgJAMwIAgUIaXRlbU5hbWUJAMwIAgUHYWRkcmVzcwkAzAgCAAEFA25pbAUDbmlsAwkAAAIFBnNlY29uZAUGc2Vjb25kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yZXN1bHQJAQhhc1N0cmluZwEFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCCF9yZXN1bHQxCQEIYXNTdHJpbmcBBQZzZWNvbmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIFX3dpbjEFA3dpbgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBGNhbGwFBGNhbGwFBGNhbGwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBCQCsAgICNFJGQjogU29tZSBlcnJvciBvY2N1cmVkLCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zISAFA3dpbgMJAAACBQZyZXN1bHQFBnJlc3VsdAQOcmV0dXJuVG9TZW5kZXIDBQZyZXNjdWUJAQ9nZXRSYW5kb21SZXR1cm4CCQDZBAEFBmluaXRUeAULZmluaXNoQmxvY2sHBA1yZXR1cm5QYXlsb2FkAwUOcmV0dXJuVG9TZW5kZXIEB2Fzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIIX2Fzc2V0SWQEBmlzc3VlcgkBCWNoZWNrUmVhbAEFB2Fzc2V0SWQEA2dlbgkBCGFzU3RyaW5nAQkA/AcECQEXZ2V0Q2FuaW5lQnJlZWRlckFkZHJlc3MAAg5nZXRHZW5Gcm9tTmFtZQkAzAgCCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUFA25pbAUDbmlsAwkAAAIFA2dlbgUDZ2VuBARjYWxsCQD8BwQFBmlzc3VlcgIOaW5jcmVhc2VSYXJpdHkJAMwIAgkA2AQBBQdhc3NldElkCQDMCAIFA2dlbgUDbmlsBQNuaWwDCQAAAgUEY2FsbAUEY2FsbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQdhZGRyZXNzAAEFB2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsCQDOCAIJAM4IAgkAzggCBQZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIEX3dpbgUDd2luCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19zdGF0dXMCBmZpbmlzaAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3JhbmRvbQUGcmFuZG9tBQNuaWwFDHZhbGlkUGF5bWVudAUNcmV0dXJuUGF5bG9hZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUBaQEPY29uZmlndXJlT3JhY2xlAQZvcmFjbGUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg9SQ1U6IGFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIUc3RhdGljX29yYWNsZUFkZHJlc3MFBm9yYWNsZQUDbmlsAWkBC2luaXRSZWJpcnRoAAQJcG10Q2FuaW5lCQCRAwIIBQFpCHBheW1lbnRzAAAECHBtdFdhdmVzCQCRAwIIBQFpCHBheW1lbnRzAAEEB2Fzc2V0SWQJAQV2YWx1ZQEIBQlwbXRDYW5pbmUHYXNzZXRJZAQGaW5pdFR4CQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AggFCXBtdENhbmluZQZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQDAwkBAiE9AggFCHBtdFdhdmVzBmFtb3VudAULd2F2ZXNBbW91bnQGCQECIT0CCAUIcG10V2F2ZXMHYXNzZXRJZAUEdW5pdAkAAgECJldhdmVzcGF5bWVudCBpcyBub3QgYXR0YWNoZWQgb3Igd3JvbmchBBBzZW5kVG9BZ2dyZUdhdG9yCQBpAggFCHBtdFdhdmVzBmFtb3VudAAEBAV0b3B1cAkAZQIIBQhwbXRXYXZlcwZhbW91bnQFEHNlbmRUb0FnZ3JlR2F0b3IEB2FkZE1vcmUJAPwHBAkBF2dldENhbmluZVN0YWtpbmdBZGRyZXNzAAIUYWRkV2F2ZXNBbmRTdGFrZU1vcmUFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAUFdG9wdXAFA25pbAMJAAACBQdhZGRNb3JlBQdhZGRNb3JlBAZpc3N1ZXIJAQljaGVja1JlYWwBBQdhc3NldElkBANnZW4JAQhhc1N0cmluZwEJAPwHBAkBF2dldENhbmluZUJyZWVkZXJBZGRyZXNzAAIOZ2V0R2VuRnJvbU5hbWUJAMwIAggJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZARuYW1lBQNuaWwFA25pbAMJAAACBQNnZW4FA2dlbgQEY2FsbAkA/AcEBQZpc3N1ZXICDHJlZHVjZVJhcml0eQkAzAgCCQDYBAEFB2Fzc2V0SWQJAMwIAgUDZ2VuBQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgxfZmluaXNoQmxvY2sJAGQCBQZoZWlnaHQFEGRlbGF5Rm9ySGF0Y2hpbmcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3N0YXR1cwIEb3BlbgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AghfYXNzZXRJZAkA2AQBBQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARBnZXRGZWVBZ2dyZWdhdG9yAAUQc2VuZFRvQWdncmVHYXRvcgUEdW5pdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWZpbmlzaFJlYmlydGgBBmluaXRUeAkBFWZpbmlzaFJlYmlydGhJbnRlcm5hbAYFBmluaXRUeAkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAAcCAAcBaQETZmluaXNoUmViaXJ0aERvdWJsZQEGaW5pdFR4AwkBASEBAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEHCQACAQIPSW52YWxpZCBwYXltZW50BAdhc3NldElkCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEC2Jvb3N0ZXJUeXBlCQEIYXNTdHJpbmcBCQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCCQDYBAEFB2Fzc2V0SWQFA25pbAUDbmlsAwkAAAIFC2Jvb3N0ZXJUeXBlBQtib29zdGVyVHlwZQMJAAACBQtib29zdGVyVHlwZQIOQVJULUdJRlRfRE9VQkwJAM4IAgkAzAgCCQEEQnVybgIFB2Fzc2V0SWQAAQUDbmlsCQEVZmluaXNoUmViaXJ0aEludGVybmFsBgUGaW5pdFR4CQClCAEIBQFpBmNhbGxlcgkAkQMCCAUBaQhwYXltZW50cwABBgIABwkAAgECLUVycm9yISBXcm9uZyBpdGVtIGF0dGFjaGVkIHRvIGRvdWJsZSByZXdhcmRzIQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFmaW5pc2hSZWJpcnRoSXRlbQIGaW5pdFR4CGl0ZW1Db2RlAwMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAIJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBwQHYXNzZXRJZAkBBXZhbHVlAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAtib29zdGVyVHlwZQkBCGFzU3RyaW5nAQkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAMJAAACBQtib29zdGVyVHlwZQULYm9vc3RlclR5cGUDCQAAAgULYm9vc3RlclR5cGUCC0FSVC1IV0VSQVNFCQDOCAIJAMwIAgkBBEJ1cm4CBQdhc3NldElkAAEFA25pbAkBFWZpbmlzaFJlYmlydGhJbnRlcm5hbAYFBmluaXRUeAkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAQcFCGl0ZW1Db2RlBwMJAAACBQtib29zdGVyVHlwZQIMQVJULUhXUkVTQ1VFCQDOCAIJAMwIAgkBBEJ1cm4CBQdhc3NldElkAAEFA25pbAkBFWZpbmlzaFJlYmlydGhJbnRlcm5hbAYFBmluaXRUeAkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAQcCAAYDCQAAAgULYm9vc3RlclR5cGUCDkFSVC1HSUZUX0RPVUJMCQDOCAIJAMwIAgkBBEJ1cm4CBQdhc3NldElkAAEFA25pbAkBFWZpbmlzaFJlYmlydGhJbnRlcm5hbAYFBmluaXRUeAkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAQYCAAcJAAIBAhtFcnJvciEgV3JvbmcgaXRlbSBhdHRhY2hlZCAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQEVZmluaXNoUmViaXJ0aEludGVybmFsBgUGaW5pdFR4CQClCAEIBQFpBmNhbGxlcgkAkQMCCAUBaQhwYXltZW50cwAABwIABwkAAgECEEludmFsaWQgcGF5bWVudHMBAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEgURzk/Wb/EmnS8VoUnzuy4vQ7f8HLaCeiNF5sONdX3W0ECnNlY29uZFVzZXIBIFxyDkuu8SFPZuYZRfpqorHtsTYpWV8ZzMyw4U1BiGp9BAl0aGlyZFVzZXIBIKCvkeUteUNhYTISrY65+hhZUZ0tU0k2w9Cj96hgGTtOBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAACoAr5Vw==", "height": 3367194, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9rEo2Ko8AAZ84wQDg6NR2WCmBk2UvvxmJafFsAfRGvtg Next: 7sNCiVPqP94QYCPtbLXWj45rECzLvTRjr7gf8jk4XrXL Diff:
OldNewDifferences
3838 }
3939
4040
41+func getBool (key) = match getBoolean(this, key) {
42+ case b: Boolean =>
43+ b
44+ case _ =>
45+ false
46+}
47+
48+
4149 func asString (value) = match value {
4250 case s: String =>
4351 s
4856 case _ =>
4957 throw("wrong type, expected: String")
5058 }
59+
60+
61+func isTestEnv () = getBool("TESTENV")
5162
5263
5364 func staticKey_oracleAddress () = "static_oracleAddress"
172183 then $Tuple2(jackpotRandom, "jackpot")
173184 else {
174185 let n = getRandomNumber(1000, tx, finishHeight, 0)
175- let result = if (if ((450 > n))
176- then (blacklistCode != "incubator")
186+ let result = if (if ((200 > n))
187+ then (blacklistCode != "docking_A")
177188 else false)
178- then "incubator"
179- else "trtl_incubator"
189+ then "docking_A"
190+ else if (if ((400 > n))
191+ then (blacklistCode != "docking_B")
192+ else false)
193+ then "docking_B"
194+ else if (if ((600 > n))
195+ then (blacklistCode != "docking_C")
196+ else false)
197+ then "docking_C"
198+ else if (if ((800 > n))
199+ then (blacklistCode != "item!ART-FREEGENE")
200+ else false)
201+ then "item!ART-FREEGENE"
202+ else "item!ART-FIXGENE"
180203 $Tuple2(n, result)
181204 }
182205 }
431454 else throw("Invalid payments")
432455
433456
457+@Verifier(tx)
458+func verify () = if (isTestEnv())
459+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
460+ else {
461+ let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
462+ let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
463+ let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
464+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
465+ then 1
466+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
467+ then 1
468+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
469+ then 1
470+ else 0
471+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
472+ then 1
473+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
474+ then 1
475+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
476+ then 1
477+ else 0
478+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
479+ then 1
480+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
481+ then 1
482+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
483+ then 1
484+ else 0
485+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
486+ match tx {
487+ case _ =>
488+ (signaturesCount >= 2)
489+ }
490+ }
491+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetStringExternal (address,key) = match getString(address, key) {
55 case a: String =>
66 a
77 case _ =>
88 ""
99 }
1010
1111
1212 func tryGetInteger (key) = match getInteger(this, key) {
1313 case b: Int =>
1414 b
1515 case _ =>
1616 0
1717 }
1818
1919
2020 func tryGetString (key) = tryGetStringExternal(this, key)
2121
2222
2323 func asInt (value) = match value {
2424 case int: Int =>
2525 int
2626 case string: String =>
2727 throw(("RAI: wrong type, expected: Int, but got: " + string))
2828 case _ =>
2929 throw("RAI: wrong type, expected: Int")
3030 }
3131
3232
3333 func asBoolean (value) = match value {
3434 case boolean: Boolean =>
3535 boolean
3636 case _ =>
3737 throw("FAB: wrong type, expected: Boolean")
3838 }
3939
4040
41+func getBool (key) = match getBoolean(this, key) {
42+ case b: Boolean =>
43+ b
44+ case _ =>
45+ false
46+}
47+
48+
4149 func asString (value) = match value {
4250 case s: String =>
4351 s
4452 case s: Int =>
4553 throw("wrong type, expected: String, got: Int")
4654 case s: Unit =>
4755 throw("wrong type, expected: String, got: Unit")
4856 case _ =>
4957 throw("wrong type, expected: String")
5058 }
59+
60+
61+func isTestEnv () = getBool("TESTENV")
5162
5263
5364 func staticKey_oracleAddress () = "static_oracleAddress"
5465
5566
5667 func staticKey_extraFee () = "static_extraFee"
5768
5869
5970 func staticKey_feeAggregator () = "static_feeAggregator"
6071
6172
6273 func staticKey_canineIncubatorAddress () = "static_canineIncubatorAddress"
6374
6475
6576 func staticKey_canineBreederAddress () = "static_canineBreederAddress"
6677
6778
6879 func staticKey_couponsAddress () = "static_couponsAddress"
6980
7081
7182 func staticKey_canineStakingAddress () = "static_canineStakingAddress"
7283
7384
7485 func staticKey_duckStakingAddress () = "static_farmingAddressNew"
7586
7687
7788 func staticKey_duckIncubatorAddress () = "static_incubatorAddress"
7889
7990
8091 func staticKey_itemsAddress () = "static_itemsAddress"
8192
8293
8394 func staticKey_canineWavesRebirthPrice () = "static_canineWavesRebirthPrice"
8495
8596
8697 func staticKey_turtleIncubatorAddress () = "static_turtleIncubatorAddress"
8798
8899
89100 func staticKey_babyDuckAddress () = "static_babyDuckAddress"
90101
91102
92103 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
93104
94105
95106 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
96107
97108
98109 func getCanineBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineBreederAddress())))
99110
100111
101112 func getCanineIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineIncubatorAddress())))
102113
103114
104115 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
105116
106117
107118 func getCanineStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineStakingAddress())))
108119
109120
110121 func getDuckStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckStakingAddress())))
111122
112123
113124 func getDuckIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckIncubatorAddress())))
114125
115126
116127 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
117128
118129
119130 func getTurtleIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleIncubatorAddress())))
120131
121132
122133 func getBabyDuckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_babyDuckAddress())))
123134
124135
125136 func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
126137 case b: Int =>
127138 b
128139 case _ =>
129140 throw("TR: Value not found in sc!")
130141 }
131142
132143
133144 let wavesAmount = tryGetIntegerExternal(getOracle(), staticKey_canineWavesRebirthPrice())
134145
135146 let delayForHatching = 2
136147
137148 func checkReal (assetId) = if (if ((value(assetInfo(assetId)).issuer == getCanineBreederAddress()))
138149 then true
139150 else (value(assetInfo(assetId)).issuer == getCanineIncubatorAddress()))
140151 then value(assetInfo(assetId)).issuer
141152 else throw("not valid NFT")
142153
143154
144155 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
145156 then throw("RCAP: Please attach waves")
146157 else {
147158 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
148159 if ((payment.amount != feeAmount))
149160 then throw((("RCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
150161 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
151162 }
152163
153164
154165 func getRandomNumber (options,txId,hatchingFinishHeight,offset) = {
155166 let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
156167 let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
157168 (toInt(randomHash, (offset * 8)) % options)
158169 }
159170
160171
161172 func tryGetBoolean (key) = match getBoolean(key) {
162173 case b: Boolean =>
163174 b
164175 case _ =>
165176 false
166177 }
167178
168179
169180 func getRandomWin (tx,finishHeight,blacklistCode) = {
170181 let jackpotRandom = getRandomNumber(200, tx, finishHeight, 1)
171182 if ((jackpotRandom == 1))
172183 then $Tuple2(jackpotRandom, "jackpot")
173184 else {
174185 let n = getRandomNumber(1000, tx, finishHeight, 0)
175- let result = if (if ((450 > n))
176- then (blacklistCode != "incubator")
186+ let result = if (if ((200 > n))
187+ then (blacklistCode != "docking_A")
177188 else false)
178- then "incubator"
179- else "trtl_incubator"
189+ then "docking_A"
190+ else if (if ((400 > n))
191+ then (blacklistCode != "docking_B")
192+ else false)
193+ then "docking_B"
194+ else if (if ((600 > n))
195+ then (blacklistCode != "docking_C")
196+ else false)
197+ then "docking_C"
198+ else if (if ((800 > n))
199+ then (blacklistCode != "item!ART-FREEGENE")
200+ else false)
201+ then "item!ART-FREEGENE"
202+ else "item!ART-FIXGENE"
180203 $Tuple2(n, result)
181204 }
182205 }
183206
184207
185208 func getRandomReturn (tx,finishHeight) = {
186209 let n = getRandomNumber(2, tx, finishHeight, 1)
187210 if ((n == 0))
188211 then true
189212 else false
190213 }
191214
192215
193216 func finishRebirthInternal (initTx,address,additionalPayment,double,blacklistCode,rescue) = {
194217 let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
195218 let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
196219 let validPayment = checkAdditionalPayment(additionalPayment)
197220 if ((validPayment == validPayment))
198221 then if ((status != "open"))
199222 then throw("rebirth is finished or not open")
200223 else if ((finishBlock > height))
201224 then throw("you cannot finish rebirth, yet")
202225 else {
203226 let output = getRandomWin(fromBase58String(initTx), finishBlock, blacklistCode)
204227 let win = output._2
205228 let random = output._1
206229 let txId = initTx
207230 let result = if ((indexOf(win, "docking") != unit))
208231 then {
209232 let color = takeRight(win, 1)
210233 let call = if (!(double))
211234 then {
212235 let first = invoke(getCanineStakingAddress(), "addFreePerch", [address, color, 1], nil)
213236 if ((first == first))
214237 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
215238 else throw("Strict value is not equal to itself.")
216239 }
217240 else {
218241 let first = invoke(getCanineStakingAddress(), "addFreePerch", [address, color, 2], nil)
219242 if ((first == first))
220243 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
221244 else throw("Strict value is not equal to itself.")
222245 }
223246 if ((call == call))
224247 then call
225248 else throw("Strict value is not equal to itself.")
226249 }
227250 else if ((win == "jackpot"))
228251 then {
229252 let call = invoke(getCanineIncubatorAddress(), "issueJackpot", [address, txId, "WWWWHWTF"], nil)
230253 if ((call == call))
231254 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
232255 else throw("Strict value is not equal to itself.")
233256 }
234257 else if ((win == "incubator"))
235258 then {
236259 let call = if (!(double))
237260 then {
238261 let first = invoke(getCanineIncubatorAddress(), "issueFree", [address, txId], nil)
239262 if ((first == first))
240263 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
241264 else throw("Strict value is not equal to itself.")
242265 }
243266 else {
244267 let first = invoke(getCanineIncubatorAddress(), "issueFree", [address, txId], nil)
245268 if ((first == first))
246269 then {
247270 let second = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
248271 if ((second == second))
249272 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), "incubator")]
250273 else throw("Strict value is not equal to itself.")
251274 }
252275 else throw("Strict value is not equal to itself.")
253276 }
254277 if ((call == call))
255278 then call
256279 else throw("Strict value is not equal to itself.")
257280 }
258281 else if ((indexOf(win, "duckling") != unit))
259282 then {
260283 let level = parseIntValue(split(win, "_")[1])
261284 let levelFinal = if (double)
262285 then (2 * level)
263286 else level
264287 let call = invoke(getBabyDuckAddress(), "issueFreeDuckling", [address, txId, levelFinal], nil)
265288 if ((call == call))
266289 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
267290 else throw("Strict value is not equal to itself.")
268291 }
269292 else if ((win == "trtl_incubator"))
270293 then {
271294 let call = if (!(double))
272295 then {
273296 let first = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
274297 if ((first == first))
275298 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
276299 else throw("Strict value is not equal to itself.")
277300 }
278301 else {
279302 let first = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
280303 if ((first == first))
281304 then {
282305 let second = invoke(getCanineIncubatorAddress(), "issueFree", [address, txId], nil)
283306 if ((second == second))
284307 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), "trtl_incubator")]
285308 else throw("Strict value is not equal to itself.")
286309 }
287310 else throw("Strict value is not equal to itself.")
288311 }
289312 if ((call == call))
290313 then call
291314 else throw("Strict value is not equal to itself.")
292315 }
293316 else if ((indexOf(win, "item") != unit))
294317 then {
295318 let itemName = split(win, "!")[1]
296319 let call = if (!(double))
297320 then {
298321 let first = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 0], nil)
299322 if ((first == first))
300323 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
301324 else throw("Strict value is not equal to itself.")
302325 }
303326 else {
304327 let first = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 0], nil)
305328 if ((first == first))
306329 then {
307330 let second = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 1], nil)
308331 if ((second == second))
309332 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
310333 else throw("Strict value is not equal to itself.")
311334 }
312335 else throw("Strict value is not equal to itself.")
313336 }
314337 if ((call == call))
315338 then call
316339 else throw("Strict value is not equal to itself.")
317340 }
318341 else throw(("RFB: Some error occured, please contact the admins! " + win))
319342 if ((result == result))
320343 then {
321344 let returnToSender = if (rescue)
322345 then getRandomReturn(fromBase58String(initTx), finishBlock)
323346 else false
324347 let returnPayload = if (returnToSender)
325348 then {
326349 let assetId = fromBase58String(getStringValue((((("address_" + address) + "_initTx_") + initTx) + "_assetId")))
327350 let issuer = checkReal(assetId)
328351 let gen = asString(invoke(getCanineBreederAddress(), "getGenFromName", [value(assetInfo(assetId)).name], nil))
329352 if ((gen == gen))
330353 then {
331354 let call = invoke(issuer, "increaseRarity", [toBase58String(assetId), gen], nil)
332355 if ((call == call))
333356 then [ScriptTransfer(addressFromStringValue(address), 1, assetId)]
334357 else throw("Strict value is not equal to itself.")
335358 }
336359 else throw("Strict value is not equal to itself.")
337360 }
338361 else nil
339362 (((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish"), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_random"), random)]) ++ validPayment) ++ returnPayload)
340363 }
341364 else throw("Strict value is not equal to itself.")
342365 }
343366 else throw("Strict value is not equal to itself.")
344367 }
345368
346369
347370 @Callable(i)
348371 func configureOracle (oracle) = if ((i.caller != this))
349372 then throw("RCU: admin only")
350373 else [StringEntry("static_oracleAddress", oracle)]
351374
352375
353376
354377 @Callable(i)
355378 func initRebirth () = {
356379 let pmtCanine = i.payments[0]
357380 let pmtWaves = i.payments[1]
358381 let assetId = value(pmtCanine.assetId)
359382 let initTx = toBase58String(i.transactionId)
360383 let address = toString(i.caller)
361384 if ((pmtCanine.amount != 1))
362385 then throw("NFT is not attached")
363386 else if (if ((pmtWaves.amount != wavesAmount))
364387 then true
365388 else (pmtWaves.assetId != unit))
366389 then throw("Wavespayment is not attached or wrong!")
367390 else {
368391 let sendToAggreGator = (pmtWaves.amount / 4)
369392 let topup = (pmtWaves.amount - sendToAggreGator)
370393 let addMore = invoke(getCanineStakingAddress(), "addWavesAndStakeMore", nil, [AttachedPayment(unit, topup)])
371394 if ((addMore == addMore))
372395 then {
373396 let issuer = checkReal(assetId)
374397 let gen = asString(invoke(getCanineBreederAddress(), "getGenFromName", [value(assetInfo(assetId)).name], nil))
375398 if ((gen == gen))
376399 then {
377400 let call = invoke(issuer, "reduceRarity", [toBase58String(assetId), gen], nil)
378401 if ((call == call))
379402 then [IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"), (height + delayForHatching)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "open"), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetId"), toBase58String(assetId)), ScriptTransfer(getFeeAggregator(), sendToAggreGator, unit)]
380403 else throw("Strict value is not equal to itself.")
381404 }
382405 else throw("Strict value is not equal to itself.")
383406 }
384407 else throw("Strict value is not equal to itself.")
385408 }
386409 }
387410
388411
389412
390413 @Callable(i)
391414 func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
392415
393416
394417
395418 @Callable(i)
396419 func finishRebirthDouble (initTx) = if (!(if ((size(i.payments) == 2))
397420 then (i.payments[0].amount == 1)
398421 else false))
399422 then throw("Invalid payment")
400423 else {
401424 let assetId = value(i.payments[0].assetId)
402425 let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
403426 if ((boosterType == boosterType))
404427 then if ((boosterType == "ART-GIFT_DOUBL"))
405428 then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
406429 else throw("Error! Wrong item attached to double rewards!")
407430 else throw("Strict value is not equal to itself.")
408431 }
409432
410433
411434
412435 @Callable(i)
413436 func finishRebirthItem (initTx,itemCode) = if (if ((size(i.payments) == 2))
414437 then (i.payments[0].amount == 1)
415438 else false)
416439 then {
417440 let assetId = value(i.payments[0].assetId)
418441 let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
419442 if ((boosterType == boosterType))
420443 then if ((boosterType == "ART-HWERASE"))
421444 then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, itemCode, false))
422445 else if ((boosterType == "ART-HWRESCUE"))
423446 then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, "", true))
424447 else if ((boosterType == "ART-GIFT_DOUBL"))
425448 then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
426449 else throw("Error! Wrong item attached ")
427450 else throw("Strict value is not equal to itself.")
428451 }
429452 else if ((size(i.payments) == 1))
430453 then finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
431454 else throw("Invalid payments")
432455
433456
457+@Verifier(tx)
458+func verify () = if (isTestEnv())
459+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
460+ else {
461+ let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
462+ let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
463+ let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
464+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
465+ then 1
466+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
467+ then 1
468+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
469+ then 1
470+ else 0
471+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
472+ then 1
473+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
474+ then 1
475+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
476+ then 1
477+ else 0
478+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
479+ then 1
480+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
481+ then 1
482+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
483+ then 1
484+ else 0
485+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
486+ match tx {
487+ case _ =>
488+ (signaturesCount >= 2)
489+ }
490+ }
491+

github/deemru/w8io/026f985 
63.02 ms