tx · 6w7kPmwghUQfiAokjPdMEy6WYXhBL7ZvVj8H8LLx1wpS

3MtrXLq2YFHNLqTBXr488vaQVQpsHdmbg7C:  -0.01900000 Waves

2024.11.01 19:26 [3352698] smart account 3MtrXLq2YFHNLqTBXr488vaQVQpsHdmbg7C > SELF 0.00000000 Waves

{ "type": 13, "id": "6w7kPmwghUQfiAokjPdMEy6WYXhBL7ZvVj8H8LLx1wpS", "fee": 1900000, "feeAssetId": null, "timestamp": 1730478406186, "version": 2, "chainId": 84, "sender": "3MtrXLq2YFHNLqTBXr488vaQVQpsHdmbg7C", "senderPublicKey": "ESRi59hjHAnDxmeFyTaaXNvzeEW323BvzYJYyKjpEsC1", "proofs": [ "2uxhSYv6d2uPxcirbkUwbkmXhzZQBzaSqNWELr3SCr73Gda9dgXUF6Zazz9WCKXzxuKrF6XWJwiJdoo6KCh6kV8u" ], "script": "base64:BgIZCAISAwoBCBIAEgMKAQgSAwoBCBIECgIICCgBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBBWFzSW50AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAFA2ludAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAkAAgEJAKwCAgIpUkFJOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50LCBidXQgZ290OiAFBnN0cmluZwkAAgECHlJBSTogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAEJYXNCb29sZWFuAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQHYm9vbGVhbgUHJG1hdGNoMAUHYm9vbGVhbgkAAgECIkZBQjogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEJvb2xlYW4BCGFzU3RyaW5nAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzAwkAAQIFByRtYXRjaDACA0ludAQBcwUHJG1hdGNoMAkAAgECJndyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcsIGdvdDogSW50AwkAAQIFByRtYXRjaDACBFVuaXQEAXMFByRtYXRjaDAJAAIBAid3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nLCBnb3Q6IFVuaXQJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwACFHN0YXRpY19vcmFjbGVBZGRyZXNzARJzdGF0aWNLZXlfZXh0cmFGZWUAAg9zdGF0aWNfZXh0cmFGZWUBF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAIUc3RhdGljX2ZlZUFnZ3JlZ2F0b3IBIHN0YXRpY0tleV9jYW5pbmVJbmN1YmF0b3JBZGRyZXNzAAIdc3RhdGljX2NhbmluZUluY3ViYXRvckFkZHJlc3MBHnN0YXRpY0tleV9jYW5pbmVCcmVlZGVyQWRkcmVzcwACG3N0YXRpY19jYW5pbmVCcmVlZGVyQWRkcmVzcwEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAIVc3RhdGljX2NvdXBvbnNBZGRyZXNzAR5zdGF0aWNLZXlfY2FuaW5lU3Rha2luZ0FkZHJlc3MAAhtzdGF0aWNfY2FuaW5lU3Rha2luZ0FkZHJlc3MBHHN0YXRpY0tleV9kdWNrU3Rha2luZ0FkZHJlc3MAAhhzdGF0aWNfZmFybWluZ0FkZHJlc3NOZXcBHnN0YXRpY0tleV9kdWNrSW5jdWJhdG9yQWRkcmVzcwACF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzARZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAITc3RhdGljX2l0ZW1zQWRkcmVzcwEhc3RhdGljS2V5X2NhbmluZVdhdmVzUmViaXJ0aFByaWNlAAIec3RhdGljX2NhbmluZVdhdmVzUmViaXJ0aFByaWNlASBzdGF0aWNLZXlfdHVydGxlSW5jdWJhdG9yQWRkcmVzcwACHXN0YXRpY190dXJ0bGVJbmN1YmF0b3JBZGRyZXNzARlzdGF0aWNLZXlfYmFieUR1Y2tBZGRyZXNzAAIWc3RhdGljX2JhYnlEdWNrQWRkcmVzcwEJZ2V0T3JhY2xlAAkBB0FkZHJlc3MBCQDZBAEJAQx0cnlHZXRTdHJpbmcBCQEXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAARBnZXRGZWVBZ2dyZWdhdG9yAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAARdnZXRDYW5pbmVCcmVlZGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV9jYW5pbmVCcmVlZGVyQWRkcmVzcwABGWdldENhbmluZUluY3ViYXRvckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJASBzdGF0aWNLZXlfY2FuaW5lSW5jdWJhdG9yQWRkcmVzcwABEWdldENvdXBvbnNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAEXZ2V0Q2FuaW5lU3Rha2luZ0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJAR5zdGF0aWNLZXlfY2FuaW5lU3Rha2luZ0FkZHJlc3MAARVnZXREdWNrU3Rha2luZ0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARxzdGF0aWNLZXlfZHVja1N0YWtpbmdBZGRyZXNzAAEXZ2V0RHVja0luY3ViYXRvckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJAR5zdGF0aWNLZXlfZHVja0luY3ViYXRvckFkZHJlc3MAAQ9nZXRJdGVtc0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAEZZ2V0VHVydGxlSW5jdWJhdG9yQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBIHN0YXRpY0tleV90dXJ0bGVJbmN1YmF0b3JBZGRyZXNzAAESZ2V0QmFieUR1Y2tBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEZc3RhdGljS2V5X2JhYnlEdWNrQWRkcmVzcwABFXRyeUdldEludGVnZXJFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJoIAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgkAAgECGlRSOiBWYWx1ZSBub3QgZm91bmQgaW4gc2MhAAt3YXZlc0Ftb3VudAkBFXRyeUdldEludGVnZXJFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEhc3RhdGljS2V5X2NhbmluZVdhdmVzUmViaXJ0aFByaWNlAAAQZGVsYXlGb3JIYXRjaGluZwACAQljaGVja1JlYWwBB2Fzc2V0SWQDAwkAAAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQEXZ2V0Q2FuaW5lQnJlZWRlckFkZHJlc3MABgkAAAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQEZZ2V0Q2FuaW5lSW5jdWJhdG9yQWRkcmVzcwAICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQACAQINbm90IHZhbGlkIE5GVAEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZUkNBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxSQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsAQ9nZXRSYW5kb21OdW1iZXIEB29wdGlvbnMEdHhJZBRoYXRjaGluZ0ZpbmlzaEhlaWdodAZvZmZzZXQED3JhbmRvbVNlZWRCbG9jawkBBXZhbHVlAQkA7QcBCQBlAgUUaGF0Y2hpbmdGaW5pc2hIZWlnaHQAAQQKcmFuZG9tSGFzaAkA9wMBCQDLAQIFBHR4SWQJAQV2YWx1ZQEIBQ9yYW5kb21TZWVkQmxvY2sDdnJmCQBqAgkAsgkCBQpyYW5kb21IYXNoCQBoAgUGb2Zmc2V0AAgFB29wdGlvbnMBDXRyeUdldEJvb2xlYW4BA2tleQQHJG1hdGNoMAkAoAgBBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBDGdldFJhbmRvbVdpbgMCdHgMZmluaXNoSGVpZ2h0DWJsYWNrbGlzdENvZGUEDWphY2twb3RSYW5kb20JAQ9nZXRSYW5kb21OdW1iZXIEAAoFAnR4BQxmaW5pc2hIZWlnaHQAAQMJAAACBQ1qYWNrcG90UmFuZG9tAAEJAJQKAgUNamFja3BvdFJhbmRvbQIHamFja3BvdAQBbgkBD2dldFJhbmRvbU51bWJlcgQA6AcFAnR4BQxmaW5pc2hIZWlnaHQAAAQGcmVzdWx0AwMJAGYCAGQFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCCWRvY2tpbmdfQQcCCWRvY2tpbmdfQQMDCQBmAgDIAQUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIJZG9ja2luZ19CBwIJZG9ja2luZ19CAwMJAGYCAKwCBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAglkb2NraW5nX0MHAglkb2NraW5nX0MDAwkAZgIAkAMFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCCWRvY2tpbmdfRAcCCWRvY2tpbmdfRAMDCQBmAgDCAwUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIJaW5jdWJhdG9yBwIJaW5jdWJhdG9yAwMJAGYCAOoDBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAgtkdWNrbGluZ180MAcCC2R1Y2tsaW5nXzQwAwMJAGYCAJwEBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAgtkdWNrbGluZ18yMAcCC2R1Y2tsaW5nXzIwAwMJAGYCAIAFBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAg5pdGVtIUFSVC1GRUVENQcCDml0ZW0hQVJULUZFRUQ1AwMJAGYCAMYFBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAg9pdGVtIUFSVC1GRUVEMTAHAg9pdGVtIUFSVC1GRUVEMTADAwkAZgIA5AUFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCD2l0ZW0hQVJULUZFRUQxNQcCD2l0ZW0hQVJULUZFRUQxNQMDCQBmAgCCBgUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIPaXRlbSFBUlQtRkVFRDIwBwIPaXRlbSFBUlQtRkVFRDIwAwMJAGYCAJYGBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAg9pdGVtIUFSVC1GRUVEMjUHAg9pdGVtIUFSVC1GRUVEMjUDAwkAZgIAqgYFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCD2l0ZW0hQVJULUZFRUQ1MAcCD2l0ZW0hQVJULUZFRUQ1MAMDCQBmAgC+BgUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIQaXRlbSFBUlQtRkVFRDEwMAcCEGl0ZW0hQVJULUZFRUQxMDADAwkAZgIA3AYFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCE2l0ZW0hQVJULU1VVEFSSVVNLUcHAhNpdGVtIUFSVC1NVVRBUklVTS1HAwMJAGYCAPoGBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAhNpdGVtIUFSVC1NVVRBUklVTS1EBwITaXRlbSFBUlQtTVVUQVJJVU0tRAMDCQBmAgCOBwUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIRaXRlbSFBUlQtRlJFRUdFTkUHAhFpdGVtIUFSVC1GUkVFR0VORQMDCQBmAgCiBwUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIQaXRlbSFBUlQtRklYR0VORQcCEGl0ZW0hQVJULUZJWEdFTkUDAwkAZgIA1AcFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCDnRydGxfaW5jdWJhdG9yBwIOdHJ0bF9pbmN1YmF0b3ICD2l0ZW0hQVJULVBPVElPTgkAlAoCBQFuBQZyZXN1bHQBD2dldFJhbmRvbVJldHVybgICdHgMZmluaXNoSGVpZ2h0BAFuCQEPZ2V0UmFuZG9tTnVtYmVyBAACBQJ0eAUMZmluaXNoSGVpZ2h0AAEDCQAAAgUBbgAABgcBFWZpbmlzaFJlYmlydGhJbnRlcm5hbAYGaW5pdFR4B2FkZHJlc3MRYWRkaXRpb25hbFBheW1lbnQGZG91YmxlDWJsYWNrbGlzdENvZGUGcmVzY3VlBAtmaW5pc2hCbG9jawkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgxfZmluaXNoQmxvY2sEBnN0YXR1cwkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19zdGF0dXMEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBBRFhZGRpdGlvbmFsUGF5bWVudAMJAAACBQx2YWxpZFBheW1lbnQFDHZhbGlkUGF5bWVudAMJAQIhPQIFBnN0YXR1cwIEb3BlbgkAAgECH3JlYmlydGggaXMgZmluaXNoZWQgb3Igbm90IG9wZW4DCQBmAgULZmluaXNoQmxvY2sFBmhlaWdodAkAAgECHnlvdSBjYW5ub3QgZmluaXNoIHJlYmlydGgsIHlldAQGb3V0cHV0CQEMZ2V0UmFuZG9tV2luAwkA2QQBBQZpbml0VHgFC2ZpbmlzaEJsb2NrBQ1ibGFja2xpc3RDb2RlBAN3aW4IBQZvdXRwdXQCXzIEBnJhbmRvbQgFBm91dHB1dAJfMQQEdHhJZAUGaW5pdFR4BAZyZXN1bHQDCQECIT0CCQCzCQIFA3dpbgIHZG9ja2luZwUEdW5pdAQFY29sb3IJALICAgUDd2luAAEEBGNhbGwDCQEBIQEFBmRvdWJsZQQFZmlyc3QJAPwHBAkBF2dldENhbmluZVN0YWtpbmdBZGRyZXNzAAIMYWRkRnJlZVBlcmNoCQDMCAIFB2FkZHJlc3MJAMwIAgUFY29sb3IJAMwIAgABBQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQFZmlyc3QJAPwHBAkBF2dldENhbmluZVN0YWtpbmdBZGRyZXNzAAIMYWRkRnJlZVBlcmNoCQDMCAIFB2FkZHJlc3MJAMwIAgUFY29sb3IJAMwIAgACBQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIIX3Jlc3VsdDEJAQhhc1N0cmluZwEFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCBV93aW4xBQN3aW4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQRjYWxsBQRjYWxsBQRjYWxsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFA3dpbgIHamFja3BvdAQEY2FsbAkA/AcECQEZZ2V0Q2FuaW5lSW5jdWJhdG9yQWRkcmVzcwACDGlzc3VlSmFja3BvdAkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQJAMwIAgIIV1dXV0hXVEYFA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUEY2FsbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFA3dpbgIJaW5jdWJhdG9yBARjYWxsAwkBASEBBQZkb3VibGUEBWZpcnN0CQD8BwQJARlnZXRDYW5pbmVJbmN1YmF0b3JBZGRyZXNzAAIJaXNzdWVGcmVlCQDMCAIFB2FkZHJlc3MJAMwIAgUEdHhJZAUDbmlsBQNuaWwDCQAAAgUFZmlyc3QFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yZXN1bHQJAQhhc1N0cmluZwEFBWZpcnN0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBWZpcnN0CQD8BwQJARlnZXRDYW5pbmVJbmN1YmF0b3JBZGRyZXNzAAIJaXNzdWVGcmVlCQDMCAIFB2FkZHJlc3MJAMwIAgUEdHhJZAUDbmlsBQNuaWwDCQAAAgUFZmlyc3QFBWZpcnN0BAZzZWNvbmQJAPwHBAkBGWdldFR1cnRsZUluY3ViYXRvckFkZHJlc3MAAg9pc3N1ZUZyZWVUdXJ0bGUJAMwIAgUHYWRkcmVzcwkAzAgCBQR0eElkBQNuaWwFA25pbAMJAAACBQZzZWNvbmQFBnNlY29uZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AghfcmVzdWx0MQkBCGFzU3RyaW5nAQUGc2Vjb25kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCBV93aW4xAglpbmN1YmF0b3IFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQRjYWxsBQRjYWxsBQRjYWxsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkBAiE9AgkAswkCBQN3aW4CCGR1Y2tsaW5nBQR1bml0BAVsZXZlbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgUDd2luAgFfAAEECmxldmVsRmluYWwDBQZkb3VibGUJAGgCAAIFBWxldmVsBQVsZXZlbAQEY2FsbAkA/AcECQESZ2V0QmFieUR1Y2tBZGRyZXNzAAIRaXNzdWVGcmVlRHVja2xpbmcJAMwIAgUHYWRkcmVzcwkAzAgCBQR0eElkCQDMCAIFCmxldmVsRmluYWwFA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUEY2FsbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFA3dpbgIOdHJ0bF9pbmN1YmF0b3IEBGNhbGwDCQEBIQEFBmRvdWJsZQQFZmlyc3QJAPwHBAkBGWdldFR1cnRsZUluY3ViYXRvckFkZHJlc3MAAg9pc3N1ZUZyZWVUdXJ0bGUJAMwIAgUHYWRkcmVzcwkAzAgCBQR0eElkBQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQFZmlyc3QJAPwHBAkBGWdldFR1cnRsZUluY3ViYXRvckFkZHJlc3MAAg9pc3N1ZUZyZWVUdXJ0bGUJAMwIAgUHYWRkcmVzcwkAzAgCBQR0eElkBQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QEBnNlY29uZAkA/AcECQEZZ2V0Q2FuaW5lSW5jdWJhdG9yQWRkcmVzcwACCWlzc3VlRnJlZQkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQFA25pbAUDbmlsAwkAAAIFBnNlY29uZAUGc2Vjb25kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yZXN1bHQJAQhhc1N0cmluZwEFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCCF9yZXN1bHQxCQEIYXNTdHJpbmcBBQZzZWNvbmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIFX3dpbjECDnRydGxfaW5jdWJhdG9yBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUEY2FsbAUEY2FsbAUEY2FsbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAQIhPQIJALMJAgUDd2luAgRpdGVtBQR1bml0BAhpdGVtTmFtZQkAkQMCCQC1CQIFA3dpbgIBIQABBARjYWxsAwkBASEBBQZkb3VibGUEBWZpcnN0CQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhJpc3N1ZUFydGVmYWN0SW5kZXgJAMwIAgUIaXRlbU5hbWUJAMwIAgUHYWRkcmVzcwkAzAgCAAAFA25pbAUDbmlsAwkAAAIFBWZpcnN0BQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQVmaXJzdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAVmaXJzdAkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAISaXNzdWVBcnRlZmFjdEluZGV4CQDMCAIFCGl0ZW1OYW1lCQDMCAIFB2FkZHJlc3MJAMwIAgAABQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QEBnNlY29uZAkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAISaXNzdWVBcnRlZmFjdEluZGV4CQDMCAIFCGl0ZW1OYW1lCQDMCAIFB2FkZHJlc3MJAMwIAgABBQNuaWwFA25pbAMJAAACBQZzZWNvbmQFBnNlY29uZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AghfcmVzdWx0MQkBCGFzU3RyaW5nAQUGc2Vjb25kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCBV93aW4xBQN3aW4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQRjYWxsBQRjYWxsBQRjYWxsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQkArAICAjRSRkI6IFNvbWUgZXJyb3Igb2NjdXJlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIGFkbWlucyEgBQN3aW4DCQAAAgUGcmVzdWx0BQZyZXN1bHQEDnJldHVyblRvU2VuZGVyAwUGcmVzY3VlCQEPZ2V0UmFuZG9tUmV0dXJuAgkA2QQBBQZpbml0VHgFC2ZpbmlzaEJsb2NrBwQNcmV0dXJuUGF5bG9hZAMFDnJldHVyblRvU2VuZGVyBAdhc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCCF9hc3NldElkBAZpc3N1ZXIJAQljaGVja1JlYWwBBQdhc3NldElkBANnZW4JAQhhc1N0cmluZwEJAPwHBAkBF2dldENhbmluZUJyZWVkZXJBZGRyZXNzAAIOZ2V0R2VuRnJvbU5hbWUJAMwIAggJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZARuYW1lBQNuaWwFA25pbAMJAAACBQNnZW4FA2dlbgQEY2FsbAkA/AcEBQZpc3N1ZXICDmluY3JlYXNlUmFyaXR5CQDMCAIJANgEAQUHYXNzZXRJZAkAzAgCBQNnZW4FA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUHYWRkcmVzcwABBQdhc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAzggCCQDOCAIJAM4IAgUGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCBF93aW4FA3dpbgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4Agdfc3RhdHVzAgZmaW5pc2gJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yYW5kb20FBnJhbmRvbQUDbmlsBQx2YWxpZFBheW1lbnQFDXJldHVyblBheWxvYWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FAWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIPUkNVOiBhZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQICFHN0YXRpY19vcmFjbGVBZGRyZXNzBQZvcmFjbGUFA25pbAFpAQtpbml0UmViaXJ0aAAECXBtdENhbmluZQkAkQMCCAUBaQhwYXltZW50cwAABAhwbXRXYXZlcwkAkQMCCAUBaQhwYXltZW50cwABBAdhc3NldElkCQEFdmFsdWUBCAUJcG10Q2FuaW5lB2Fzc2V0SWQEBmluaXRUeAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIIBQlwbXRDYW5pbmUGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkAwMJAQIhPQIIBQhwbXRXYXZlcwZhbW91bnQFC3dhdmVzQW1vdW50BgkBAiE9AggFCHBtdFdhdmVzB2Fzc2V0SWQFBHVuaXQJAAIBAiZXYXZlc3BheW1lbnQgaXMgbm90IGF0dGFjaGVkIG9yIHdyb25nIQQQc2VuZFRvQWdncmVHYXRvcgkAaQIIBQhwbXRXYXZlcwZhbW91bnQABAQFdG9wdXAJAGUCCAUIcG10V2F2ZXMGYW1vdW50BRBzZW5kVG9BZ2dyZUdhdG9yBAdhZGRNb3JlCQD8BwQJARdnZXRDYW5pbmVTdGFraW5nQWRkcmVzcwACFGFkZFdhdmVzQW5kU3Rha2VNb3JlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFBXRvcHVwBQNuaWwDCQAAAgUHYWRkTW9yZQUHYWRkTW9yZQQGaXNzdWVyCQEJY2hlY2tSZWFsAQUHYXNzZXRJZAQDZ2VuCQEIYXNTdHJpbmcBCQD8BwQJARdnZXRDYW5pbmVCcmVlZGVyQWRkcmVzcwACDmdldEdlbkZyb21OYW1lCQDMCAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEbmFtZQUDbmlsBQNuaWwDCQAAAgUDZ2VuBQNnZW4EBGNhbGwJAPwHBAUGaXNzdWVyAgxyZWR1Y2VSYXJpdHkJAMwIAgkA2AQBBQdhc3NldElkCQDMCAIFA2dlbgUDbmlsBQNuaWwDCQAAAgUEY2FsbAUEY2FsbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIMX2ZpbmlzaEJsb2NrCQBkAgUGaGVpZ2h0BRBkZWxheUZvckhhdGNoaW5nCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19zdGF0dXMCBG9wZW4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIIX2Fzc2V0SWQJANgEAQUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFEHNlbmRUb0FnZ3JlR2F0b3IFBHVuaXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1maW5pc2hSZWJpcnRoAQZpbml0VHgJARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAAHAgAHAWkBE2ZpbmlzaFJlYmlydGhEb3VibGUBBmluaXRUeAMJAQEhAQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAIJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBwkAAgECD0ludmFsaWQgcGF5bWVudAQHYXNzZXRJZAkBBXZhbHVlAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAtib29zdGVyVHlwZQkBCGFzU3RyaW5nAQkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAMJAAACBQtib29zdGVyVHlwZQULYm9vc3RlclR5cGUDCQAAAgULYm9vc3RlclR5cGUCDkFSVC1HSUZUX0RPVUJMCQDOCAIJAMwIAgkBBEJ1cm4CBQdhc3NldElkAAEFA25pbAkBFWZpbmlzaFJlYmlydGhJbnRlcm5hbAYFBmluaXRUeAkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAQYCAAcJAAIBAi1FcnJvciEgV3JvbmcgaXRlbSBhdHRhY2hlZCB0byBkb3VibGUgcmV3YXJkcyEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERZmluaXNoUmViaXJ0aEl0ZW0CBmluaXRUeAhpdGVtQ29kZQMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwACCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAQcEB2Fzc2V0SWQJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLYm9vc3RlclR5cGUJAQhhc1N0cmluZwEJAPwHBAkBD2dldEl0ZW1zQWRkcmVzcwACFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQUHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgULYm9vc3RlclR5cGUFC2Jvb3N0ZXJUeXBlAwkAAAIFC2Jvb3N0ZXJUeXBlAgtBUlQtSFdFUkFTRQkAzggCCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAABBQNuaWwJARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAEHBQhpdGVtQ29kZQcDCQAAAgULYm9vc3RlclR5cGUCDEFSVC1IV1JFU0NVRQkAzggCCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAABBQNuaWwJARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAEHAgAGAwkAAAIFC2Jvb3N0ZXJUeXBlAg5BUlQtR0lGVF9ET1VCTAkAzggCCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAABBQNuaWwJARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAEGAgAHCQACAQIbRXJyb3IhIFdyb25nIGl0ZW0gYXR0YWNoZWQgCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkBFWZpbmlzaFJlYmlydGhJbnRlcm5hbAYFBmluaXRUeAkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAAcCAAcJAAIBAhBJbnZhbGlkIHBheW1lbnRzAOaHkxM=", "height": 3352698, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8tReXEkgoPmYk4dj1gjY7SYjJ2WHiS2G4u1q5TKhPmb8 Next: J9CmVtYm7QjFW5Tnz4MNjZKDEwxYuWCY1hp23peWuaeT Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func getBool (key) = match getBoolean(this, key) {
5- case b: Boolean =>
6- b
7- case _ =>
8- false
9-}
10-
11-
12-func isTestEnv () = getBool("TESTENV")
13-
14-
154 func tryGetStringExternal (address,key) = match getString(address, key) {
165 case a: String =>
176 a
209 }
2110
2211
12+func tryGetInteger (key) = match getInteger(this, key) {
13+ case b: Int =>
14+ b
15+ case _ =>
16+ 0
17+}
18+
19+
2320 func tryGetString (key) = tryGetStringExternal(this, key)
21+
22+
23+func asInt (value) = match value {
24+ case int: Int =>
25+ int
26+ case string: String =>
27+ throw(("RAI: wrong type, expected: Int, but got: " + string))
28+ case _ =>
29+ throw("RAI: wrong type, expected: Int")
30+}
31+
32+
33+func asBoolean (value) = match value {
34+ case boolean: Boolean =>
35+ boolean
36+ case _ =>
37+ throw("FAB: wrong type, expected: Boolean")
38+}
39+
40+
41+func asString (value) = match value {
42+ case s: String =>
43+ s
44+ case s: Int =>
45+ throw("wrong type, expected: String, got: Int")
46+ case s: Unit =>
47+ throw("wrong type, expected: String, got: Unit")
48+ case _ =>
49+ throw("wrong type, expected: String")
50+}
2451
2552
2653 func staticKey_oracleAddress () = "static_oracleAddress"
3259 func staticKey_feeAggregator () = "static_feeAggregator"
3360
3461
35-func staticKey_refContractAddress () = "static_refContractAddress"
62+func staticKey_canineIncubatorAddress () = "static_canineIncubatorAddress"
3663
3764
38-func staticKey_caniRebirthAddress () = "static_canineRebirthAddress"
65+func staticKey_canineBreederAddress () = "static_canineBreederAddress"
3966
4067
41-func staticKey_caniFarmingAddress () = "static_canineStakingAddress"
68+func staticKey_couponsAddress () = "static_couponsAddress"
69+
70+
71+func staticKey_canineStakingAddress () = "static_canineStakingAddress"
72+
73+
74+func staticKey_duckStakingAddress () = "static_farmingAddressNew"
75+
76+
77+func staticKey_duckIncubatorAddress () = "static_incubatorAddress"
78+
79+
80+func staticKey_itemsAddress () = "static_itemsAddress"
81+
82+
83+func staticKey_canineWavesRebirthPrice () = "static_canineWavesRebirthPrice"
84+
85+
86+func staticKey_turtleIncubatorAddress () = "static_turtleIncubatorAddress"
87+
88+
89+func staticKey_babyDuckAddress () = "static_babyDuckAddress"
4290
4391
4492 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
4795 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
4896
4997
50-func getMintAssetId () = unit
98+func getCanineBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineBreederAddress())))
5199
52100
53-func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
101+func getCanineIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineIncubatorAddress())))
54102
55103
56-func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
104+func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
57105
58106
59-func getCaniRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_caniRebirthAddress())))
107+func getCanineStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineStakingAddress())))
60108
61109
62-func getCaniFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_caniFarmingAddress())))
110+func getDuckStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckStakingAddress())))
111+
112+
113+func getDuckIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckIncubatorAddress())))
114+
115+
116+func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
117+
118+
119+func getTurtleIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleIncubatorAddress())))
120+
121+
122+func getBabyDuckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_babyDuckAddress())))
123+
124+
125+func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
126+ case b: Int =>
127+ b
128+ case _ =>
129+ throw("TR: Value not found in sc!")
130+}
131+
132+
133+let wavesAmount = tryGetIntegerExternal(getOracle(), staticKey_canineWavesRebirthPrice())
134+
135+let delayForHatching = 2
136+
137+func checkReal (assetId) = if (if ((value(assetInfo(assetId)).issuer == getCanineBreederAddress()))
138+ then true
139+ else (value(assetInfo(assetId)).issuer == getCanineIncubatorAddress()))
140+ then value(assetInfo(assetId)).issuer
141+ else throw("not valid NFT")
63142
64143
65144 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
66- then throw("BDCAP: Please attach waves")
145+ then throw("RCAP: Please attach waves")
67146 else {
68147 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
69148 if ((payment.amount != feeAmount))
70- then throw((("BDCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
149+ then throw((("RCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
71150 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
72151 }
73152
74153
75-let delayForHatching = 2
76-
77-let HatchingStarted = "HATCHING_STARTED"
78-
79-let HatchingFinished = "HATCHING_FINISHED"
80-
81-func isLocked () = {
82- let masterAddress = Address(base58'3PEPftf2kWZDmAaWBjs6BUJa9957kiA2PkU')
83- match getInteger(masterAddress, "egglock") {
84- case b: Int =>
85- b
86- case _ =>
87- 0
88- }
154+func getRandomNumber (options,txId,hatchingFinishHeight,offset) = {
155+ let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
156+ let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
157+ (toInt(randomHash, (offset * 8)) % options)
89158 }
90159
91160
92-func getHatchingStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
161+func tryGetBoolean (key) = match getBoolean(key) {
162+ case b: Boolean =>
163+ b
164+ case _ =>
165+ false
166+}
93167
94168
95-func getHatchingFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
96-
97-
98-func getCANIIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di")
99-
100-
101-func getCANIStatsKey (genString) = (("stats_" + genString) + "_amount")
102-
103-
104-func tryGetInteger (key) = {
105- let val = match getInteger(this, key) {
106- case b: Int =>
107- b
108- case _ =>
109- 0
110- }
111- val
169+func getRandomWin (tx,finishHeight,blacklistCode) = {
170+ let jackpotRandom = getRandomNumber(10, tx, finishHeight, 1)
171+ if ((jackpotRandom == 1))
172+ then $Tuple2(jackpotRandom, "jackpot")
173+ else {
174+ let n = getRandomNumber(1000, tx, finishHeight, 0)
175+ let result = if (if ((100 > n))
176+ then (blacklistCode != "docking_A")
177+ else false)
178+ then "docking_A"
179+ else if (if ((200 > n))
180+ then (blacklistCode != "docking_B")
181+ else false)
182+ then "docking_B"
183+ else if (if ((300 > n))
184+ then (blacklistCode != "docking_C")
185+ else false)
186+ then "docking_C"
187+ else if (if ((400 > n))
188+ then (blacklistCode != "docking_D")
189+ else false)
190+ then "docking_D"
191+ else if (if ((450 > n))
192+ then (blacklistCode != "incubator")
193+ else false)
194+ then "incubator"
195+ else if (if ((490 > n))
196+ then (blacklistCode != "duckling_40")
197+ else false)
198+ then "duckling_40"
199+ else if (if ((540 > n))
200+ then (blacklistCode != "duckling_20")
201+ else false)
202+ then "duckling_20"
203+ else if (if ((640 > n))
204+ then (blacklistCode != "item!ART-FEED5")
205+ else false)
206+ then "item!ART-FEED5"
207+ else if (if ((710 > n))
208+ then (blacklistCode != "item!ART-FEED10")
209+ else false)
210+ then "item!ART-FEED10"
211+ else if (if ((740 > n))
212+ then (blacklistCode != "item!ART-FEED15")
213+ else false)
214+ then "item!ART-FEED15"
215+ else if (if ((770 > n))
216+ then (blacklistCode != "item!ART-FEED20")
217+ else false)
218+ then "item!ART-FEED20"
219+ else if (if ((790 > n))
220+ then (blacklistCode != "item!ART-FEED25")
221+ else false)
222+ then "item!ART-FEED25"
223+ else if (if ((810 > n))
224+ then (blacklistCode != "item!ART-FEED50")
225+ else false)
226+ then "item!ART-FEED50"
227+ else if (if ((830 > n))
228+ then (blacklistCode != "item!ART-FEED100")
229+ else false)
230+ then "item!ART-FEED100"
231+ else if (if ((860 > n))
232+ then (blacklistCode != "item!ART-MUTARIUM-G")
233+ else false)
234+ then "item!ART-MUTARIUM-G"
235+ else if (if ((890 > n))
236+ then (blacklistCode != "item!ART-MUTARIUM-D")
237+ else false)
238+ then "item!ART-MUTARIUM-D"
239+ else if (if ((910 > n))
240+ then (blacklistCode != "item!ART-FREEGENE")
241+ else false)
242+ then "item!ART-FREEGENE"
243+ else if (if ((930 > n))
244+ then (blacklistCode != "item!ART-FIXGENE")
245+ else false)
246+ then "item!ART-FIXGENE"
247+ else if (if ((980 > n))
248+ then (blacklistCode != "trtl_incubator")
249+ else false)
250+ then "trtl_incubator"
251+ else "item!ART-POTION"
252+ $Tuple2(n, result)
253+ }
112254 }
113255
114256
115-let discountCoefficient = tryGetInteger("discountCoefficient")
116-
117-func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
118- let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
119- let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
120- (toInt(randomHash, (offset * 8)) % variants)
257+func getRandomReturn (tx,finishHeight) = {
258+ let n = getRandomNumber(2, tx, finishHeight, 1)
259+ if ((n == 0))
260+ then true
261+ else false
121262 }
122263
123264
124-func select (color) = {
125- let oldGenes = nil
126- let newGenes = [$Tuple2(("CANI-AAAAAAAA-G" + color), "8A-G"), $Tuple2(("CANI-BBBBBBBB-G" + color), "8B-G"), $Tuple2(("CANI-CCCCCCCC-G" + color), "8C-G"), $Tuple2(("CANI-DDDDDDDD-G" + color), "8D-G")]
127- $Tuple2((oldGenes ++ newGenes), newGenes)
265+func finishRebirthInternal (initTx,address,additionalPayment,double,blacklistCode,rescue) = {
266+ let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
267+ let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
268+ let validPayment = checkAdditionalPayment(additionalPayment)
269+ if ((validPayment == validPayment))
270+ then if ((status != "open"))
271+ then throw("rebirth is finished or not open")
272+ else if ((finishBlock > height))
273+ then throw("you cannot finish rebirth, yet")
274+ else {
275+ let output = getRandomWin(fromBase58String(initTx), finishBlock, blacklistCode)
276+ let win = output._2
277+ let random = output._1
278+ let txId = initTx
279+ let result = if ((indexOf(win, "docking") != unit))
280+ then {
281+ let color = takeRight(win, 1)
282+ let call = if (!(double))
283+ then {
284+ let first = invoke(getCanineStakingAddress(), "addFreePerch", [address, color, 1], nil)
285+ if ((first == first))
286+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
287+ else throw("Strict value is not equal to itself.")
288+ }
289+ else {
290+ let first = invoke(getCanineStakingAddress(), "addFreePerch", [address, color, 2], nil)
291+ if ((first == first))
292+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
293+ else throw("Strict value is not equal to itself.")
294+ }
295+ if ((call == call))
296+ then call
297+ else throw("Strict value is not equal to itself.")
298+ }
299+ else if ((win == "jackpot"))
300+ then {
301+ let call = invoke(getCanineIncubatorAddress(), "issueJackpot", [address, txId, "WWWWHWTF"], nil)
302+ if ((call == call))
303+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
304+ else throw("Strict value is not equal to itself.")
305+ }
306+ else if ((win == "incubator"))
307+ then {
308+ let call = if (!(double))
309+ then {
310+ let first = invoke(getCanineIncubatorAddress(), "issueFree", [address, txId], nil)
311+ if ((first == first))
312+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
313+ else throw("Strict value is not equal to itself.")
314+ }
315+ else {
316+ let first = invoke(getCanineIncubatorAddress(), "issueFree", [address, txId], nil)
317+ if ((first == first))
318+ then {
319+ let second = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
320+ if ((second == second))
321+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), "incubator")]
322+ else throw("Strict value is not equal to itself.")
323+ }
324+ else throw("Strict value is not equal to itself.")
325+ }
326+ if ((call == call))
327+ then call
328+ else throw("Strict value is not equal to itself.")
329+ }
330+ else if ((indexOf(win, "duckling") != unit))
331+ then {
332+ let level = parseIntValue(split(win, "_")[1])
333+ let levelFinal = if (double)
334+ then (2 * level)
335+ else level
336+ let call = invoke(getBabyDuckAddress(), "issueFreeDuckling", [address, txId, levelFinal], nil)
337+ if ((call == call))
338+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
339+ else throw("Strict value is not equal to itself.")
340+ }
341+ else if ((win == "trtl_incubator"))
342+ then {
343+ let call = if (!(double))
344+ then {
345+ let first = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
346+ if ((first == first))
347+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
348+ else throw("Strict value is not equal to itself.")
349+ }
350+ else {
351+ let first = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
352+ if ((first == first))
353+ then {
354+ let second = invoke(getCanineIncubatorAddress(), "issueFree", [address, txId], nil)
355+ if ((second == second))
356+ 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")]
357+ else throw("Strict value is not equal to itself.")
358+ }
359+ else throw("Strict value is not equal to itself.")
360+ }
361+ if ((call == call))
362+ then call
363+ else throw("Strict value is not equal to itself.")
364+ }
365+ else if ((indexOf(win, "item") != unit))
366+ then {
367+ let itemName = split(win, "!")[1]
368+ let call = if (!(double))
369+ then {
370+ let first = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 0], nil)
371+ if ((first == first))
372+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
373+ else throw("Strict value is not equal to itself.")
374+ }
375+ else {
376+ let first = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 0], nil)
377+ if ((first == first))
378+ then {
379+ let second = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 1], nil)
380+ if ((second == second))
381+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
382+ else throw("Strict value is not equal to itself.")
383+ }
384+ else throw("Strict value is not equal to itself.")
385+ }
386+ if ((call == call))
387+ then call
388+ else throw("Strict value is not equal to itself.")
389+ }
390+ else throw(("RFB: Some error occured, please contact the admins! " + win))
391+ if ((result == result))
392+ then {
393+ let returnToSender = if (rescue)
394+ then getRandomReturn(fromBase58String(initTx), finishBlock)
395+ else false
396+ let returnPayload = if (returnToSender)
397+ then {
398+ let assetId = fromBase58String(getStringValue((((("address_" + address) + "_initTx_") + initTx) + "_assetId")))
399+ let issuer = checkReal(assetId)
400+ let gen = asString(invoke(getCanineBreederAddress(), "getGenFromName", [value(assetInfo(assetId)).name], nil))
401+ if ((gen == gen))
402+ then {
403+ let call = invoke(issuer, "increaseRarity", [toBase58String(assetId), gen], nil)
404+ if ((call == call))
405+ then [ScriptTransfer(addressFromStringValue(address), 1, assetId)]
406+ else throw("Strict value is not equal to itself.")
407+ }
408+ else throw("Strict value is not equal to itself.")
409+ }
410+ else nil
411+ (((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish"), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_random"), random)]) ++ validPayment) ++ returnPayload)
412+ }
413+ else throw("Strict value is not equal to itself.")
414+ }
415+ else throw("Strict value is not equal to itself.")
128416 }
129417
130418
131-func getRandomName (txId,hatchingFinishHeight,all) = {
132- let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 1)
133- let color = ["A", "B", "C", "D"][colorRandom]
134- let colorSelect = select(color)
135- let toPickFrom = if (all)
136- then colorSelect._1
137- else colorSelect._2
138- let typeRandom = getRandomNumber(size(toPickFrom), txId, hatchingFinishHeight, 0)
139-toPickFrom[typeRandom]
140- }
419+@Callable(i)
420+func configureOracle (oracle) = if ((i.caller != this))
421+ then throw("RCU: admin only")
422+ else [StringEntry("static_oracleAddress", oracle)]
141423
142-
143-let typesAmount = (size(select("R")._1) - 1)
144-
145-func countEggsNeededAmount (totalCANIsAmount) = {
146- let n = totalCANIsAmount
147- let g = discountCoefficient
148- let t = typesAmount
149- let price = (pow((100 + ((n * g) / (10 * t))), 2, 5, 1, 2, DOWN) + 55)
150- (price * 1500000)
151- }
152-
153-
154-func asBoolean (value) = match value {
155- case boolean: Boolean =>
156- boolean
157- case _ =>
158- throw("TI: wrong type, expected: Boolean")
159-}
160424
161425
162426 @Callable(i)
163-func reduceRarity (assetId,fGen) = {
164- let asset = fromBase58String(assetId)
165- if (if ((i.caller != getCaniRebirthAddress()))
166- then (i.caller != this)
167- else false)
168- then throw("IRR: admin or rebirth only")
169- else {
170- let duckGen = value(assetInfo(asset)).name
171- let letter = takeRight(take(duckGen, 6), 1)
172- let farmGen = (("8" + letter) + "-G")
173-[IntegerEntry(getCANIStatsKey(duckGen), (tryGetInteger(getCANIStatsKey(duckGen)) - 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) - 1))]
174- }
427+func initRebirth () = {
428+ let pmtCanine = i.payments[0]
429+ let pmtWaves = i.payments[1]
430+ let assetId = value(pmtCanine.assetId)
431+ let initTx = toBase58String(i.transactionId)
432+ let address = toString(i.caller)
433+ if ((pmtCanine.amount != 1))
434+ then throw("NFT is not attached")
435+ else if (if ((pmtWaves.amount != wavesAmount))
436+ then true
437+ else (pmtWaves.assetId != unit))
438+ then throw("Wavespayment is not attached or wrong!")
439+ else {
440+ let sendToAggreGator = (pmtWaves.amount / 4)
441+ let topup = (pmtWaves.amount - sendToAggreGator)
442+ let addMore = invoke(getCanineStakingAddress(), "addWavesAndStakeMore", nil, [AttachedPayment(unit, topup)])
443+ if ((addMore == addMore))
444+ then {
445+ let issuer = checkReal(assetId)
446+ let gen = asString(invoke(getCanineBreederAddress(), "getGenFromName", [value(assetInfo(assetId)).name], nil))
447+ if ((gen == gen))
448+ then {
449+ let call = invoke(issuer, "reduceRarity", [toBase58String(assetId), gen], nil)
450+ if ((call == call))
451+ 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)]
452+ else throw("Strict value is not equal to itself.")
453+ }
454+ else throw("Strict value is not equal to itself.")
455+ }
456+ else throw("Strict value is not equal to itself.")
457+ }
175458 }
176459
177460
178461
179462 @Callable(i)
180-func increaseRarity (assetId,fGen) = {
181- let asset = fromBase58String(assetId)
182- if (if ((i.caller != getCaniRebirthAddress()))
183- then (i.caller != this)
184- else false)
185- then throw("IRR: admin or rebirth only")
186- else {
187- let duckGen = value(assetInfo(asset)).name
188- let letter = takeRight(take(duckGen, 6), 1)
189- let farmGen = (("8" + letter) + "-G")
190-[IntegerEntry(getCANIStatsKey(duckGen), (tryGetInteger(getCANIStatsKey(duckGen)) + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1))]
191- }
192- }
463+func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
193464
194465
195466
196467 @Callable(i)
197-func configureOracle (oracle) = if ((i.caller != this))
198- then throw("ICU: admin only")
199- else [StringEntry("static_oracleAddress", oracle)]
200-
201-
202-
203-@Callable(i)
204-func issueJackpot (address,txIdStr,gen) = if (if ((i.caller != getCaniRebirthAddress()))
205- then (i.caller != this)
206- else false)
207- then throw("ISJ: admin or rebirth only")
468+func finishRebirthDouble (initTx) = if (!(if ((size(i.payments) == 2))
469+ then (i.payments[0].amount == 1)
470+ else false))
471+ then throw("Invalid payment")
208472 else {
209- let txId = fromBase58String(txIdStr)
210- let hatchingStatusKey = getHatchingStatusKey(address, txId)
211- let finishHeightKey = getHatchingFinishHeightKey(address, txId)
212- let totalDucksAmount = tryGetInteger("cani_amount")
213- let eggsNeeded = countEggsNeededAmount(totalDucksAmount)
214- let $t064986550 = $Tuple2((("CANI-" + gen) + "-JU"), "8W-J")
215- let duckGen = $t064986550._1
216- let farmGen = $t064986550._2
217- let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
218- let asset = Issue(duckGen, description, 1, 0, false, unit, height)
219- let assetId = calculateAssetId(asset)
220- let duckIdKey = getCANIIdKey(address, txId)
221- let valueDuckIdKeyExits = tryGetString(duckIdKey)
222- if ((valueDuckIdKeyExits != ""))
223- then throw((("ISJ: You will override following duckId :" + duckIdKey) + " make sure that your txId is unique!"))
224- else $Tuple2([IntegerEntry(getHatchingFinishHeightKey(address, txId), height), IntegerEntry("cani_amount", (totalDucksAmount + 1)), IntegerEntry("cani_last_price", (eggsNeeded / 1500000)), StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getCANIStatsKey(duckGen), (tryGetInteger(getCANIStatsKey(duckGen)) + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
473+ let assetId = value(i.payments[0].assetId)
474+ let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
475+ if ((boosterType == boosterType))
476+ then if ((boosterType == "ART-GIFT_DOUBL"))
477+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
478+ else throw("Error! Wrong item attached to double rewards!")
479+ else throw("Strict value is not equal to itself.")
225480 }
226481
227482
228483
229484 @Callable(i)
230-func issueFree (address,txIdStr) = if ((i.caller != getCaniRebirthAddress()))
231- then throw("CIF: rebirth only")
232- else {
233- let txId = fromBase58String(txIdStr)
234- let hatchingStatusKey = getHatchingStatusKey(address, txId)
235- let finishHeightKey = getHatchingFinishHeightKey(address, txId)
236- let totalDucksAmount = tryGetInteger("cani_amount")
237- let eggsNeeded = countEggsNeededAmount(totalDucksAmount)
238- let $t081328280 = getRandomName(txId, (valueOrErrorMessage(transactionHeightById(txId), ((txIdStr + " not found ") + toBase58String(txId))) + 1), true)
239- let CANIGen = $t081328280._1
240- let farmGen = $t081328280._2
241- let description = (("{\"genotype\": \"" + CANIGen) + "\", \"crossbreeding\": true}")
242- let asset = Issue(CANIGen, description, 1, 0, false, unit, height)
243- let assetId = calculateAssetId(asset)
244- let amount = (tryGetInteger(getCANIStatsKey(CANIGen)) + 1)
245- let duckIdKey = getCANIIdKey(address, txId)
246- $Tuple2([IntegerEntry(getHatchingFinishHeightKey(address, txId), height), IntegerEntry("cani_amount", (totalDucksAmount + 1)), IntegerEntry("cani_last_price", (eggsNeeded / 1500000)), StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getCANIStatsKey(CANIGen), amount), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
485+func finishRebirthItem (initTx,itemCode) = if (if ((size(i.payments) == 2))
486+ then (i.payments[0].amount == 1)
487+ else false)
488+ then {
489+ let assetId = value(i.payments[0].assetId)
490+ let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
491+ if ((boosterType == boosterType))
492+ then if ((boosterType == "ART-HWERASE"))
493+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, itemCode, false))
494+ else if ((boosterType == "ART-HWRESCUE"))
495+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, "", true))
496+ else if ((boosterType == "ART-GIFT_DOUBL"))
497+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
498+ else throw("Error! Wrong item attached ")
499+ else throw("Strict value is not equal to itself.")
247500 }
501+ else if ((size(i.payments) == 1))
502+ then finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
503+ else throw("Invalid payments")
248504
249-
250-
251-@Callable(i)
252-func setDiscount (val) = if ((i.caller != this))
253- then throw("admin_only")
254- else [IntegerEntry("discountCoefficient", val)]
255-
256-
257-
258-@Callable(i)
259-func startHatching (refererAddress) = {
260- let feeValidate = checkAdditionalPayment(i.payments[0])
261- if ((feeValidate == feeValidate))
262- then if ((isLocked() > 0))
263- then throw("EGG operations are temporarily locked")
264- else {
265- let totalCaniAmount = tryGetInteger("cani_amount")
266- let eggsNeeded = countEggsNeededAmount(totalCaniAmount)
267- let results = [StringEntry(getHatchingStatusKey(toString(i.originCaller), i.transactionId), HatchingStarted), IntegerEntry(getHatchingFinishHeightKey(toString(i.originCaller), i.transactionId), (height + delayForHatching)), IntegerEntry("cani_amount", (totalCaniAmount + 1)), IntegerEntry("cani_last_price", (eggsNeeded / 1500000))]
268- let leftToPay = eggsNeeded
269- let firstPayment = value(i.payments[1])
270- if ((firstPayment.assetId != getMintAssetId()))
271- then throw("TB: You can attach only WAVES")
272- else if ((leftToPay > firstPayment.amount))
273- then throw(((("TB: To breed a Canine you following amount of WAVES: " + toString(leftToPay)) + " ") + toString(i.caller)))
274- else {
275- let addMore = invoke(getCaniFarmingAddress(), "addWavesAndStakeMore", nil, [AttachedPayment(unit, leftToPay)])
276- if ((addMore == addMore))
277- then {
278- let refund = if ((size(i.payments) == 2))
279- then [ScriptTransfer(i.caller, (i.payments[1].amount - leftToPay), getMintAssetId())]
280- else nil
281- ((results ++ refund) ++ feeValidate)
282- }
283- else throw("Strict value is not equal to itself.")
284- }
285- }
286- else throw("Strict value is not equal to itself.")
287- }
288-
289-
290-
291-@Callable(i)
292-func finishHatching (txIdStr) = {
293- let feeValidate = checkAdditionalPayment(i.payments[0])
294- if ((feeValidate == feeValidate))
295- then {
296- let txId = fromBase58String(txIdStr)
297- let hatchingStatusKey = getHatchingStatusKey(toString(i.caller), txId)
298- let finishHeightKey = getHatchingFinishHeightKey(toString(i.caller), txId)
299- let CANIIdKey = getCANIIdKey(toString(i.caller), txId)
300- let hatchingTxStatus = getStringValue(this, hatchingStatusKey)
301- let hatchingFinishHeight = getIntegerValue(this, finishHeightKey)
302- if ((hatchingTxStatus == HatchingFinished))
303- then {
304- let CANIId = getStringValue(this, getCANIIdKey(toString(i.caller), txId))
305- throw(("The Cani was hatched and claimed already, here is the folowing: " + CANIId))
306- }
307- else if ((hatchingFinishHeight > height))
308- then throw((((("Hatching is not finished yet " + toString((hatchingFinishHeight - height))) + " blocks remaining, it will take around ") + toString((hatchingFinishHeight - height))) + " minutes"))
309- else {
310- let $t01183711910 = getRandomName(txId, hatchingFinishHeight, false)
311- let CANIGen = $t01183711910._1
312- let farmGen = $t01183711910._2
313- let description = (("{\"genotype\": \"" + CANIGen) + "\", \"crossbreeding\": true}")
314- let asset = Issue(CANIGen, description, 1, 0, false, unit, hatchingFinishHeight)
315- let assetId = calculateAssetId(asset)
316- let amount = (tryGetInteger(getCANIStatsKey(CANIGen)) + 1)
317- ([StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(CANIIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), CANIIdKey), IntegerEntry(getCANIStatsKey(CANIGen), amount), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(i.caller, 1, assetId)] ++ feeValidate)
318- }
319- }
320- else throw("Strict value is not equal to itself.")
321- }
322-
323-
324-@Verifier(tx)
325-func verify () = if (isTestEnv())
326- then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
327- else {
328- let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
329- let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
330- let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
331- let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
332- then 1
333- else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
334- then 1
335- else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
336- then 1
337- else 0
338- let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
339- then 1
340- else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
341- then 1
342- else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
343- then 1
344- else 0
345- let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
346- then 1
347- else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
348- then 1
349- else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
350- then 1
351- else 0
352- let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
353- match tx {
354- case _ =>
355- (signaturesCount >= 2)
356- }
357- }
358505
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func getBool (key) = match getBoolean(this, key) {
5- case b: Boolean =>
6- b
7- case _ =>
8- false
9-}
10-
11-
12-func isTestEnv () = getBool("TESTENV")
13-
14-
154 func tryGetStringExternal (address,key) = match getString(address, key) {
165 case a: String =>
176 a
187 case _ =>
198 ""
209 }
2110
2211
12+func tryGetInteger (key) = match getInteger(this, key) {
13+ case b: Int =>
14+ b
15+ case _ =>
16+ 0
17+}
18+
19+
2320 func tryGetString (key) = tryGetStringExternal(this, key)
21+
22+
23+func asInt (value) = match value {
24+ case int: Int =>
25+ int
26+ case string: String =>
27+ throw(("RAI: wrong type, expected: Int, but got: " + string))
28+ case _ =>
29+ throw("RAI: wrong type, expected: Int")
30+}
31+
32+
33+func asBoolean (value) = match value {
34+ case boolean: Boolean =>
35+ boolean
36+ case _ =>
37+ throw("FAB: wrong type, expected: Boolean")
38+}
39+
40+
41+func asString (value) = match value {
42+ case s: String =>
43+ s
44+ case s: Int =>
45+ throw("wrong type, expected: String, got: Int")
46+ case s: Unit =>
47+ throw("wrong type, expected: String, got: Unit")
48+ case _ =>
49+ throw("wrong type, expected: String")
50+}
2451
2552
2653 func staticKey_oracleAddress () = "static_oracleAddress"
2754
2855
2956 func staticKey_extraFee () = "static_extraFee"
3057
3158
3259 func staticKey_feeAggregator () = "static_feeAggregator"
3360
3461
35-func staticKey_refContractAddress () = "static_refContractAddress"
62+func staticKey_canineIncubatorAddress () = "static_canineIncubatorAddress"
3663
3764
38-func staticKey_caniRebirthAddress () = "static_canineRebirthAddress"
65+func staticKey_canineBreederAddress () = "static_canineBreederAddress"
3966
4067
41-func staticKey_caniFarmingAddress () = "static_canineStakingAddress"
68+func staticKey_couponsAddress () = "static_couponsAddress"
69+
70+
71+func staticKey_canineStakingAddress () = "static_canineStakingAddress"
72+
73+
74+func staticKey_duckStakingAddress () = "static_farmingAddressNew"
75+
76+
77+func staticKey_duckIncubatorAddress () = "static_incubatorAddress"
78+
79+
80+func staticKey_itemsAddress () = "static_itemsAddress"
81+
82+
83+func staticKey_canineWavesRebirthPrice () = "static_canineWavesRebirthPrice"
84+
85+
86+func staticKey_turtleIncubatorAddress () = "static_turtleIncubatorAddress"
87+
88+
89+func staticKey_babyDuckAddress () = "static_babyDuckAddress"
4290
4391
4492 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
4593
4694
4795 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
4896
4997
50-func getMintAssetId () = unit
98+func getCanineBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineBreederAddress())))
5199
52100
53-func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
101+func getCanineIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineIncubatorAddress())))
54102
55103
56-func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
104+func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
57105
58106
59-func getCaniRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_caniRebirthAddress())))
107+func getCanineStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineStakingAddress())))
60108
61109
62-func getCaniFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_caniFarmingAddress())))
110+func getDuckStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckStakingAddress())))
111+
112+
113+func getDuckIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckIncubatorAddress())))
114+
115+
116+func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
117+
118+
119+func getTurtleIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleIncubatorAddress())))
120+
121+
122+func getBabyDuckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_babyDuckAddress())))
123+
124+
125+func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
126+ case b: Int =>
127+ b
128+ case _ =>
129+ throw("TR: Value not found in sc!")
130+}
131+
132+
133+let wavesAmount = tryGetIntegerExternal(getOracle(), staticKey_canineWavesRebirthPrice())
134+
135+let delayForHatching = 2
136+
137+func checkReal (assetId) = if (if ((value(assetInfo(assetId)).issuer == getCanineBreederAddress()))
138+ then true
139+ else (value(assetInfo(assetId)).issuer == getCanineIncubatorAddress()))
140+ then value(assetInfo(assetId)).issuer
141+ else throw("not valid NFT")
63142
64143
65144 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
66- then throw("BDCAP: Please attach waves")
145+ then throw("RCAP: Please attach waves")
67146 else {
68147 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
69148 if ((payment.amount != feeAmount))
70- then throw((("BDCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
149+ then throw((("RCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
71150 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
72151 }
73152
74153
75-let delayForHatching = 2
76-
77-let HatchingStarted = "HATCHING_STARTED"
78-
79-let HatchingFinished = "HATCHING_FINISHED"
80-
81-func isLocked () = {
82- let masterAddress = Address(base58'3PEPftf2kWZDmAaWBjs6BUJa9957kiA2PkU')
83- match getInteger(masterAddress, "egglock") {
84- case b: Int =>
85- b
86- case _ =>
87- 0
88- }
154+func getRandomNumber (options,txId,hatchingFinishHeight,offset) = {
155+ let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
156+ let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
157+ (toInt(randomHash, (offset * 8)) % options)
89158 }
90159
91160
92-func getHatchingStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
161+func tryGetBoolean (key) = match getBoolean(key) {
162+ case b: Boolean =>
163+ b
164+ case _ =>
165+ false
166+}
93167
94168
95-func getHatchingFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
96-
97-
98-func getCANIIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di")
99-
100-
101-func getCANIStatsKey (genString) = (("stats_" + genString) + "_amount")
102-
103-
104-func tryGetInteger (key) = {
105- let val = match getInteger(this, key) {
106- case b: Int =>
107- b
108- case _ =>
109- 0
110- }
111- val
169+func getRandomWin (tx,finishHeight,blacklistCode) = {
170+ let jackpotRandom = getRandomNumber(10, tx, finishHeight, 1)
171+ if ((jackpotRandom == 1))
172+ then $Tuple2(jackpotRandom, "jackpot")
173+ else {
174+ let n = getRandomNumber(1000, tx, finishHeight, 0)
175+ let result = if (if ((100 > n))
176+ then (blacklistCode != "docking_A")
177+ else false)
178+ then "docking_A"
179+ else if (if ((200 > n))
180+ then (blacklistCode != "docking_B")
181+ else false)
182+ then "docking_B"
183+ else if (if ((300 > n))
184+ then (blacklistCode != "docking_C")
185+ else false)
186+ then "docking_C"
187+ else if (if ((400 > n))
188+ then (blacklistCode != "docking_D")
189+ else false)
190+ then "docking_D"
191+ else if (if ((450 > n))
192+ then (blacklistCode != "incubator")
193+ else false)
194+ then "incubator"
195+ else if (if ((490 > n))
196+ then (blacklistCode != "duckling_40")
197+ else false)
198+ then "duckling_40"
199+ else if (if ((540 > n))
200+ then (blacklistCode != "duckling_20")
201+ else false)
202+ then "duckling_20"
203+ else if (if ((640 > n))
204+ then (blacklistCode != "item!ART-FEED5")
205+ else false)
206+ then "item!ART-FEED5"
207+ else if (if ((710 > n))
208+ then (blacklistCode != "item!ART-FEED10")
209+ else false)
210+ then "item!ART-FEED10"
211+ else if (if ((740 > n))
212+ then (blacklistCode != "item!ART-FEED15")
213+ else false)
214+ then "item!ART-FEED15"
215+ else if (if ((770 > n))
216+ then (blacklistCode != "item!ART-FEED20")
217+ else false)
218+ then "item!ART-FEED20"
219+ else if (if ((790 > n))
220+ then (blacklistCode != "item!ART-FEED25")
221+ else false)
222+ then "item!ART-FEED25"
223+ else if (if ((810 > n))
224+ then (blacklistCode != "item!ART-FEED50")
225+ else false)
226+ then "item!ART-FEED50"
227+ else if (if ((830 > n))
228+ then (blacklistCode != "item!ART-FEED100")
229+ else false)
230+ then "item!ART-FEED100"
231+ else if (if ((860 > n))
232+ then (blacklistCode != "item!ART-MUTARIUM-G")
233+ else false)
234+ then "item!ART-MUTARIUM-G"
235+ else if (if ((890 > n))
236+ then (blacklistCode != "item!ART-MUTARIUM-D")
237+ else false)
238+ then "item!ART-MUTARIUM-D"
239+ else if (if ((910 > n))
240+ then (blacklistCode != "item!ART-FREEGENE")
241+ else false)
242+ then "item!ART-FREEGENE"
243+ else if (if ((930 > n))
244+ then (blacklistCode != "item!ART-FIXGENE")
245+ else false)
246+ then "item!ART-FIXGENE"
247+ else if (if ((980 > n))
248+ then (blacklistCode != "trtl_incubator")
249+ else false)
250+ then "trtl_incubator"
251+ else "item!ART-POTION"
252+ $Tuple2(n, result)
253+ }
112254 }
113255
114256
115-let discountCoefficient = tryGetInteger("discountCoefficient")
116-
117-func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
118- let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
119- let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
120- (toInt(randomHash, (offset * 8)) % variants)
257+func getRandomReturn (tx,finishHeight) = {
258+ let n = getRandomNumber(2, tx, finishHeight, 1)
259+ if ((n == 0))
260+ then true
261+ else false
121262 }
122263
123264
124-func select (color) = {
125- let oldGenes = nil
126- let newGenes = [$Tuple2(("CANI-AAAAAAAA-G" + color), "8A-G"), $Tuple2(("CANI-BBBBBBBB-G" + color), "8B-G"), $Tuple2(("CANI-CCCCCCCC-G" + color), "8C-G"), $Tuple2(("CANI-DDDDDDDD-G" + color), "8D-G")]
127- $Tuple2((oldGenes ++ newGenes), newGenes)
265+func finishRebirthInternal (initTx,address,additionalPayment,double,blacklistCode,rescue) = {
266+ let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
267+ let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
268+ let validPayment = checkAdditionalPayment(additionalPayment)
269+ if ((validPayment == validPayment))
270+ then if ((status != "open"))
271+ then throw("rebirth is finished or not open")
272+ else if ((finishBlock > height))
273+ then throw("you cannot finish rebirth, yet")
274+ else {
275+ let output = getRandomWin(fromBase58String(initTx), finishBlock, blacklistCode)
276+ let win = output._2
277+ let random = output._1
278+ let txId = initTx
279+ let result = if ((indexOf(win, "docking") != unit))
280+ then {
281+ let color = takeRight(win, 1)
282+ let call = if (!(double))
283+ then {
284+ let first = invoke(getCanineStakingAddress(), "addFreePerch", [address, color, 1], nil)
285+ if ((first == first))
286+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
287+ else throw("Strict value is not equal to itself.")
288+ }
289+ else {
290+ let first = invoke(getCanineStakingAddress(), "addFreePerch", [address, color, 2], nil)
291+ if ((first == first))
292+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
293+ else throw("Strict value is not equal to itself.")
294+ }
295+ if ((call == call))
296+ then call
297+ else throw("Strict value is not equal to itself.")
298+ }
299+ else if ((win == "jackpot"))
300+ then {
301+ let call = invoke(getCanineIncubatorAddress(), "issueJackpot", [address, txId, "WWWWHWTF"], nil)
302+ if ((call == call))
303+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
304+ else throw("Strict value is not equal to itself.")
305+ }
306+ else if ((win == "incubator"))
307+ then {
308+ let call = if (!(double))
309+ then {
310+ let first = invoke(getCanineIncubatorAddress(), "issueFree", [address, txId], nil)
311+ if ((first == first))
312+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
313+ else throw("Strict value is not equal to itself.")
314+ }
315+ else {
316+ let first = invoke(getCanineIncubatorAddress(), "issueFree", [address, txId], nil)
317+ if ((first == first))
318+ then {
319+ let second = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
320+ if ((second == second))
321+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), "incubator")]
322+ else throw("Strict value is not equal to itself.")
323+ }
324+ else throw("Strict value is not equal to itself.")
325+ }
326+ if ((call == call))
327+ then call
328+ else throw("Strict value is not equal to itself.")
329+ }
330+ else if ((indexOf(win, "duckling") != unit))
331+ then {
332+ let level = parseIntValue(split(win, "_")[1])
333+ let levelFinal = if (double)
334+ then (2 * level)
335+ else level
336+ let call = invoke(getBabyDuckAddress(), "issueFreeDuckling", [address, txId, levelFinal], nil)
337+ if ((call == call))
338+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
339+ else throw("Strict value is not equal to itself.")
340+ }
341+ else if ((win == "trtl_incubator"))
342+ then {
343+ let call = if (!(double))
344+ then {
345+ let first = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
346+ if ((first == first))
347+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
348+ else throw("Strict value is not equal to itself.")
349+ }
350+ else {
351+ let first = invoke(getTurtleIncubatorAddress(), "issueFreeTurtle", [address, txId], nil)
352+ if ((first == first))
353+ then {
354+ let second = invoke(getCanineIncubatorAddress(), "issueFree", [address, txId], nil)
355+ if ((second == second))
356+ 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")]
357+ else throw("Strict value is not equal to itself.")
358+ }
359+ else throw("Strict value is not equal to itself.")
360+ }
361+ if ((call == call))
362+ then call
363+ else throw("Strict value is not equal to itself.")
364+ }
365+ else if ((indexOf(win, "item") != unit))
366+ then {
367+ let itemName = split(win, "!")[1]
368+ let call = if (!(double))
369+ then {
370+ let first = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 0], nil)
371+ if ((first == first))
372+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
373+ else throw("Strict value is not equal to itself.")
374+ }
375+ else {
376+ let first = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 0], nil)
377+ if ((first == first))
378+ then {
379+ let second = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 1], nil)
380+ if ((second == second))
381+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
382+ else throw("Strict value is not equal to itself.")
383+ }
384+ else throw("Strict value is not equal to itself.")
385+ }
386+ if ((call == call))
387+ then call
388+ else throw("Strict value is not equal to itself.")
389+ }
390+ else throw(("RFB: Some error occured, please contact the admins! " + win))
391+ if ((result == result))
392+ then {
393+ let returnToSender = if (rescue)
394+ then getRandomReturn(fromBase58String(initTx), finishBlock)
395+ else false
396+ let returnPayload = if (returnToSender)
397+ then {
398+ let assetId = fromBase58String(getStringValue((((("address_" + address) + "_initTx_") + initTx) + "_assetId")))
399+ let issuer = checkReal(assetId)
400+ let gen = asString(invoke(getCanineBreederAddress(), "getGenFromName", [value(assetInfo(assetId)).name], nil))
401+ if ((gen == gen))
402+ then {
403+ let call = invoke(issuer, "increaseRarity", [toBase58String(assetId), gen], nil)
404+ if ((call == call))
405+ then [ScriptTransfer(addressFromStringValue(address), 1, assetId)]
406+ else throw("Strict value is not equal to itself.")
407+ }
408+ else throw("Strict value is not equal to itself.")
409+ }
410+ else nil
411+ (((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish"), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_random"), random)]) ++ validPayment) ++ returnPayload)
412+ }
413+ else throw("Strict value is not equal to itself.")
414+ }
415+ else throw("Strict value is not equal to itself.")
128416 }
129417
130418
131-func getRandomName (txId,hatchingFinishHeight,all) = {
132- let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 1)
133- let color = ["A", "B", "C", "D"][colorRandom]
134- let colorSelect = select(color)
135- let toPickFrom = if (all)
136- then colorSelect._1
137- else colorSelect._2
138- let typeRandom = getRandomNumber(size(toPickFrom), txId, hatchingFinishHeight, 0)
139-toPickFrom[typeRandom]
140- }
419+@Callable(i)
420+func configureOracle (oracle) = if ((i.caller != this))
421+ then throw("RCU: admin only")
422+ else [StringEntry("static_oracleAddress", oracle)]
141423
142-
143-let typesAmount = (size(select("R")._1) - 1)
144-
145-func countEggsNeededAmount (totalCANIsAmount) = {
146- let n = totalCANIsAmount
147- let g = discountCoefficient
148- let t = typesAmount
149- let price = (pow((100 + ((n * g) / (10 * t))), 2, 5, 1, 2, DOWN) + 55)
150- (price * 1500000)
151- }
152-
153-
154-func asBoolean (value) = match value {
155- case boolean: Boolean =>
156- boolean
157- case _ =>
158- throw("TI: wrong type, expected: Boolean")
159-}
160424
161425
162426 @Callable(i)
163-func reduceRarity (assetId,fGen) = {
164- let asset = fromBase58String(assetId)
165- if (if ((i.caller != getCaniRebirthAddress()))
166- then (i.caller != this)
167- else false)
168- then throw("IRR: admin or rebirth only")
169- else {
170- let duckGen = value(assetInfo(asset)).name
171- let letter = takeRight(take(duckGen, 6), 1)
172- let farmGen = (("8" + letter) + "-G")
173-[IntegerEntry(getCANIStatsKey(duckGen), (tryGetInteger(getCANIStatsKey(duckGen)) - 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) - 1))]
174- }
427+func initRebirth () = {
428+ let pmtCanine = i.payments[0]
429+ let pmtWaves = i.payments[1]
430+ let assetId = value(pmtCanine.assetId)
431+ let initTx = toBase58String(i.transactionId)
432+ let address = toString(i.caller)
433+ if ((pmtCanine.amount != 1))
434+ then throw("NFT is not attached")
435+ else if (if ((pmtWaves.amount != wavesAmount))
436+ then true
437+ else (pmtWaves.assetId != unit))
438+ then throw("Wavespayment is not attached or wrong!")
439+ else {
440+ let sendToAggreGator = (pmtWaves.amount / 4)
441+ let topup = (pmtWaves.amount - sendToAggreGator)
442+ let addMore = invoke(getCanineStakingAddress(), "addWavesAndStakeMore", nil, [AttachedPayment(unit, topup)])
443+ if ((addMore == addMore))
444+ then {
445+ let issuer = checkReal(assetId)
446+ let gen = asString(invoke(getCanineBreederAddress(), "getGenFromName", [value(assetInfo(assetId)).name], nil))
447+ if ((gen == gen))
448+ then {
449+ let call = invoke(issuer, "reduceRarity", [toBase58String(assetId), gen], nil)
450+ if ((call == call))
451+ 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)]
452+ else throw("Strict value is not equal to itself.")
453+ }
454+ else throw("Strict value is not equal to itself.")
455+ }
456+ else throw("Strict value is not equal to itself.")
457+ }
175458 }
176459
177460
178461
179462 @Callable(i)
180-func increaseRarity (assetId,fGen) = {
181- let asset = fromBase58String(assetId)
182- if (if ((i.caller != getCaniRebirthAddress()))
183- then (i.caller != this)
184- else false)
185- then throw("IRR: admin or rebirth only")
186- else {
187- let duckGen = value(assetInfo(asset)).name
188- let letter = takeRight(take(duckGen, 6), 1)
189- let farmGen = (("8" + letter) + "-G")
190-[IntegerEntry(getCANIStatsKey(duckGen), (tryGetInteger(getCANIStatsKey(duckGen)) + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1))]
191- }
192- }
463+func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
193464
194465
195466
196467 @Callable(i)
197-func configureOracle (oracle) = if ((i.caller != this))
198- then throw("ICU: admin only")
199- else [StringEntry("static_oracleAddress", oracle)]
200-
201-
202-
203-@Callable(i)
204-func issueJackpot (address,txIdStr,gen) = if (if ((i.caller != getCaniRebirthAddress()))
205- then (i.caller != this)
206- else false)
207- then throw("ISJ: admin or rebirth only")
468+func finishRebirthDouble (initTx) = if (!(if ((size(i.payments) == 2))
469+ then (i.payments[0].amount == 1)
470+ else false))
471+ then throw("Invalid payment")
208472 else {
209- let txId = fromBase58String(txIdStr)
210- let hatchingStatusKey = getHatchingStatusKey(address, txId)
211- let finishHeightKey = getHatchingFinishHeightKey(address, txId)
212- let totalDucksAmount = tryGetInteger("cani_amount")
213- let eggsNeeded = countEggsNeededAmount(totalDucksAmount)
214- let $t064986550 = $Tuple2((("CANI-" + gen) + "-JU"), "8W-J")
215- let duckGen = $t064986550._1
216- let farmGen = $t064986550._2
217- let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
218- let asset = Issue(duckGen, description, 1, 0, false, unit, height)
219- let assetId = calculateAssetId(asset)
220- let duckIdKey = getCANIIdKey(address, txId)
221- let valueDuckIdKeyExits = tryGetString(duckIdKey)
222- if ((valueDuckIdKeyExits != ""))
223- then throw((("ISJ: You will override following duckId :" + duckIdKey) + " make sure that your txId is unique!"))
224- else $Tuple2([IntegerEntry(getHatchingFinishHeightKey(address, txId), height), IntegerEntry("cani_amount", (totalDucksAmount + 1)), IntegerEntry("cani_last_price", (eggsNeeded / 1500000)), StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getCANIStatsKey(duckGen), (tryGetInteger(getCANIStatsKey(duckGen)) + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
473+ let assetId = value(i.payments[0].assetId)
474+ let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
475+ if ((boosterType == boosterType))
476+ then if ((boosterType == "ART-GIFT_DOUBL"))
477+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
478+ else throw("Error! Wrong item attached to double rewards!")
479+ else throw("Strict value is not equal to itself.")
225480 }
226481
227482
228483
229484 @Callable(i)
230-func issueFree (address,txIdStr) = if ((i.caller != getCaniRebirthAddress()))
231- then throw("CIF: rebirth only")
232- else {
233- let txId = fromBase58String(txIdStr)
234- let hatchingStatusKey = getHatchingStatusKey(address, txId)
235- let finishHeightKey = getHatchingFinishHeightKey(address, txId)
236- let totalDucksAmount = tryGetInteger("cani_amount")
237- let eggsNeeded = countEggsNeededAmount(totalDucksAmount)
238- let $t081328280 = getRandomName(txId, (valueOrErrorMessage(transactionHeightById(txId), ((txIdStr + " not found ") + toBase58String(txId))) + 1), true)
239- let CANIGen = $t081328280._1
240- let farmGen = $t081328280._2
241- let description = (("{\"genotype\": \"" + CANIGen) + "\", \"crossbreeding\": true}")
242- let asset = Issue(CANIGen, description, 1, 0, false, unit, height)
243- let assetId = calculateAssetId(asset)
244- let amount = (tryGetInteger(getCANIStatsKey(CANIGen)) + 1)
245- let duckIdKey = getCANIIdKey(address, txId)
246- $Tuple2([IntegerEntry(getHatchingFinishHeightKey(address, txId), height), IntegerEntry("cani_amount", (totalDucksAmount + 1)), IntegerEntry("cani_last_price", (eggsNeeded / 1500000)), StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getCANIStatsKey(CANIGen), amount), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
485+func finishRebirthItem (initTx,itemCode) = if (if ((size(i.payments) == 2))
486+ then (i.payments[0].amount == 1)
487+ else false)
488+ then {
489+ let assetId = value(i.payments[0].assetId)
490+ let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
491+ if ((boosterType == boosterType))
492+ then if ((boosterType == "ART-HWERASE"))
493+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, itemCode, false))
494+ else if ((boosterType == "ART-HWRESCUE"))
495+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, "", true))
496+ else if ((boosterType == "ART-GIFT_DOUBL"))
497+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
498+ else throw("Error! Wrong item attached ")
499+ else throw("Strict value is not equal to itself.")
247500 }
501+ else if ((size(i.payments) == 1))
502+ then finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
503+ else throw("Invalid payments")
248504
249-
250-
251-@Callable(i)
252-func setDiscount (val) = if ((i.caller != this))
253- then throw("admin_only")
254- else [IntegerEntry("discountCoefficient", val)]
255-
256-
257-
258-@Callable(i)
259-func startHatching (refererAddress) = {
260- let feeValidate = checkAdditionalPayment(i.payments[0])
261- if ((feeValidate == feeValidate))
262- then if ((isLocked() > 0))
263- then throw("EGG operations are temporarily locked")
264- else {
265- let totalCaniAmount = tryGetInteger("cani_amount")
266- let eggsNeeded = countEggsNeededAmount(totalCaniAmount)
267- let results = [StringEntry(getHatchingStatusKey(toString(i.originCaller), i.transactionId), HatchingStarted), IntegerEntry(getHatchingFinishHeightKey(toString(i.originCaller), i.transactionId), (height + delayForHatching)), IntegerEntry("cani_amount", (totalCaniAmount + 1)), IntegerEntry("cani_last_price", (eggsNeeded / 1500000))]
268- let leftToPay = eggsNeeded
269- let firstPayment = value(i.payments[1])
270- if ((firstPayment.assetId != getMintAssetId()))
271- then throw("TB: You can attach only WAVES")
272- else if ((leftToPay > firstPayment.amount))
273- then throw(((("TB: To breed a Canine you following amount of WAVES: " + toString(leftToPay)) + " ") + toString(i.caller)))
274- else {
275- let addMore = invoke(getCaniFarmingAddress(), "addWavesAndStakeMore", nil, [AttachedPayment(unit, leftToPay)])
276- if ((addMore == addMore))
277- then {
278- let refund = if ((size(i.payments) == 2))
279- then [ScriptTransfer(i.caller, (i.payments[1].amount - leftToPay), getMintAssetId())]
280- else nil
281- ((results ++ refund) ++ feeValidate)
282- }
283- else throw("Strict value is not equal to itself.")
284- }
285- }
286- else throw("Strict value is not equal to itself.")
287- }
288-
289-
290-
291-@Callable(i)
292-func finishHatching (txIdStr) = {
293- let feeValidate = checkAdditionalPayment(i.payments[0])
294- if ((feeValidate == feeValidate))
295- then {
296- let txId = fromBase58String(txIdStr)
297- let hatchingStatusKey = getHatchingStatusKey(toString(i.caller), txId)
298- let finishHeightKey = getHatchingFinishHeightKey(toString(i.caller), txId)
299- let CANIIdKey = getCANIIdKey(toString(i.caller), txId)
300- let hatchingTxStatus = getStringValue(this, hatchingStatusKey)
301- let hatchingFinishHeight = getIntegerValue(this, finishHeightKey)
302- if ((hatchingTxStatus == HatchingFinished))
303- then {
304- let CANIId = getStringValue(this, getCANIIdKey(toString(i.caller), txId))
305- throw(("The Cani was hatched and claimed already, here is the folowing: " + CANIId))
306- }
307- else if ((hatchingFinishHeight > height))
308- then throw((((("Hatching is not finished yet " + toString((hatchingFinishHeight - height))) + " blocks remaining, it will take around ") + toString((hatchingFinishHeight - height))) + " minutes"))
309- else {
310- let $t01183711910 = getRandomName(txId, hatchingFinishHeight, false)
311- let CANIGen = $t01183711910._1
312- let farmGen = $t01183711910._2
313- let description = (("{\"genotype\": \"" + CANIGen) + "\", \"crossbreeding\": true}")
314- let asset = Issue(CANIGen, description, 1, 0, false, unit, hatchingFinishHeight)
315- let assetId = calculateAssetId(asset)
316- let amount = (tryGetInteger(getCANIStatsKey(CANIGen)) + 1)
317- ([StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(CANIIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), CANIIdKey), IntegerEntry(getCANIStatsKey(CANIGen), amount), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(i.caller, 1, assetId)] ++ feeValidate)
318- }
319- }
320- else throw("Strict value is not equal to itself.")
321- }
322-
323-
324-@Verifier(tx)
325-func verify () = if (isTestEnv())
326- then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
327- else {
328- let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
329- let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
330- let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
331- let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
332- then 1
333- else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
334- then 1
335- else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
336- then 1
337- else 0
338- let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
339- then 1
340- else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
341- then 1
342- else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
343- then 1
344- else 0
345- let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
346- then 1
347- else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
348- then 1
349- else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
350- then 1
351- else 0
352- let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
353- match tx {
354- case _ =>
355- (signaturesCount >= 2)
356- }
357- }
358505

github/deemru/w8io/169f3d6 
67.39 ms