tx · 2PrT7sb6ScjaLZkSsDDKhQTivEHmNGR22ZiPJ765xLNv

3N7LWLXDtaXAyrzFjxhPPLBfV5DepLY4JQT:  -0.02100000 Waves

2022.12.02 15:12 [2342716] smart account 3N7LWLXDtaXAyrzFjxhPPLBfV5DepLY4JQT > SELF 0.00000000 Waves

{ "type": 13, "id": "2PrT7sb6ScjaLZkSsDDKhQTivEHmNGR22ZiPJ765xLNv", "fee": 2100000, "feeAssetId": null, "timestamp": 1669983179572, "version": 2, "chainId": 84, "sender": "3N7LWLXDtaXAyrzFjxhPPLBfV5DepLY4JQT", "senderPublicKey": "Dua5JUgjDoKiGQvqvHFw2EcHUMTEH2zYWs8T2usUxu1S", "proofs": [ "bksVqAKbA87rKGUREyqRN3pE3xSiSQq6Wk43yw9FDX3PbRa37n9rdHtkgPhbps68HVMqPtmwtTfqM23CuxH9e6R" ], "script": "base64:AAIFAAAAAAAAAFAIAhILCgkBAQEBAQgBAQgSAwoBARIDCgEIEgUKAwEICBIECgIBCBIGCgQBCAECEgcKBQgBCAECEgQKAgEYEgUKAwgIARIECgIBCBIECgIBAQAAAD0BAAAAEWdldEludGVnZXJPclRocm93AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMQ2FuJ3QgcmVhZCAnBQAAAANrZXkCAAAADScgYXQgYWRkcmVzcyAJAAQlAAAAAQUAAAAHYWRkcmVzcwEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADENhbid0IHJlYWQgJwUAAAADa2V5AgAAAA0nIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAB2FkZHJlc3MBAAAAE2dldEludGVnZXJPckRlZmF1bHQAAAADAAAAB2FkZHJlc3MAAAADa2V5AAAAB2RlZmF1bHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5BQAAAAdkZWZhdWx0AQAAAA9wYXJzZUludE9yVGhyb3cAAAABAAAACG1heWJlSW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAS2AAAAAQUAAAAIbWF5YmVJbnQJAAEsAAAAAgkAASwAAAACAgAAABpDYW4ndCBwYXJzZSBpbnRlZ2VyIGZyb20gJwUAAAAIbWF5YmVJbnQCAAAAAScBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABAAAADG1heWJlQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAADG1heWJlQWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAGkNhbid0IHBhcnNlIGFkZHJlc3MgZnJvbSAnBQAAAAxtYXliZUFkZHJlc3MCAAAAAScBAAAAEXBhcnNlSW50T3JEZWZhdWx0AAAAAgAAAAhtYXliZUludAAAAAdkZWZhdWx0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEtgAAAAEFAAAACG1heWJlSW50BQAAAAdkZWZhdWx0AQAAAAprZXlfZW50aXR5AAAAAwAAAARuYW1lAAAAAnBrAAAACHByb3BlcnR5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAABG5hbWUCAAAAAV8FAAAAAnBrAgAAAAFfBQAAAAhwcm9wZXJ0eQEAAAAHa2V5X3RvcAAAAAEAAAAEbmFtZQkAASwAAAACAgAAAARUb3BfBQAAAARuYW1lAQAAAAhrZXlfdG9wMgAAAAEAAAAEbmFtZQkAASwAAAACAgAAAAVUb3AyXwUAAAAEbmFtZQEAAAAOa2V5X2JpZGRlckhhc2gAAAADAAAACWF1Y3Rpb25JZAAAAAdhZGRyZXNzAAAABGhhc2gJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAFfBQAAAAdhZGRyZXNzAgAAAAFfBQAAAARoYXNoAQAAAAdrZXlfYmlkAAAAAQAAAApiaWRkZXJIYXNoCQABLAAAAAICAAAABEJpZF8FAAAACmJpZGRlckhhc2gBAAAACmtleV9yZXZlYWwAAAABAAAACmJpZGRlckhhc2gJAAEsAAAAAgIAAAAHUmV2ZWFsXwUAAAAKYmlkZGVySGFzaAEAAAAMa2V5X3JlZmVycmVyAAAAAQAAAApiaWRkZXJIYXNoCQABLAAAAAICAAAACVJlZmVycmVyXwUAAAAKYmlkZGVySGFzaAEAAAATa2V5X3JlZmVycmVyQWRkcmVzcwAAAAEAAAAEbmFtZQkAASwAAAACCQABLAAAAAICAAAACVJlZmVycmVyXwUAAAAEbmFtZQIAAAAIX2FkZHJlc3MBAAAAE2tleV9yZWZlcnJlclBlcmNlbnQAAAABAAAABG5hbWUJAAEsAAAAAgkAASwAAAACAgAAAAlSZWZlcnJlcl8FAAAABG5hbWUCAAAACF9wZXJjZW50AQAAAA9rZXlfbGVuZ3RoUHJpY2UAAAABAAAABmxlbmd0aAkAASwAAAACAgAAAAdMZW5ndGhfCQABpAAAAAEFAAAABmxlbmd0aAAAAAARa2V5X2luaXRUaW1lc3RhbXACAAAADWluaXRUaW1lc3RhbXAAAAAAD2tleV9iaWREdXJhdGlvbgIAAAALYmlkRHVyYXRpb24AAAAAEmtleV9yZXZlYWxEdXJhdGlvbgIAAAAOcmV2ZWFsRHVyYXRpb24AAAAADGtleV9lcnJvckZlZQIAAAAIZXJyb3JGZWUAAAAADmtleV9taW5pbWFsQmlkAgAAAAptaW5pbWFsQmlkAAAAABRrZXlfcmVnaXN0cmFyQWRkcmVzcwIAAAAQcmVnaXN0cmFyQWRkcmVzcwAAAAAVa2V5X25hbWVNaW5pbWFsTGVuZ3RoAgAAABFuYW1lTWluaW1hbExlbmd0aAAAAAAPa2V5X3BlcmNlbnRSYXRlAgAAAAtwZXJjZW50UmF0ZQAAAAAUa2V5X2NvbGxlY3RvckFkZHJlc3MCAAAAEGNvbGxlY3RvckFkZHJlc3MAAAAAGWtleV9uZXh0TmFtZU1pbmltYWxMZW5ndGgCAAAAFW5leHROYW1lTWluaW1hbExlbmd0aAAAAAAQa2V5X2xlbmd0aFByaWNlcwIAAAAMbGVuZ3RoUHJpY2VzAAAAAAxhdWN0aW9uU3RhcnQJAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIFAAAABHRoaXMFAAAAEWtleV9pbml0VGltZXN0YW1wAAAAAAtiaWREdXJhdGlvbgkBAAAAEWdldEludGVnZXJPclRocm93AAAAAgUAAAAEdGhpcwUAAAAPa2V5X2JpZER1cmF0aW9uAAAAAA5yZXZlYWxEdXJhdGlvbgkBAAAAEWdldEludGVnZXJPclRocm93AAAAAgUAAAAEdGhpcwUAAAASa2V5X3JldmVhbER1cmF0aW9uAAAAAA9hdWN0aW9uRHVyYXRpb24JAABkAAAAAgUAAAALYmlkRHVyYXRpb24FAAAADnJldmVhbER1cmF0aW9uAAAAAAhlcnJvckZlZQkBAAAAEWdldEludGVnZXJPclRocm93AAAAAgUAAAAEdGhpcwUAAAAMa2V5X2Vycm9yRmVlAAAAAAptaW5pbWFsQmlkCQEAAAARZ2V0SW50ZWdlck9yVGhyb3cAAAACBQAAAAR0aGlzBQAAAA5rZXlfbWluaW1hbEJpZAAAAAARbmFtZU1pbmltYWxMZW5ndGgJAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIFAAAABHRoaXMFAAAAFWtleV9uYW1lTWluaW1hbExlbmd0aAAAAAALcGVyY2VudFJhdGUJAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIFAAAABHRoaXMFAAAAD2tleV9wZXJjZW50UmF0ZQAAAAAQcmVnaXN0cmFyQWRkcmVzcwkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzBQAAABRrZXlfcmVnaXN0cmFyQWRkcmVzcwAAAAAJcmVnaXN0cmFyCQEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEFAAAAEHJlZ2lzdHJhckFkZHJlc3MAAAAAEGNvbGxlY3RvckFkZHJlc3MJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAAEdGhpcwUAAAAUa2V5X2NvbGxlY3RvckFkZHJlc3MAAAAACWNvbGxlY3RvcgkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABBQAAABBjb2xsZWN0b3JBZGRyZXNzAQAAABBfZ2V0UmVmZXJyZXJEYXRhAAAAAQAAAAxyZWZlcnJlck5hbWUEAAAACnJlZkFkZHJlc3MJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzCQEAAAATa2V5X3JlZmVycmVyQWRkcmVzcwAAAAEFAAAADHJlZmVycmVyTmFtZQQAAAAKcmVmUGVyY2VudAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAATa2V5X3JlZmVycmVyUGVyY2VudAAAAAEFAAAADHJlZmVycmVyTmFtZQUAAAALcGVyY2VudFJhdGUDAwkAAGYAAAACAAAAAAAAAAAABQAAAApyZWZQZXJjZW50BgkAAGYAAAACBQAAAApyZWZQZXJjZW50AAAAAAAAAABkCQAAAgAAAAECAAAAFkluY29ycmVjdCBwZXJjZW50IHJhdGUJAAUUAAAAAgUAAAAKcmVmQWRkcmVzcwUAAAAKcmVmUGVyY2VudAEAAAAYX3JlZmVycmVyUGVyY2VudFRyYW5zZmVyAAAAAgAAAA1iaWRk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aW5pbWFsTGVuZ3RoAgAAAAEsCQAFFAAAAAIJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAZ2YWx1ZXMAAAAAAAAAAAAJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAZ2YWx1ZXMAAAAAAAAAAAEEAAAADW5leHRBdWN0aW9uSWQIBQAAAAskdDA1NTYyNTc0NwAAAAJfMQQAAAARbmV4dE1pbmltYWxMZW5naHQIBQAAAAskdDA1NTYyNTc0NwAAAAJfMgMJAABnAAAAAgUAAAAJYXVjdGlvbklkBQAAAA1uZXh0QXVjdGlvbklkBQAAABFuZXh0TWluaW1hbExlbmdodAUAAAARbmFtZU1pbmltYWxMZW5ndGgFAAAAEW5hbWVNaW5pbWFsTGVuZ3RoAQAAAA9fZ2V0QXVjdGlvbkJ5SWQAAAABAAAACWF1Y3Rpb25JZAQAAAAIYmlkU3RhcnQJAABkAAAAAgUAAAAMYXVjdGlvblN0YXJ0CQAAaAAAAAIJAABlAAAAAgUAAAAJYXVjdGlvbklkAAAAAAAAAAABBQAAAA9hdWN0aW9uRHVyYXRpb24EAAAAC3JldmVhbFN0YXJ0CQAAZAAAAAIFAAAACGJpZFN0YXJ0BQAAAAtiaWREdXJhdGlvbgQAAAAKYXVjdGlvbkVuZAkAAGQAAAACBQAAAAtyZXZlYWxTdGFydAUAAAAOcmV2ZWFsRHVyYXRpb24EAAAABXBoYXNlAwkAAGYAAAACCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAALcmV2ZWFsU3RhcnQFAAAADFBIQVNFX1JFVkVBTAUAAAAJUEhBU0VfQklEBAAAAA1taW5pbWFsTGVuZ3RoCQEAAAARX2dldE1pbmltYWxMZW5ndGgAAAABBQAAAAlhdWN0aW9uSWQEAAAABnByaWNlcwkBAAAADV9nZXRBbGxQcmljZXMAAAAACQAFGQAAAAcFAAAACWF1Y3Rpb25JZAUAAAAFcGhhc2UFAAAACGJpZFN0YXJ0BQAAAAtyZXZlYWxTdGFydAUAAAAKYXVjdGlvbkVuZAUAAAANbWluaW1hbExlbmd0aAUAAAAGcHJpY2VzAQAAAApnZXRBdWN0aW9uAAAAAAQAAAAJYXVjdGlvbklkCQAAZAAAAAIJAABpAAAAAgkAAGUAAAACCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAMYXVjdGlvblN0YXJ0BQAAAA9hdWN0aW9uRHVyYXRpb24AAAAAAAAAAAEJAQAAAA9fZ2V0QXVjdGlvbkJ5SWQAAAABBQAAAAlhdWN0aW9uSWQBAAAAD2dldEF1Y3Rpb25QaGFzZQAAAAAEAAAAB2F1Y3Rpb24JAQAAAApnZXRBdWN0aW9uAAAAAAQAAAAJYXVjdGlvbklkCAUAAAAHYXVjdGlvbgAAAAJfMQQAAAAFcGhhc2UIBQAAAAdhdWN0aW9uAAAAAl8yCQAFFAAAAAIFAAAACWF1Y3Rpb25JZAUAAAAFcGhhc2UBAAAAC2lzVmFsaWROYW1lAAAAAQAAAARuYW1lBAAAAAdpc1ZhbGlkBAAAAAckbWF0Y2gwCQAD/AAAAAQFAAAACXJlZ2lzdHJhcgIAAAAHaXNWYWxpZAkABEwAAAACBQAAAARuYW1lBQAAAANuaWwFAAAAA25pbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACVVbnN1cHBvcnRlZCByZXN1bHQgZm9ybWF0IChhdmFpbGFibGUpBAAAAA1taW5pbWFsTGVuZ2h0CAkBAAAACmdldEF1Y3Rpb24AAAAAAAAAAl82AwUAAAAHaXNWYWxpZAkAAGcAAAACCQABMQAAAAEFAAAABG5hbWUFAAAADW1pbmltYWxMZW5naHQHAQAAABFpc1JlZ2lzdHJhYmxlTmFtZQAAAAEAAAAEbmFtZQQAAAAHJG1hdGNoMAkAA/wAAAAEBQAAAAlyZWdpc3RyYXICAAAAC2lzQXZhaWxhYmxlCQAETAAAAAIFAAAABG5hbWUFAAAAA25pbAUAAAADbmlsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAJVVuc3VwcG9ydGVkIHJlc3VsdCBmb3JtYXQgKGF2YWlsYWJsZSkBAAAADmlzV2lubmFibGVOYW1lAAAAAQAAAARuYW1lBAAAAAlyZXZlYWxLZXkJAAQdAAAAAgUAAAAEdGhpcwkBAAAAB2tleV90b3AAAAABBQAAAARuYW1lAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAJcmV2ZWFsS2V5BgQAAAAOY3VycmVudEF1Y3Rpb24ICQEAAAAPZ2V0QXVjdGlvblBoYXNlAAAAAAAAAAJfMQQAAAAMdG9wQXVjdGlvbklkCQABkQAAAAIJAAS1AAAAAgkBAAAABXZhbHVlAAAAAQUAAAAJcmV2ZWFsS2V5AgAAAAFfAAAAAAAAAAABBAAAAAlhdWN0aW9uSWQJAQAAABFwYXJzZUludE9yRGVmYXVsdAAAAAIFAAAADHRvcEF1Y3Rpb25JZAAAAAAAAAAAAAkAAAAAAAACBQAAAAlhdWN0aW9uSWQFAAAADmN1cnJlbnRBdWN0aW9uAQAAAA9pc0F2YWlsYWJsZU5hbWUAAAABAAAABG5hbWUDAwkBAAAAEWlzUmVnaXN0cmFibGVOYW1lAAAAAQUAAAAEbmFtZQkBAAAADmlzV2lubmFibGVOYW1lAAAAAQUAAAAEbmFtZQcJAQAAAAtpc1ZhbGlkTmFtZQAAAAEFAAAABG5hbWUHAQAAAARfYmlkAAAAAwAAAANpbnYAAAAJYXVjdGlvbklkAAAABGhhc2gEAAAAA3BtdAMDCQAAAAAAAAIJAAGQAAAAAQgFAAAAA2ludgAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAAAAAACCAkAAZEAAAACCAUAAAADaW52AAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQFAAAABHVuaXQHCAkAAZEAAAACCAUAAAADaW52AAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAkAAAIAAAABAgAAABdTaW5nbGUgcGF5bWVudCByZXF1aXJlZAQAAAAJY2hlY2tIYXNoCQACWQAAAAEFAAAABGhhc2gDCQAAAAAAAAIFAAAACWNoZWNrSGFzaAUAAAAJY2hlY2tIYXNoBAAAAA1jYWxsZXJBZGRyZXNzCQAEJQAAAAEIBQAAAANpbnYAAAAGY2FsbGVyBAAAAAZiaWRLZXkJAQAAAAdrZXlfYmlkAAAAAQkBAAAADmtleV9iaWRkZXJIYXNoAAAAAwkAAaQAAAABBQAAAAlhdWN0aW9uSWQFAAAADWNhbGxlckFkZHJlc3MFAAAABGhhc2gEAAAACyR0MDgxMDg4MTY1CQEAAAAPZ2V0QXVjdGlvblBoYXNlAAAAAAQAAAAQY3VycmVudEF1Y3Rpb25JZAgFAAAACyR0MDgxMDg4MTY1AAAAAl8xBAAAAA1jdXJyZW50UGVyaW9kCAUAAAALJHQwODEwODgxNjUAAAACXzIDCQEAAAACIT0AAAACBQAAABBjdXJyZW50QXVjdGlvbklkBQAAAAlhdWN0aW9uSWQJAAACAAAAAQIAAAAYQXVjdGlvbnMgaXMgYWxyZWFkeSBvdmVyAwkBAAAAAiE9AAAAAgUAAAANY3VycmVudFBlcmlvZAUAAAAJUEhBU0VfQklECQAAAgAAAAECAAAAEkJpZCBwZXJpb2QgaXMgb3ZlcgMJAQAAAAlpc0RlZmluZWQAAAABCQAEGgAAAAIFAAAABHRoaXMFAAAABmJpZEtleQkAAAIAAAABAgAAACdCaWQgd2l0aCBleGFjdCBhbW91bnQgYWxyZWFkeSBwcmVzZW50ZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABmJpZEtleQUAAAADcG10BQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQAAAAdfcmV2ZWFsAAAABQAAAAZiaWRkZXIAAAAJYXVjdGlvbklkAAAABG5hbWUAAAAJYmlkQW1vdW50AAAABnNlY3JldAQAAAANYmlkZGVyQWRkcmVzcwkABCUAAAABBQAAAAZiaWRkZXIEAAAABGhhc2gJAQAAAAhjYWxjSGFzaAAAAAQFAAAABG5hbWUFAAAACWJpZEFtb3VudAUAAAANYmlkZGVyQWRkcmVzcwUAAAAGc2VjcmV0BAAAAA1iaWRkZXJIYXNoS2V5CQEAAAAOa2V5X2JpZGRlckhhc2gAAAADCQABpAAAAAEFAAAACWF1Y3Rpb25JZAUAAAANYmlkZGVyQWRkcmVzcwUAAAAEaGFzaAQAAAAJcmV2ZWFsS2V5CQEAAAAKa2V5X3JldmVhbAAAAAEFAAAADWJpZGRlckhhc2hLZXkEAAAACyR0MDg4NTA4OTA3CQEAAAAPZ2V0QXVjdGlvblBoYXNlAAAAAAQAAAAQY3VycmVudEF1Y3Rpb25JZAgFAAAACyR0MDg4NTA4OTA3AAAAAl8xBAAAAA1jdXJyZW50UGVyaW9kCAUAAAALJHQwODg1MDg5MDcAAAACXzIDCQEAAAACIT0AAAACBQAAABBjdXJyZW50QXVjdGlvbklkBQAAAAlhdWN0aW9uSWQJAAACAAAAAQIAAAAYQXVjdGlvbnMgaXMgYWxyZWFkeSBvdmVyAwkBAAAAAiE9AAAAAgUAAAANY3VycmVudFBlcmlvZAUAAAAMUEhBU0VfUkVWRUFMCQAAAgAAAAECAAAAFVJldmVhbCBwZXJpb2QgaXMgb3ZlcgMJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAACXJldmVhbEtleQkAAAIAAAABAgAAABdCaWQgaXMgYWxyZWFkeSByZXZlYWxlZAQAAAAGYmlkS2V5CQEAAAAHa2V5X2JpZAAAAAEFAAAADWJpZGRlckhhc2hLZXkEAAAAB2RlcG9zaXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAZiaWRLZXkJAAEsAAAAAgIAAAATQmlkIGRvZXNuJ3QgZXhpc3RzIAUAAAAEaGFzaAQAAAAGdG9wS2V5CQEAAAAHa2V5X3RvcAAAAAEFAAAABG5hbWUEAAAACnRvcEtleURhdGEJAAQdAAAAAgUAAAAEdGhpcwUAAAAGdG9wS2V5BAAAAAptaW5CaWROYW1lCQEAAAASX2dldFByaWNlRm9yTGVuZ3RoAAAAAQkAATEAAAABBQAAAARuYW1lBAAAAAppc1ZhbGlkQmlkAwMJAABnAAAAAgUAAAAJYmlkQW1vdW50BQAAAAptaW5CaWROYW1lCQAAZwAAAAIFAAAAB2RlcG9zaXQFAAAACWJpZEFtb3VudAcJAQAAAA9pc0F2YWlsYWJsZU5hbWUAAAABBQAAAARuYW1lBwQAAAALcmV2ZWFsZWRCaWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJcmV2ZWFsS2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAGkAAAAAQUAAAAHZGVwb3NpdAIAAAABLAkAAaQAAAABBQAAAAliaWRBbW91bnQCAAAAASwFAAAABG5hbWUFAAAAA25pbAMJAQAAAAEhAAAAAQUAAAAKaXNWYWxpZEJpZAQAAAAJZmVlQW1vdW50CQAAawAAAAMFAAAAB2RlcG9zaXQAAAAAAAAAAAoAAAAAAAAAAGQEAAAAI3JldHVybkRlcG9zaXRXaXRob3V0RmVlQW5kRGVsZXRlQmlkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAABmJpZGRlcgkAAGUAAAACBQAAAAdkZXBvc2l0BQAAAAlmZWVBbW91bnQFAAAABHVuaXQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJY29sbGVjdG9yBQAAAAlmZWVBbW91bnQFAAAABHVuaXQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAGYmlkS2V5BQAAAANuaWwFAAAAI3JldHVybkRlcG9zaXRXaXRob3V0RmVlQW5kRGVsZXRlQmlkAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAACnRvcEtleURhdGEEAAAADSR0MDEwMTIxMTAzMDAEAAAACXRvcFZhbHVlcwkABLUAAAACCQEAAAAFdmFsdWUAAAABBQAAAAp0b3BLZXlEYXRhAgAAAAEsCQAFFAAAAAIJAAGRAAAAAgUAAAAJdG9wVmFsdWVzAAAAAAAAAAAACQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAJdG9wVmFsdWVzAAAAAAAAAAABBAAAAAx0b3BSZXZlYWxLZXkIBQAAAA0kdDAxMDEyMTEwMzAwAAAAAl8xBAAAABJzZWNvbmRUb3BCaWRBbW91bnQIBQAAAA0kdDAxMDEyMTEwMzAwAAAAAl8yBAAAAAxyZXZlYWxlZERhdGEJAQAAAAV2YWx1ZQAAAAEJAAQdAAAAAgUAAAAEdGhpcwUAAAAMdG9wUmV2ZWFsS2V5BAAAAAx0b3BCaWRBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACCQAEtQAAAAIFAAAADHJldmVhbGVkRGF0YQIAAAABLAAAAAAAAAAAAQQAAAANJHQwMTA0NTcxMDc1NQMJAABmAAAAAgUAAAAJYmlkQW1vdW50BQAAAAx0b3BCaWRBbW91bnQJAAUUAAAAAgUAAAAJcmV2ZWFsS2V5BQAAAAx0b3BCaWRBbW91bnQDCQAAZgAAAAIFAAAACWJpZEFtb3VudAUAAAASc2Vjb25kVG9wQmlkQW1vdW50CQAFFAAAAAIFAAAADHRvcFJldmVhbEtleQUAAAAJYmlkQW1vdW50CQAFFAAAAAIFAAAABHVuaXQFAAAABHVuaXQEAAAAD25ld1RvcFJldmVhbEtleQgFAAAADSR0MDEwNDU3MTA3NTUAAAACXzEEAAAAEm5ld1NlY29uZEJpZEFtb3VudAgFAAAADSR0MDEwNDU3MTA3NTUAAAACXzIEAAAADHVwZGF0ZVRvcEtleQQAAAAHJG1hdGNoMAkABRQAAAACBQAAAA9uZXdUb3BSZXZlYWxLZXkFAAAAEm5ld1NlY29uZEJpZEFtb3VudAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAANKFN0cmluZywgSW50KQQAAAAKbmV3VG9wRGF0YQUAAAAHJG1hdGNoMAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAZ0b3BLZXkJAAEsAAAAAgkAASwAAAACCAUAAAAKbmV3VG9wRGF0YQAAAAJfMQIAAAABLAkAAaQAAAABCAUAAAAKbmV3VG9wRGF0YQAAAAJfMgUAAAADbmlsBQAAAANuaWwJAAROAAAAAgUAAAALcmV2ZWFsZWRCaWQFAAAADHVwZGF0ZVRvcEtleQQAAAAMbmV3VG9wQmlkZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAABnRvcEtleQkAASwAAAACCQABLAAAAAIFAAAACXJldmVhbEtleQIAAAABLAkAAaQAAAABBQAAAAptaW5pbWFsQmlkBQAAAANuaWwJAAROAAAAAgUAAAALcmV2ZWFsZWRCaWQFAAAADG5ld1RvcEJpZGRlcgAAAAsAAAADaW52AQAAAARpbml0AAAACQAAAAl0aW1lc3RhbXAAAAALYmlkRHVyYXRpb24AAAAOcmV2ZWFsRHVyYXRpb24AAAAIZXJyb3JGZWUAAAAKbWluaW1hbEJpZAAAABByZWdpc3RyYXJBZGRyZXNzAAAAEW5hbWVNaW5pbWFsTGVuZ3RoAAAAC3BlcmNlbnRSYXRlAAAAEGNvbGxlY3RvckFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAltb2RpZmllcnMAAAABCQAETAAAAAIJAQAAAAlvbmx5QWRtaW4AAAABBQAAAANpbnYJAARMAAAAAgMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQaAAAAAgUAAAAEdGhpcwUAAAARa2V5X2luaXRUaW1lc3RhbXAFAAAABHVuaXQJAAACAAAAAQIAAAAkQXVjdGlvbiBhbHJlYWR5IGhhcyBiZWVuIGluaXRpYWxpemVkCQAETAAAAAIJAQAAABBvbmx5VmFsaWRBZGRyZXNzAAAAAQUAAAAQcmVnaXN0cmFyQWRkcmVzcwkABEwAAAACCQEAAAAQb25seVZhbGlkQWRkcmVzcwAAAAEFAAAAEGNvbGxlY3RvckFkZHJlc3MJAARMAAAAAgkBAAAAD29ubHlQb3NpdGl2ZUludAAAAAIFAAAAC2JpZER1cmF0aW9uAgAAAAxCaWQgZHVyYXRpb24JAARMAAAAAgkBAAAAD29ubHlQb3NpdGl2ZUludAAAAAIFAAAADnJldmVhbER1cmF0aW9uAgAAAA9SZXZlYWwgZHVyYXRpb24JAARMAAAAAgkBAAAAD29ubHlQb3NpdGl2ZUludAAAAAIFAAAACGVycm9yRmVlAgAAAAlFcnJvciBmZWUJAARMAAAAAgkBAAAAD29ubHlQb3NpdGl2ZUludAAAAAIFAAAACm1pbmltYWxCaWQCAAAAC01pbmltYWwgYmlkCQAETAAAAAIJAQAAAA9vbmx5UG9zaXRpdmVJbnQAAAACBQAAAAtwZXJjZW50UmF0ZQIAAAAMUGVyY2VudCByYXRlCQAETAAAAAIDCQAAZgAAAAIFAAAAEW5hbWVNaW5pbWFsTGVuZ3RoAAAAAAAAAAADBQAAAAR1bml0CQAAAgAAAAECAAAAJ01pbmltYWwgbmFtZSBsZW5ndGggbXVzdCBiZSBtb3JlIHRoYW4gMwUAAAADbmlsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrZXlfaW5pdFRpbWVzdGFtcAUAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA9rZXlfYmlkRHVyYXRpb24FAAAAC2JpZER1cmF0aW9uCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJrZXlfcmV2ZWFsRHVyYXRpb24FAAAADnJldmVhbER1cmF0aW9uCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAxrZXlfZXJyb3JGZWUFAAAACGVycm9yRmVlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5rZXlfbWluaW1hbEJpZAUAAAAKbWluaW1hbEJpZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABRrZXlfcmVnaXN0cmFyQWRkcmVzcwUAAAAQcmVnaXN0cmFyQWRkcmVzcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAVa2V5X25hbWVNaW5pbWFsTGVuZ3RoBQAAABFuYW1lTWluaW1hbExlbmd0aAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPa2V5X3BlcmNlbnRSYXRlBQAAAAtwZXJjZW50UmF0ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABRrZXlfY29sbGVjdG9yQWRkcmVzcwUAAAAQY29sbGVjdG9yQWRkcmVzcwUAAAADbmlsAAAAA2ludgEAAAAOZ2V0QXVjdGlvbkJ5SWQAAAABAAAACWF1Y3Rpb25JZAkABRQAAAACBQAAAANuaWwJAQAAAA9fZ2V0QXVjdGlvbkJ5SWQAAAABBQAAAAlhdWN0aW9uSWQAAAADaW52AQAAAAtpc0F2YWlsYWJsZQAAAAEAAAAEbmFtZQkABRQAAAACBQAAAANuaWwJAQAAAA9pc0F2YWlsYWJsZU5hbWUAAAABBQAAAARuYW1lAAAAA2ludgEAAAAPYmlkV2l0aFJlZmVycmVyAAAAAwAAAAlhdWN0aW9uSWQAAAAEaGFzaAAAAAxyZWZlcnJlck5hbWUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAltb2RpZmllcnMAAAABCQAETAAAAAIDCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAR0aGlzCQEAAAATa2V5X3JlZmVycmVyQWRkcmVzcwAAAAEFAAAADHJlZmVycmVyTmFtZQUAAAAEdW5pdAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAKUmVmZXJyZXIgYAUAAAAMcmVmZXJyZXJOYW1lAgAAAAtgIG5v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AAANJHQwMTQ2MTcxNDkxOAAAAAJfMwQAAAAGdG9wS2V5CQEAAAAHa2V5X3RvcAAAAAEFAAAABG5hbWUEAAAACnRvcEtleURhdGEJAAQdAAAAAgUAAAAEdGhpcwUAAAAGdG9wS2V5BAAAAA0kdDAxNTAxMTE1MTc5BAAAAAl0b3BWYWx1ZXMJAAS1AAAAAgkBAAAABXZhbHVlAAAAAQUAAAAKdG9wS2V5RGF0YQIAAAABLAkABRQAAAACCQABkQAAAAIFAAAACXRvcFZhbHVlcwAAAAAAAAAAAAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACXRvcFZhbHVlcwAAAAAAAAAAAQQAAAAMdG9wUmV2ZWFsS2V5CAUAAAANJHQwMTUwMTExNTE3OQAAAAJfMQQAAAASc2Vjb25kVG9wQmlkQW1vdW50CAUAAAANJHQwMTUwMTExNTE3OQAAAAJfMgQAAAANJHQwMTUxODkxNTM1MQQAAAAKd2lubmVySW5mbwkABLUAAAACBQAAAAx0b3BSZXZlYWxLZXkCAAAAAV8JAAUUAAAAAgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACndpbm5lckluZm8AAAAAAAAAAAEJAAGRAAAAAgUAAAAKd2lubmVySW5mbwAAAAAAAAAAAgQAAAAPd2lubmVyQXVjdGlvbklkCAUAAAANJHQwMTUxODkxNTM1MQAAAAJfMQQAAAANd2lubmVyQWRkcmVzcwgFAAAADSR0MDE1MTg5MTUzNTEAAAACXzIEAAAADWRlbGV0ZUVudHJpZXMJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAJcmV2ZWFsS2V5CQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAABmJpZEtleQUAAAADbmlsBAAAABZ0cmFuc2ZlckFuZERlbGV0ZUVudHJ5AwkAAAAAAAACBQAAAAx0b3BSZXZlYWxLZXkFAAAACXJldmVhbEtleQQAAAANJHQwMTU1NTMxNTY1NAkBAAAAGF9yZWZlcnJlclBlcmNlbnRUcmFuc2ZlcgAAAAIFAAAADWJpZGRlckhhc2hLZXkFAAAAEnNlY29uZFRvcEJpZEFtb3VudAQAAAAQcmVmZXJyZXJUcmFuc2ZlcggFAAAADSR0MDE1NTUzMTU2NTQAAAACXzEEAAAAD3JlZmVycmVyUGVyY2VudAgFAAAADSR0MDE1NTUzMTU2NTQAAAACXzIEAAAACGNsYWltTmZ0CQAD/AAAAAQFAAAACXJlZ2lzdHJhcgIAAAAIcmVnaXN0ZXIJAARMAAAAAgUAAAAEbmFtZQkABEwAAAACBQAAAA13aW5uZXJBZGRyZXNzCQAETAAAAAIFAAAACmF1Y3Rpb25FbmQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAhjbGFpbU5mdAUAAAAIY2xhaW1OZnQEAAAABnJlZnVuZAkAAGUAAAACBQAAAAdkZXBvc2l0BQAAABJzZWNvbmRUb3BCaWRBbW91bnQEAAAADXRyYW5zZmVyRGVsdGEDCQAAZgAAAAIFAAAABnJlZnVuZAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAZjYWxsZXIFAAAABnJlZnVuZAUAAAAEdW5pdAUAAAADbmlsBQAAAANuaWwEAAAAEXRyYW5zZmVyQ29sbGVjdG9yCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAACWNvbGxlY3RvcgkAAGUAAAACBQAAABJzZWNvbmRUb3BCaWRBbW91bnQFAAAAD3JlZmVycmVyUGVyY2VudAUAAAAEdW5pdAUAAAADbmlsCQAETgAAAAIJAAROAAAAAgUAAAAQcmVmZXJyZXJUcmFuc2ZlcgUAAAARdHJhbnNmZXJDb2xsZWN0b3IFAAAADXRyYW5zZmVyRGVsdGEJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAABmNhbGxlcgUAAAAHZGVwb3NpdAUAAAAEdW5pdAUAAAADbmlsCQAETgAAAAIJAAROAAAAAgUAAAADYWNjBQAAAA1kZWxldGVFbnRyaWVzBQAAABZ0cmFuc2ZlckFuZERlbGV0ZUVudHJ5CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgoAAAAAAiRsBQAAAAZoYXNoZXMKAAAAAAIkcwkAAZAAAAABBQAAAAIkbAoAAAAABSRhY2MwBQAAAANuaWwKAQAAAAUkZjBfMQAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAQAAAApmb2xkUmVmdW5kAAAAAgUAAAACJGEJAAGRAAAAAgUAAAACJGwFAAAAAiRpCgEAAAAFJGYwXzIAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQAAAgAAAAECAAAAFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEAAAAFJGYwXzIAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACBQAAAAUkYWNjMAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAABQAAAAAAAAAABgAAAAAAAAAABwAAAAAAAAAACAAAAAAAAAAACQAAAAAAAAAACgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAADaW52AQAAAAthZGRSZWZlcnJlcgAAAAMAAAAMcmVmZXJyZXJOYW1lAAAAD3JlZmVycmVyQWRkcmVzcwAAAAdwZXJjZW50CQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAJbW9kaWZpZXJzAAAAAQkABEwAAAACCQEAAAAJb25seUFkbWluAAAAAQUAAAADaW52CQAETAAAAAIJAQAAABBvbmx5VmFsaWRBZGRyZXNzAAAAAQUAAAAPcmVmZXJyZXJBZGRyZXNzCQAETAAAAAIDAwkAAGYAAAACBQAAAAdwZXJjZW50AAAAAAAAAAAACQAAZgAAAAIAAAAAAAAAAGQFAAAAB3BlcmNlbnQHBQAAAAR1bml0CQAAAgAAAAECAAAAIVBlcmNlbnQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMAkABEwAAAACAwkAAGYAAAACCQABMQAAAAEFAAAADHJlZmVycmVyTmFtZQAAAAAAAAAAAAUAAAAEdW5pdAkAAAIAAAABAgAAAB1SZWZlcnJlciBuYW1lIGNhbm5vdCBiZSBlbXB0eQUAAAADbmlsCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABNrZXlfcmVmZXJyZXJBZGRyZXNzAAAAAQUAAAAMcmVmZXJyZXJOYW1lBQAAAA9yZWZlcnJlckFkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABNrZXlfcmVmZXJyZXJQZXJjZW50AAAAAQUAAAAMcmVmZXJyZXJOYW1lBQAAAAdwZXJjZW50BQAAAANuaWwAAAADaW52AQAAAAlyZXZva2VCaWQAAAACAAAACWF1Y3Rpb25JZAAAAARoYXNoBAAAAAZjYWxsZXIIBQAAAANpbnYAAAAGY2FsbGVyBAAAAAljYWxsZXJTdHIJAAQlAAAAAQUAAAAGY2FsbGVyBAAAAAljaGVja0hhc2gJAAJZAAAAAQUAAAAEaGFzaAMJAAAAAAAAAgUAAAAJY2hlY2tIYXNoBQAAAAljaGVja0hhc2gEAAAADWJpZGRlckhhc2hLZXkJAQAAAA5rZXlfYmlkZGVySGFzaAAAAAMJAAGkAAAAAQUAAAAJYXVjdGlvbklkBQAAAAljYWxsZXJTdHIFAAAABGhhc2gEAAAABmJpZEtleQkBAAAAB2tleV9iaWQAAAABBQAAAA1iaWRkZXJIYXNoS2V5BAAAAANiaWQJAAQaAAAAAgUAAAAEdGhpcwUAAAAGYmlkS2V5BAAAAA0kdDAxNzEwNzE3MTY0CQEAAAAPZ2V0QXVjdGlvblBoYXNlAAAAAAQAAAAQY3VycmVudEF1Y3Rpb25JZAgFAAAADSR0MDE3MTA3MTcxNjQAAAACXzEEAAAADWN1cnJlbnRQZXJpb2QIBQAAAA0kdDAxNzEwNzE3MTY0AAAAAl8yAwkBAAAAAiE9AAAAAgUAAAAQY3VycmVudEF1Y3Rpb25JZAUAAAAJYXVjdGlvbklkCQAAAgAAAAECAAAAF0F1Y3Rpb24gaXMgYWxyZWFkeSBvdmVyAwkBAAAAAiE9AAAAAgUAAAANY3VycmVudFBlcmlvZAUAAAAJUEhBU0VfQklECQAAAgAAAAECAAAAGkJpZCBwZXJpb2QgaXMgYWxyZWFkeSBvdmVyAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAADYmlkCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAlCaWQgd2l0aCAFAAAABGhhc2gCAAAACiBub3QgZm91bmQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAGY2FsbGVyCQEAAAAFdmFsdWUAAAABBQAAAANiaWQFAAAABHVuaXQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAGYmlkS2V5BQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAA2ludgEAAAAUc2V0TmV4dE1pbmltYWxMZW5ndGgAAAACAAAACWF1Y3Rpb25JZAAAAA1taW5pbWFsTGVuZ2h0CQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAJbW9kaWZpZXJzAAAAAQkABEwAAAACCQEAAAAJb25seUFkbWluAAAAAQUAAAADaW52BQAAAANuaWwEAAAAEW5leHRNaW5pbWFsTGVuZ3RoCQAEHQAAAAIFAAAABHRoaXMFAAAAGWtleV9uZXh0TmFtZU1pbmltYWxMZW5ndGgDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAARbmV4dE1pbmltYWxMZW5ndGgEAAAADSR0MDE3Nzg0MTc5NjUEAAAABnZhbHVlcwkABLUAAAACCQEAAAAFdmFsdWUAAAABBQAAABFuZXh0TWluaW1hbExlbmd0aAIAAAABLAkABRQAAAACCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAGdmFsdWVzAAAAAAAAAAAACQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAGdmFsdWVzAAAAAAAAAAABBAAAAA1uZXh0QXVjdGlvbklkCAUAAAANJHQwMTc3ODQxNzk2NQAAAAJfMQQAAAARbmV4dE1pbmltYWxMZW5naHQIBQAAAA0kdDAxNzc4NDE3OTY1AAAAAl8yCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABVrZXlfbmFtZU1pbmltYWxMZW5ndGgFAAAAEW5leHRNaW5pbWFsTGVuZ2h0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAGWtleV9uZXh0TmFtZU1pbmltYWxMZW5ndGgJAAEsAAAAAgkAASwAAAACCQABpAAAAAEFAAAACWF1Y3Rpb25JZAIAAAABLAkAAaQAAAABBQAAAA1taW5pbWFsTGVuZ2h0BQAAAANuaWwJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAZa2V5X25leHROYW1lTWluaW1hbExlbmd0aAkAASwAAAACCQABLAAAAAIJAAGkAAAAAQUAAAAJYXVjdGlvbklkAgAAAAEsCQABpAAAAAEFAAAADW1pbmltYWxMZW5naHQFAAAAA25pbAAAAACHMvBt", "height": 2342716, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Fo6g4422nH9WwGmwxpcm5VyCW3wPq3k4SMu2aEuuFg7U Next: 7GGyHkZKoitSErQsNkje4RgfvNGfiyRWMGE83hHJW7GR Diff:
OldNewDifferences
4646 func key_referrerPercent (name) = (("Referrer_" + name) + "_percent")
4747
4848
49+func key_lengthPrice (length) = ("Length_" + toString(length))
50+
51+
4952 let key_initTimestamp = "initTimestamp"
5053
5154 let key_bidDuration = "bidDuration"
6366 let key_percentRate = "percentRate"
6467
6568 let key_collectorAddress = "collectorAddress"
69+
70+let key_nextNameMinimalLength = "nextNameMinimalLength"
71+
72+let key_lengthPrices = "lengthPrices"
6673
6774 let auctionStart = getIntegerOrThrow(this, key_initTimestamp)
6875
104111 let bidReferrerName = getString(this, bidReferrerKey)
105112 if (isDefined(bidReferrerName))
106113 then {
107- let $t032073282 = _getReferrerData(value(bidReferrerName))
108- let referrer = $t032073282._1
109- let referrerPercent = $t032073282._2
114+ let $t033673442 = _getReferrerData(value(bidReferrerName))
115+ let referrer = $t033673442._1
116+ let referrerPercent = $t033673442._2
110117 let referrerPercentAmount = fraction(bidAmount, referrerPercent, 100)
111118 $Tuple2([ScriptTransfer(referrer, referrerPercentAmount, unit), DeleteEntry(bidReferrerKey)], referrerPercentAmount)
112119 }
142149
143150 let PHASE_REVEAL = "REVEAL"
144151
152+func _getPriceForLength (length) = {
153+ let lengthPrices = getInteger(this, key_lengthPrice(length))
154+ if (isDefined(lengthPrices))
155+ then value(lengthPrices)
156+ else minimalBid
157+ }
158+
159+
160+func _getAllPrices () = {
161+ let price6 = getInteger(this, key_lengthPrice(6))
162+ let price5 = getInteger(this, key_lengthPrice(5))
163+ let price4 = getInteger(this, key_lengthPrice(4))
164+ let price3 = getInteger(this, key_lengthPrice(3))
165+ let price2 = getInteger(this, key_lengthPrice(2))
166+ let price1 = getInteger(this, key_lengthPrice(1))
167+ ([minimalBid] ++ (if (isDefined(price6))
168+ then [value(price6)]
169+ else (nil ++ (if (isDefined(price5))
170+ then [value(price5)]
171+ else (nil ++ (if (isDefined(price4))
172+ then [value(price4)]
173+ else (nil ++ (if (isDefined(price3))
174+ then [value(price3)]
175+ else (nil ++ (if (isDefined(price2))
176+ then [value(price2)]
177+ else (nil ++ (if (isDefined(price1))
178+ then [value(price1)]
179+ else nil))))))))))))
180+ }
181+
182+
183+func _getMinimalLength (auctionId) = {
184+ let nextNameMinimalLength = getString(this, key_nextNameMinimalLength)
185+ if (!(isDefined(nextNameMinimalLength)))
186+ then {
187+ let $t055625747 = {
188+ let values = split(value(nextNameMinimalLength), ",")
189+ $Tuple2(parseIntValue(values[0]), parseIntValue(values[1]))
190+ }
191+ let nextAuctionId = $t055625747._1
192+ let nextMinimalLenght = $t055625747._2
193+ if ((auctionId >= nextAuctionId))
194+ then nextMinimalLenght
195+ else nameMinimalLength
196+ }
197+ else nameMinimalLength
198+ }
199+
200+
145201 func _getAuctionById (auctionId) = {
146- let bidStart = (auctionStart + (auctionId * auctionDuration))
202+ let bidStart = (auctionStart + ((auctionId - 1) * auctionDuration))
147203 let revealStart = (bidStart + bidDuration)
148204 let auctionEnd = (revealStart + revealDuration)
149205 let phase = if ((lastBlock.timestamp > revealStart))
150206 then PHASE_REVEAL
151207 else PHASE_BID
152- $Tuple5(auctionId, phase, bidStart, revealStart, auctionEnd)
208+ let minimalLength = _getMinimalLength(auctionId)
209+ let prices = _getAllPrices()
210+ $Tuple7(auctionId, phase, bidStart, revealStart, auctionEnd, minimalLength, prices)
153211 }
154212
155213
156214 func getAuction () = {
157- let auctionId = ((lastBlock.timestamp - auctionStart) / auctionDuration)
215+ let auctionId = (((lastBlock.timestamp - auctionStart) / auctionDuration) + 1)
158216 _getAuctionById(auctionId)
159217 }
160218
161219
162-func getAuctionPhase () = match getAuction() {
163- case auction: (Int, String, Int, Int, Int) =>
164- let auctionId = auction._1
165- let phase = auction._2
166- $Tuple2(auctionId, phase)
167- case _ =>
168- throw("Invalid auction info")
169-}
220+func getAuctionPhase () = {
221+ let auction = getAuction()
222+ let auctionId = auction._1
223+ let phase = auction._2
224+ $Tuple2(auctionId, phase)
225+ }
170226
171227
172228 func isValidName (name) = {
176232 case _ =>
177233 throw("Unsupported result format (available)")
178234 }
235+ let minimalLenght = getAuction()._6
179236 if (isValid)
180- then (size(name) >= nameMinimalLength)
237+ then (size(name) >= minimalLenght)
181238 else false
182239 }
183240
216273 else false)
217274 then inv.payments[0].amount
218275 else throw("Single payment required")
219- let callerAddress = toString(inv.caller)
220- let bidKey = key_bid(key_bidderHash(toString(auctionId), callerAddress, hash))
221- let $t063656422 = getAuctionPhase()
222- let currentAuctionId = $t063656422._1
223- let currentPeriod = $t063656422._2
276+ let checkHash = fromBase58String(hash)
277+ if ((checkHash == checkHash))
278+ then {
279+ let callerAddress = toString(inv.caller)
280+ let bidKey = key_bid(key_bidderHash(toString(auctionId), callerAddress, hash))
281+ let $t081088165 = getAuctionPhase()
282+ let currentAuctionId = $t081088165._1
283+ let currentPeriod = $t081088165._2
284+ if ((currentAuctionId != auctionId))
285+ then throw("Auctions is already over")
286+ else if ((currentPeriod != PHASE_BID))
287+ then throw("Bid period is over")
288+ else if (isDefined(getInteger(this, bidKey)))
289+ then throw("Bid with exact amount already presented")
290+ else [IntegerEntry(bidKey, pmt)]
291+ }
292+ else throw("Strict value is not equal to itself.")
293+ }
294+
295+
296+func _reveal (bidder,auctionId,name,bidAmount,secret) = {
297+ let bidderAddress = toString(bidder)
298+ let hash = calcHash(name, bidAmount, bidderAddress, secret)
299+ let bidderHashKey = key_bidderHash(toString(auctionId), bidderAddress, hash)
300+ let revealKey = key_reveal(bidderHashKey)
301+ let $t088508907 = getAuctionPhase()
302+ let currentAuctionId = $t088508907._1
303+ let currentPeriod = $t088508907._2
224304 if ((currentAuctionId != auctionId))
225305 then throw("Auctions is already over")
226- else if ((currentPeriod != PHASE_BID))
227- then throw("Bid period is over")
228- else if (isDefined(getInteger(this, bidKey)))
229- then throw("Bid with exact amount already presented")
230- else [IntegerEntry(bidKey, pmt)]
306+ else if ((currentPeriod != PHASE_REVEAL))
307+ then throw("Reveal period is over")
308+ else if (isDefined(getString(this, revealKey)))
309+ then throw("Bid is already revealed")
310+ else {
311+ let bidKey = key_bid(bidderHashKey)
312+ let deposit = valueOrErrorMessage(getInteger(this, bidKey), ("Bid doesn't exists " + hash))
313+ let topKey = key_top(name)
314+ let topKeyData = getString(this, topKey)
315+ let minBidName = _getPriceForLength(size(name))
316+ let isValidBid = if (if ((bidAmount >= minBidName))
317+ then (deposit >= bidAmount)
318+ else false)
319+ then isAvailableName(name)
320+ else false
321+ let revealedBid = [StringEntry(revealKey, ((((toString(deposit) + ",") + toString(bidAmount)) + ",") + name))]
322+ if (!(isValidBid))
323+ then {
324+ let feeAmount = fraction(deposit, 10, 100)
325+ let returnDepositWithoutFeeAndDeleteBid = [ScriptTransfer(bidder, (deposit - feeAmount), unit), ScriptTransfer(collector, feeAmount, unit), DeleteEntry(bidKey)]
326+ returnDepositWithoutFeeAndDeleteBid
327+ }
328+ else if (isDefined(topKeyData))
329+ then {
330+ let $t01012110300 = {
331+ let topValues = split(value(topKeyData), ",")
332+ $Tuple2(topValues[0], parseIntValue(topValues[1]))
333+ }
334+ let topRevealKey = $t01012110300._1
335+ let secondTopBidAmount = $t01012110300._2
336+ let revealedData = value(getString(this, topRevealKey))
337+ let topBidAmount = parseIntValue(split(revealedData, ",")[1])
338+ let $t01045710755 = if ((bidAmount > topBidAmount))
339+ then $Tuple2(revealKey, topBidAmount)
340+ else if ((bidAmount > secondTopBidAmount))
341+ then $Tuple2(topRevealKey, bidAmount)
342+ else $Tuple2(unit, unit)
343+ let newTopRevealKey = $t01045710755._1
344+ let newSecondBidAmount = $t01045710755._2
345+ let updateTopKey = match $Tuple2(newTopRevealKey, newSecondBidAmount) {
346+ case newTopData: (String, Int) =>
347+[StringEntry(topKey, ((newTopData._1 + ",") + toString(newTopData._2)))]
348+ case _ =>
349+ nil
350+ }
351+ (revealedBid ++ updateTopKey)
352+ }
353+ else {
354+ let newTopBidder = [StringEntry(topKey, ((revealKey + ",") + toString(minimalBid)))]
355+ (revealedBid ++ newTopBidder)
356+ }
357+ }
231358 }
232359
233360
267394
268395
269396 @Callable(inv)
270-func reveal (auctionId,name,bidAmount,secret) = {
271- let caller = inv.caller
272- let callerAddress = toString(caller)
273- let hash = calcHash(name, bidAmount, callerAddress, secret)
274- let bidderHashKey = key_bidderHash(toString(auctionId), callerAddress, hash)
275- let revealKey = key_reveal(bidderHashKey)
276- let $t093159372 = getAuctionPhase()
277- let currentAuctionId = $t093159372._1
278- let currentPeriod = $t093159372._2
279- if ((currentAuctionId != auctionId))
280- then throw("Auctions is already over")
281- else if ((currentPeriod != PHASE_REVEAL))
282- then throw("Reveal period is over")
283- else if (isDefined(getString(this, revealKey)))
284- then throw("Bid is already revealed")
285- else {
286- let bidKey = key_bid(bidderHashKey)
287- let deposit = valueOrErrorMessage(getInteger(this, bidKey), ("Bid doesn't exists " + hash))
288- let topKey = key_top(name)
289- let topKeyData = getString(this, topKey)
290- let isValidBid = if (if ((bidAmount >= minimalBid))
291- then (deposit >= bidAmount)
292- else false)
293- then isAvailableName(name)
294- else false
295- let revealedBid = [StringEntry(revealKey, ((((toString(deposit) + ",") + toString(bidAmount)) + ",") + name))]
296- if (!(isValidBid))
297- then {
298- let feeAmount = fraction(deposit, 10, 100)
299- let returnDepositWithoutFeeAndDeleteBid = [ScriptTransfer(caller, (deposit - feeAmount), unit), ScriptTransfer(collector, feeAmount, unit), DeleteEntry(bidKey)]
300- returnDepositWithoutFeeAndDeleteBid
301- }
302- else if (isDefined(topKeyData))
303- then {
304- let $t01054210722 = {
305- let topValues = split(value(topKeyData), ",")
306- $Tuple2(topValues[0], parseIntValue(topValues[1]))
307- }
308- let topRevealKey = $t01054210722._1
309- let secondTopBidAmount = $t01054210722._2
310- let revealedData = value(getString(this, topRevealKey))
311- let topBidAmount = parseIntValue(split(revealedData, ",")[1])
312- let $t01089111191 = if ((bidAmount > topBidAmount))
313- then $Tuple2(revealKey, topBidAmount)
314- else if ((bidAmount > secondTopBidAmount))
315- then $Tuple2(topRevealKey, bidAmount)
316- else $Tuple2(unit, unit)
317- let newTopRevealKey = $t01089111191._1
318- let newSecondBidAmount = $t01089111191._2
319- let updateTopKey = match $Tuple2(newTopRevealKey, newSecondBidAmount) {
320- case newTopData: (String, Int) =>
321-[StringEntry(topKey, ((newTopData._1 + ",") + toString(newTopData._2)))]
322- case _ =>
323- nil
324- }
325- (revealedBid ++ updateTopKey)
326- }
327- else {
328- let newTopBidder = [StringEntry(topKey, ((revealKey + ",") + toString(minimalBid)))]
329- (revealedBid ++ newTopBidder)
330- }
331- }
332- }
397+func reveal (auctionId,name,bidAmount,secret) = _reveal(inv.caller, auctionId, name, bidAmount, secret)
398+
399+
400+
401+@Callable(inv)
402+func revealForBidder (bidder,auctionId,name,bidAmount,secret) = _reveal(valueOrErrorMessage(addressFromString(bidder), "Bidder must be valid address"), auctionId, name, bidAmount, secret)
333403
334404
335405
344414 let caller = inv.caller
345415 let callerAddress = toString(caller)
346416 func foldRefund (acc,hash) = {
347- let bidderHashKey = key_bidderHash(toString(auctionId), callerAddress, hash)
348- let bidKey = key_bid(bidderHashKey)
349- let revealKey = key_reveal(bidderHashKey)
350- let revealedBid = getString(this, revealKey)
351- let $t01232312624 = {
352- let bidValues = split(valueOrErrorMessage(revealedBid, (("Bid with hash " + hash) + " not found")), ",")
353- $Tuple3(parseIntValue(bidValues[0]), parseIntValue(bidValues[1]), bidValues[2])
354- }
355- let deposit = $t01232312624._1
356- let bidAmount = $t01232312624._2
357- let name = $t01232312624._3
358- let topKey = key_top(name)
359- let topKeyData = getString(this, topKey)
360- let $t01271712885 = {
361- let topValues = split(value(topKeyData), ",")
362- $Tuple2(topValues[0], parseIntValue(topValues[1]))
363- }
364- let topRevealKey = $t01271712885._1
365- let secondTopBidAmount = $t01271712885._2
366- let $t01289513057 = {
367- let winnerInfo = split(topRevealKey, "_")
368- $Tuple2(parseIntValue(winnerInfo[1]), winnerInfo[2])
369- }
370- let winnerAuctionId = $t01289513057._1
371- let winnerAddress = $t01289513057._2
372- let deleteEntries = [DeleteEntry(revealKey), DeleteEntry(bidKey)]
373- let transferAndDeleteEntry = if ((topRevealKey == revealKey))
417+ let checkHash = fromBase58String(hash)
418+ if ((checkHash == checkHash))
374419 then {
375- let $t01325913360 = _referrerPercentTransfer(bidderHashKey, secondTopBidAmount)
376- let referrerTransfer = $t01325913360._1
377- let referrerPercent = $t01325913360._2
378- let claimNft = invoke(registrar, "register", [name, winnerAddress, auctionEnd], nil)
379- if ((claimNft == claimNft))
420+ let bidderHashKey = key_bidderHash(toString(auctionId), callerAddress, hash)
421+ let bidKey = key_bid(bidderHashKey)
422+ let revealKey = key_reveal(bidderHashKey)
423+ let revealedBid = getString(this, revealKey)
424+ let $t01461714918 = {
425+ let bidValues = split(valueOrErrorMessage(revealedBid, (("Bid with hash " + hash) + " not found")), ",")
426+ $Tuple3(parseIntValue(bidValues[0]), parseIntValue(bidValues[1]), bidValues[2])
427+ }
428+ let deposit = $t01461714918._1
429+ let bidAmount = $t01461714918._2
430+ let name = $t01461714918._3
431+ let topKey = key_top(name)
432+ let topKeyData = getString(this, topKey)
433+ let $t01501115179 = {
434+ let topValues = split(value(topKeyData), ",")
435+ $Tuple2(topValues[0], parseIntValue(topValues[1]))
436+ }
437+ let topRevealKey = $t01501115179._1
438+ let secondTopBidAmount = $t01501115179._2
439+ let $t01518915351 = {
440+ let winnerInfo = split(topRevealKey, "_")
441+ $Tuple2(parseIntValue(winnerInfo[1]), winnerInfo[2])
442+ }
443+ let winnerAuctionId = $t01518915351._1
444+ let winnerAddress = $t01518915351._2
445+ let deleteEntries = [DeleteEntry(revealKey), DeleteEntry(bidKey)]
446+ let transferAndDeleteEntry = if ((topRevealKey == revealKey))
380447 then {
381- let transferDelta = [ScriptTransfer(caller, (deposit - secondTopBidAmount), unit), ScriptTransfer(collector, (secondTopBidAmount - referrerPercent), unit)]
382- (referrerTransfer ++ transferDelta)
448+ let $t01555315654 = _referrerPercentTransfer(bidderHashKey, secondTopBidAmount)
449+ let referrerTransfer = $t01555315654._1
450+ let referrerPercent = $t01555315654._2
451+ let claimNft = invoke(registrar, "register", [name, winnerAddress, auctionEnd], nil)
452+ if ((claimNft == claimNft))
453+ then {
454+ let refund = (deposit - secondTopBidAmount)
455+ let transferDelta = if ((refund > 0))
456+ then [ScriptTransfer(caller, refund, unit)]
457+ else nil
458+ let transferCollector = [ScriptTransfer(collector, (secondTopBidAmount - referrerPercent), unit)]
459+ ((referrerTransfer ++ transferCollector) ++ transferDelta)
460+ }
461+ else throw("Strict value is not equal to itself.")
383462 }
384- else throw("Strict value is not equal to itself.")
463+ else [ScriptTransfer(caller, deposit, unit)]
464+ ((acc ++ deleteEntries) ++ transferAndDeleteEntry)
385465 }
386- else [ScriptTransfer(caller, deposit, unit)]
387- ((acc ++ deleteEntries) ++ transferAndDeleteEntry)
466+ else throw("Strict value is not equal to itself.")
388467 }
389468
390469 let $l = hashes
420499 func revokeBid (auctionId,hash) = {
421500 let caller = inv.caller
422501 let callerStr = toString(caller)
423- let bidderHashKey = key_bidderHash(toString(auctionId), callerStr, hash)
424- let bidKey = key_bid(bidderHashKey)
425- let bid = getInteger(this, bidKey)
426- let $t01469214749 = getAuctionPhase()
427- let currentAuctionId = $t01469214749._1
428- let currentPeriod = $t01469214749._2
429- if ((currentAuctionId != auctionId))
430- then throw("Auction is already over")
431- else if ((currentPeriod != PHASE_BID))
432- then throw("Bid period is already over")
433- else if (!(isDefined(bid)))
434- then throw((("Bid with " + hash) + " not found"))
435- else [ScriptTransfer(caller, value(bid), unit), DeleteEntry(bidKey)]
502+ let checkHash = fromBase58String(hash)
503+ if ((checkHash == checkHash))
504+ then {
505+ let bidderHashKey = key_bidderHash(toString(auctionId), callerStr, hash)
506+ let bidKey = key_bid(bidderHashKey)
507+ let bid = getInteger(this, bidKey)
508+ let $t01710717164 = getAuctionPhase()
509+ let currentAuctionId = $t01710717164._1
510+ let currentPeriod = $t01710717164._2
511+ if ((currentAuctionId != auctionId))
512+ then throw("Auction is already over")
513+ else if ((currentPeriod != PHASE_BID))
514+ then throw("Bid period is already over")
515+ else if (!(isDefined(bid)))
516+ then throw((("Bid with " + hash) + " not found"))
517+ else [ScriptTransfer(caller, value(bid), unit), DeleteEntry(bidKey)]
518+ }
519+ else throw("Strict value is not equal to itself.")
436520 }
521+
522+
523+
524+@Callable(inv)
525+func setNextMinimalLength (auctionId,minimalLenght) = valueOrElse(modifiers([onlyAdmin(inv)]), {
526+ let nextMinimalLength = getString(this, key_nextNameMinimalLength)
527+ if (isDefined(nextMinimalLength))
528+ then {
529+ let $t01778417965 = {
530+ let values = split(value(nextMinimalLength), ",")
531+ $Tuple2(parseIntValue(values[0]), parseIntValue(values[1]))
532+ }
533+ let nextAuctionId = $t01778417965._1
534+ let nextMinimalLenght = $t01778417965._2
535+[IntegerEntry(key_nameMinimalLength, nextMinimalLenght), StringEntry(key_nextNameMinimalLength, ((toString(auctionId) + ",") + toString(minimalLenght)))]
536+ }
537+ else [StringEntry(key_nextNameMinimalLength, ((toString(auctionId) + ",") + toString(minimalLenght)))]
538+ })
437539
438540
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getIntegerOrThrow (address,key) = valueOrErrorMessage(getInteger(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
55
66
77 func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
88
99
1010 func getIntegerOrDefault (address,key,default) = valueOrElse(getInteger(address, key), default)
1111
1212
1313 func parseIntOrThrow (maybeInt) = valueOrErrorMessage(parseInt(maybeInt), (("Can't parse integer from '" + maybeInt) + "'"))
1414
1515
1616 func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'"))
1717
1818
1919 func parseIntOrDefault (maybeInt,default) = valueOrElse(parseInt(maybeInt), default)
2020
2121
2222 func key_entity (name,pk,property) = ((((name + "_") + pk) + "_") + property)
2323
2424
2525 func key_top (name) = ("Top_" + name)
2626
2727
2828 func key_top2 (name) = ("Top2_" + name)
2929
3030
3131 func key_bidderHash (auctionId,address,hash) = ((((auctionId + "_") + address) + "_") + hash)
3232
3333
3434 func key_bid (bidderHash) = ("Bid_" + bidderHash)
3535
3636
3737 func key_reveal (bidderHash) = ("Reveal_" + bidderHash)
3838
3939
4040 func key_referrer (bidderHash) = ("Referrer_" + bidderHash)
4141
4242
4343 func key_referrerAddress (name) = (("Referrer_" + name) + "_address")
4444
4545
4646 func key_referrerPercent (name) = (("Referrer_" + name) + "_percent")
4747
4848
49+func key_lengthPrice (length) = ("Length_" + toString(length))
50+
51+
4952 let key_initTimestamp = "initTimestamp"
5053
5154 let key_bidDuration = "bidDuration"
5255
5356 let key_revealDuration = "revealDuration"
5457
5558 let key_errorFee = "errorFee"
5659
5760 let key_minimalBid = "minimalBid"
5861
5962 let key_registrarAddress = "registrarAddress"
6063
6164 let key_nameMinimalLength = "nameMinimalLength"
6265
6366 let key_percentRate = "percentRate"
6467
6568 let key_collectorAddress = "collectorAddress"
69+
70+let key_nextNameMinimalLength = "nextNameMinimalLength"
71+
72+let key_lengthPrices = "lengthPrices"
6673
6774 let auctionStart = getIntegerOrThrow(this, key_initTimestamp)
6875
6976 let bidDuration = getIntegerOrThrow(this, key_bidDuration)
7077
7178 let revealDuration = getIntegerOrThrow(this, key_revealDuration)
7279
7380 let auctionDuration = (bidDuration + revealDuration)
7481
7582 let errorFee = getIntegerOrThrow(this, key_errorFee)
7683
7784 let minimalBid = getIntegerOrThrow(this, key_minimalBid)
7885
7986 let nameMinimalLength = getIntegerOrThrow(this, key_nameMinimalLength)
8087
8188 let percentRate = getIntegerOrThrow(this, key_percentRate)
8289
8390 let registrarAddress = getStringOrThrow(this, key_registrarAddress)
8491
8592 let registrar = parseAddressOrThrow(registrarAddress)
8693
8794 let collectorAddress = getStringOrThrow(this, key_collectorAddress)
8895
8996 let collector = parseAddressOrThrow(collectorAddress)
9097
9198 func _getReferrerData (referrerName) = {
9299 let refAddress = parseAddressOrThrow(getStringOrThrow(this, key_referrerAddress(referrerName)))
93100 let refPercent = valueOrElse(getInteger(this, key_referrerPercent(referrerName)), percentRate)
94101 if (if ((0 > refPercent))
95102 then true
96103 else (refPercent > 100))
97104 then throw("Incorrect percent rate")
98105 else $Tuple2(refAddress, refPercent)
99106 }
100107
101108
102109 func _referrerPercentTransfer (bidderHashKey,bidAmount) = {
103110 let bidReferrerKey = key_referrer(bidderHashKey)
104111 let bidReferrerName = getString(this, bidReferrerKey)
105112 if (isDefined(bidReferrerName))
106113 then {
107- let $t032073282 = _getReferrerData(value(bidReferrerName))
108- let referrer = $t032073282._1
109- let referrerPercent = $t032073282._2
114+ let $t033673442 = _getReferrerData(value(bidReferrerName))
115+ let referrer = $t033673442._1
116+ let referrerPercent = $t033673442._2
110117 let referrerPercentAmount = fraction(bidAmount, referrerPercent, 100)
111118 $Tuple2([ScriptTransfer(referrer, referrerPercentAmount, unit), DeleteEntry(bidReferrerKey)], referrerPercentAmount)
112119 }
113120 else $Tuple2(nil, 0)
114121 }
115122
116123
117124 func calcHash (name,amount,bidSender,secret) = toBase58String(blake2b256_16Kb(keccak256_16Kb((((toBytes(name) + toBytes(amount)) + fromBase58String(bidSender)) + secret))))
118125
119126
120127 func modifiers (validations) = unit
121128
122129
123130 func isAdmin (inv) = (inv.caller == this)
124131
125132
126133 func onlyAdmin (inv) = if (isAdmin(inv))
127134 then unit
128135 else throw("Permission denied")
129136
130137
131138 func onlyValidAddress (maybeAddress) = if (isDefined(addressFromString(maybeAddress)))
132139 then unit
133140 else throw((maybeAddress + " is not a valid address"))
134141
135142
136143 func onlyPositiveInt (number,variable) = if ((number > 0))
137144 then unit
138145 else throw((variable + " must be greter than 0"))
139146
140147
141148 let PHASE_BID = "BID"
142149
143150 let PHASE_REVEAL = "REVEAL"
144151
152+func _getPriceForLength (length) = {
153+ let lengthPrices = getInteger(this, key_lengthPrice(length))
154+ if (isDefined(lengthPrices))
155+ then value(lengthPrices)
156+ else minimalBid
157+ }
158+
159+
160+func _getAllPrices () = {
161+ let price6 = getInteger(this, key_lengthPrice(6))
162+ let price5 = getInteger(this, key_lengthPrice(5))
163+ let price4 = getInteger(this, key_lengthPrice(4))
164+ let price3 = getInteger(this, key_lengthPrice(3))
165+ let price2 = getInteger(this, key_lengthPrice(2))
166+ let price1 = getInteger(this, key_lengthPrice(1))
167+ ([minimalBid] ++ (if (isDefined(price6))
168+ then [value(price6)]
169+ else (nil ++ (if (isDefined(price5))
170+ then [value(price5)]
171+ else (nil ++ (if (isDefined(price4))
172+ then [value(price4)]
173+ else (nil ++ (if (isDefined(price3))
174+ then [value(price3)]
175+ else (nil ++ (if (isDefined(price2))
176+ then [value(price2)]
177+ else (nil ++ (if (isDefined(price1))
178+ then [value(price1)]
179+ else nil))))))))))))
180+ }
181+
182+
183+func _getMinimalLength (auctionId) = {
184+ let nextNameMinimalLength = getString(this, key_nextNameMinimalLength)
185+ if (!(isDefined(nextNameMinimalLength)))
186+ then {
187+ let $t055625747 = {
188+ let values = split(value(nextNameMinimalLength), ",")
189+ $Tuple2(parseIntValue(values[0]), parseIntValue(values[1]))
190+ }
191+ let nextAuctionId = $t055625747._1
192+ let nextMinimalLenght = $t055625747._2
193+ if ((auctionId >= nextAuctionId))
194+ then nextMinimalLenght
195+ else nameMinimalLength
196+ }
197+ else nameMinimalLength
198+ }
199+
200+
145201 func _getAuctionById (auctionId) = {
146- let bidStart = (auctionStart + (auctionId * auctionDuration))
202+ let bidStart = (auctionStart + ((auctionId - 1) * auctionDuration))
147203 let revealStart = (bidStart + bidDuration)
148204 let auctionEnd = (revealStart + revealDuration)
149205 let phase = if ((lastBlock.timestamp > revealStart))
150206 then PHASE_REVEAL
151207 else PHASE_BID
152- $Tuple5(auctionId, phase, bidStart, revealStart, auctionEnd)
208+ let minimalLength = _getMinimalLength(auctionId)
209+ let prices = _getAllPrices()
210+ $Tuple7(auctionId, phase, bidStart, revealStart, auctionEnd, minimalLength, prices)
153211 }
154212
155213
156214 func getAuction () = {
157- let auctionId = ((lastBlock.timestamp - auctionStart) / auctionDuration)
215+ let auctionId = (((lastBlock.timestamp - auctionStart) / auctionDuration) + 1)
158216 _getAuctionById(auctionId)
159217 }
160218
161219
162-func getAuctionPhase () = match getAuction() {
163- case auction: (Int, String, Int, Int, Int) =>
164- let auctionId = auction._1
165- let phase = auction._2
166- $Tuple2(auctionId, phase)
167- case _ =>
168- throw("Invalid auction info")
169-}
220+func getAuctionPhase () = {
221+ let auction = getAuction()
222+ let auctionId = auction._1
223+ let phase = auction._2
224+ $Tuple2(auctionId, phase)
225+ }
170226
171227
172228 func isValidName (name) = {
173229 let isValid = match invoke(registrar, "isValid", [name], nil) {
174230 case a: Boolean =>
175231 a
176232 case _ =>
177233 throw("Unsupported result format (available)")
178234 }
235+ let minimalLenght = getAuction()._6
179236 if (isValid)
180- then (size(name) >= nameMinimalLength)
237+ then (size(name) >= minimalLenght)
181238 else false
182239 }
183240
184241
185242 func isRegistrableName (name) = match invoke(registrar, "isAvailable", [name], nil) {
186243 case a: Boolean =>
187244 a
188245 case _ =>
189246 throw("Unsupported result format (available)")
190247 }
191248
192249
193250 func isWinnableName (name) = {
194251 let revealKey = getString(this, key_top(name))
195252 if (!(isDefined(revealKey)))
196253 then true
197254 else {
198255 let currentAuction = getAuctionPhase()._1
199256 let topAuctionId = split(value(revealKey), "_")[1]
200257 let auctionId = parseIntOrDefault(topAuctionId, 0)
201258 (auctionId == currentAuction)
202259 }
203260 }
204261
205262
206263 func isAvailableName (name) = if (if (isRegistrableName(name))
207264 then isWinnableName(name)
208265 else false)
209266 then isValidName(name)
210267 else false
211268
212269
213270 func _bid (inv,auctionId,hash) = {
214271 let pmt = if (if ((size(inv.payments) == 1))
215272 then (inv.payments[0].assetId == unit)
216273 else false)
217274 then inv.payments[0].amount
218275 else throw("Single payment required")
219- let callerAddress = toString(inv.caller)
220- let bidKey = key_bid(key_bidderHash(toString(auctionId), callerAddress, hash))
221- let $t063656422 = getAuctionPhase()
222- let currentAuctionId = $t063656422._1
223- let currentPeriod = $t063656422._2
276+ let checkHash = fromBase58String(hash)
277+ if ((checkHash == checkHash))
278+ then {
279+ let callerAddress = toString(inv.caller)
280+ let bidKey = key_bid(key_bidderHash(toString(auctionId), callerAddress, hash))
281+ let $t081088165 = getAuctionPhase()
282+ let currentAuctionId = $t081088165._1
283+ let currentPeriod = $t081088165._2
284+ if ((currentAuctionId != auctionId))
285+ then throw("Auctions is already over")
286+ else if ((currentPeriod != PHASE_BID))
287+ then throw("Bid period is over")
288+ else if (isDefined(getInteger(this, bidKey)))
289+ then throw("Bid with exact amount already presented")
290+ else [IntegerEntry(bidKey, pmt)]
291+ }
292+ else throw("Strict value is not equal to itself.")
293+ }
294+
295+
296+func _reveal (bidder,auctionId,name,bidAmount,secret) = {
297+ let bidderAddress = toString(bidder)
298+ let hash = calcHash(name, bidAmount, bidderAddress, secret)
299+ let bidderHashKey = key_bidderHash(toString(auctionId), bidderAddress, hash)
300+ let revealKey = key_reveal(bidderHashKey)
301+ let $t088508907 = getAuctionPhase()
302+ let currentAuctionId = $t088508907._1
303+ let currentPeriod = $t088508907._2
224304 if ((currentAuctionId != auctionId))
225305 then throw("Auctions is already over")
226- else if ((currentPeriod != PHASE_BID))
227- then throw("Bid period is over")
228- else if (isDefined(getInteger(this, bidKey)))
229- then throw("Bid with exact amount already presented")
230- else [IntegerEntry(bidKey, pmt)]
306+ else if ((currentPeriod != PHASE_REVEAL))
307+ then throw("Reveal period is over")
308+ else if (isDefined(getString(this, revealKey)))
309+ then throw("Bid is already revealed")
310+ else {
311+ let bidKey = key_bid(bidderHashKey)
312+ let deposit = valueOrErrorMessage(getInteger(this, bidKey), ("Bid doesn't exists " + hash))
313+ let topKey = key_top(name)
314+ let topKeyData = getString(this, topKey)
315+ let minBidName = _getPriceForLength(size(name))
316+ let isValidBid = if (if ((bidAmount >= minBidName))
317+ then (deposit >= bidAmount)
318+ else false)
319+ then isAvailableName(name)
320+ else false
321+ let revealedBid = [StringEntry(revealKey, ((((toString(deposit) + ",") + toString(bidAmount)) + ",") + name))]
322+ if (!(isValidBid))
323+ then {
324+ let feeAmount = fraction(deposit, 10, 100)
325+ let returnDepositWithoutFeeAndDeleteBid = [ScriptTransfer(bidder, (deposit - feeAmount), unit), ScriptTransfer(collector, feeAmount, unit), DeleteEntry(bidKey)]
326+ returnDepositWithoutFeeAndDeleteBid
327+ }
328+ else if (isDefined(topKeyData))
329+ then {
330+ let $t01012110300 = {
331+ let topValues = split(value(topKeyData), ",")
332+ $Tuple2(topValues[0], parseIntValue(topValues[1]))
333+ }
334+ let topRevealKey = $t01012110300._1
335+ let secondTopBidAmount = $t01012110300._2
336+ let revealedData = value(getString(this, topRevealKey))
337+ let topBidAmount = parseIntValue(split(revealedData, ",")[1])
338+ let $t01045710755 = if ((bidAmount > topBidAmount))
339+ then $Tuple2(revealKey, topBidAmount)
340+ else if ((bidAmount > secondTopBidAmount))
341+ then $Tuple2(topRevealKey, bidAmount)
342+ else $Tuple2(unit, unit)
343+ let newTopRevealKey = $t01045710755._1
344+ let newSecondBidAmount = $t01045710755._2
345+ let updateTopKey = match $Tuple2(newTopRevealKey, newSecondBidAmount) {
346+ case newTopData: (String, Int) =>
347+[StringEntry(topKey, ((newTopData._1 + ",") + toString(newTopData._2)))]
348+ case _ =>
349+ nil
350+ }
351+ (revealedBid ++ updateTopKey)
352+ }
353+ else {
354+ let newTopBidder = [StringEntry(topKey, ((revealKey + ",") + toString(minimalBid)))]
355+ (revealedBid ++ newTopBidder)
356+ }
357+ }
231358 }
232359
233360
234361 @Callable(inv)
235362 func init (timestamp,bidDuration,revealDuration,errorFee,minimalBid,registrarAddress,nameMinimalLength,percentRate,collectorAddress) = valueOrElse(modifiers([onlyAdmin(inv), if (!(isDefined(getInteger(this, key_initTimestamp))))
236363 then unit
237364 else throw("Auction already has been initialized"), onlyValidAddress(registrarAddress), onlyValidAddress(collectorAddress), onlyPositiveInt(bidDuration, "Bid duration"), onlyPositiveInt(revealDuration, "Reveal duration"), onlyPositiveInt(errorFee, "Error fee"), onlyPositiveInt(minimalBid, "Minimal bid"), onlyPositiveInt(percentRate, "Percent rate"), if ((nameMinimalLength > 3))
238365 then unit
239366 else throw("Minimal name length must be more than 3")]), [IntegerEntry(key_initTimestamp, timestamp), IntegerEntry(key_bidDuration, bidDuration), IntegerEntry(key_revealDuration, revealDuration), IntegerEntry(key_errorFee, errorFee), IntegerEntry(key_minimalBid, minimalBid), StringEntry(key_registrarAddress, registrarAddress), IntegerEntry(key_nameMinimalLength, nameMinimalLength), IntegerEntry(key_percentRate, percentRate), StringEntry(key_collectorAddress, collectorAddress)])
240367
241368
242369
243370 @Callable(inv)
244371 func getAuctionById (auctionId) = $Tuple2(nil, _getAuctionById(auctionId))
245372
246373
247374
248375 @Callable(inv)
249376 func isAvailable (name) = $Tuple2(nil, isAvailableName(name))
250377
251378
252379
253380 @Callable(inv)
254381 func bidWithReferrer (auctionId,hash,referrerName) = valueOrElse(modifiers([if (isDefined(getString(this, key_referrerAddress(referrerName))))
255382 then unit
256383 else throw((("Referrer `" + referrerName) + "` not found"))]), {
257384 let bid = _bid(inv, auctionId, hash)
258385 let commitBidReferrer = [StringEntry(key_referrer(key_bidderHash(toString(auctionId), toString(inv.caller), hash)), referrerName)]
259386 (bid ++ commitBidReferrer)
260387 })
261388
262389
263390
264391 @Callable(inv)
265392 func bid (auctionId,hash) = _bid(inv, auctionId, hash)
266393
267394
268395
269396 @Callable(inv)
270-func reveal (auctionId,name,bidAmount,secret) = {
271- let caller = inv.caller
272- let callerAddress = toString(caller)
273- let hash = calcHash(name, bidAmount, callerAddress, secret)
274- let bidderHashKey = key_bidderHash(toString(auctionId), callerAddress, hash)
275- let revealKey = key_reveal(bidderHashKey)
276- let $t093159372 = getAuctionPhase()
277- let currentAuctionId = $t093159372._1
278- let currentPeriod = $t093159372._2
279- if ((currentAuctionId != auctionId))
280- then throw("Auctions is already over")
281- else if ((currentPeriod != PHASE_REVEAL))
282- then throw("Reveal period is over")
283- else if (isDefined(getString(this, revealKey)))
284- then throw("Bid is already revealed")
285- else {
286- let bidKey = key_bid(bidderHashKey)
287- let deposit = valueOrErrorMessage(getInteger(this, bidKey), ("Bid doesn't exists " + hash))
288- let topKey = key_top(name)
289- let topKeyData = getString(this, topKey)
290- let isValidBid = if (if ((bidAmount >= minimalBid))
291- then (deposit >= bidAmount)
292- else false)
293- then isAvailableName(name)
294- else false
295- let revealedBid = [StringEntry(revealKey, ((((toString(deposit) + ",") + toString(bidAmount)) + ",") + name))]
296- if (!(isValidBid))
297- then {
298- let feeAmount = fraction(deposit, 10, 100)
299- let returnDepositWithoutFeeAndDeleteBid = [ScriptTransfer(caller, (deposit - feeAmount), unit), ScriptTransfer(collector, feeAmount, unit), DeleteEntry(bidKey)]
300- returnDepositWithoutFeeAndDeleteBid
301- }
302- else if (isDefined(topKeyData))
303- then {
304- let $t01054210722 = {
305- let topValues = split(value(topKeyData), ",")
306- $Tuple2(topValues[0], parseIntValue(topValues[1]))
307- }
308- let topRevealKey = $t01054210722._1
309- let secondTopBidAmount = $t01054210722._2
310- let revealedData = value(getString(this, topRevealKey))
311- let topBidAmount = parseIntValue(split(revealedData, ",")[1])
312- let $t01089111191 = if ((bidAmount > topBidAmount))
313- then $Tuple2(revealKey, topBidAmount)
314- else if ((bidAmount > secondTopBidAmount))
315- then $Tuple2(topRevealKey, bidAmount)
316- else $Tuple2(unit, unit)
317- let newTopRevealKey = $t01089111191._1
318- let newSecondBidAmount = $t01089111191._2
319- let updateTopKey = match $Tuple2(newTopRevealKey, newSecondBidAmount) {
320- case newTopData: (String, Int) =>
321-[StringEntry(topKey, ((newTopData._1 + ",") + toString(newTopData._2)))]
322- case _ =>
323- nil
324- }
325- (revealedBid ++ updateTopKey)
326- }
327- else {
328- let newTopBidder = [StringEntry(topKey, ((revealKey + ",") + toString(minimalBid)))]
329- (revealedBid ++ newTopBidder)
330- }
331- }
332- }
397+func reveal (auctionId,name,bidAmount,secret) = _reveal(inv.caller, auctionId, name, bidAmount, secret)
398+
399+
400+
401+@Callable(inv)
402+func revealForBidder (bidder,auctionId,name,bidAmount,secret) = _reveal(valueOrErrorMessage(addressFromString(bidder), "Bidder must be valid address"), auctionId, name, bidAmount, secret)
333403
334404
335405
336406 @Callable(inv)
337407 func finalize (auctionId,hashes) = {
338408 let auctionEnd = _getAuctionById(auctionId)._5
339409 let err = if ((lastBlock.timestamp > auctionEnd))
340410 then unit
341411 else throw("Cannot finalize auction that has not ended")
342412 if ((err == err))
343413 then {
344414 let caller = inv.caller
345415 let callerAddress = toString(caller)
346416 func foldRefund (acc,hash) = {
347- let bidderHashKey = key_bidderHash(toString(auctionId), callerAddress, hash)
348- let bidKey = key_bid(bidderHashKey)
349- let revealKey = key_reveal(bidderHashKey)
350- let revealedBid = getString(this, revealKey)
351- let $t01232312624 = {
352- let bidValues = split(valueOrErrorMessage(revealedBid, (("Bid with hash " + hash) + " not found")), ",")
353- $Tuple3(parseIntValue(bidValues[0]), parseIntValue(bidValues[1]), bidValues[2])
354- }
355- let deposit = $t01232312624._1
356- let bidAmount = $t01232312624._2
357- let name = $t01232312624._3
358- let topKey = key_top(name)
359- let topKeyData = getString(this, topKey)
360- let $t01271712885 = {
361- let topValues = split(value(topKeyData), ",")
362- $Tuple2(topValues[0], parseIntValue(topValues[1]))
363- }
364- let topRevealKey = $t01271712885._1
365- let secondTopBidAmount = $t01271712885._2
366- let $t01289513057 = {
367- let winnerInfo = split(topRevealKey, "_")
368- $Tuple2(parseIntValue(winnerInfo[1]), winnerInfo[2])
369- }
370- let winnerAuctionId = $t01289513057._1
371- let winnerAddress = $t01289513057._2
372- let deleteEntries = [DeleteEntry(revealKey), DeleteEntry(bidKey)]
373- let transferAndDeleteEntry = if ((topRevealKey == revealKey))
417+ let checkHash = fromBase58String(hash)
418+ if ((checkHash == checkHash))
374419 then {
375- let $t01325913360 = _referrerPercentTransfer(bidderHashKey, secondTopBidAmount)
376- let referrerTransfer = $t01325913360._1
377- let referrerPercent = $t01325913360._2
378- let claimNft = invoke(registrar, "register", [name, winnerAddress, auctionEnd], nil)
379- if ((claimNft == claimNft))
420+ let bidderHashKey = key_bidderHash(toString(auctionId), callerAddress, hash)
421+ let bidKey = key_bid(bidderHashKey)
422+ let revealKey = key_reveal(bidderHashKey)
423+ let revealedBid = getString(this, revealKey)
424+ let $t01461714918 = {
425+ let bidValues = split(valueOrErrorMessage(revealedBid, (("Bid with hash " + hash) + " not found")), ",")
426+ $Tuple3(parseIntValue(bidValues[0]), parseIntValue(bidValues[1]), bidValues[2])
427+ }
428+ let deposit = $t01461714918._1
429+ let bidAmount = $t01461714918._2
430+ let name = $t01461714918._3
431+ let topKey = key_top(name)
432+ let topKeyData = getString(this, topKey)
433+ let $t01501115179 = {
434+ let topValues = split(value(topKeyData), ",")
435+ $Tuple2(topValues[0], parseIntValue(topValues[1]))
436+ }
437+ let topRevealKey = $t01501115179._1
438+ let secondTopBidAmount = $t01501115179._2
439+ let $t01518915351 = {
440+ let winnerInfo = split(topRevealKey, "_")
441+ $Tuple2(parseIntValue(winnerInfo[1]), winnerInfo[2])
442+ }
443+ let winnerAuctionId = $t01518915351._1
444+ let winnerAddress = $t01518915351._2
445+ let deleteEntries = [DeleteEntry(revealKey), DeleteEntry(bidKey)]
446+ let transferAndDeleteEntry = if ((topRevealKey == revealKey))
380447 then {
381- let transferDelta = [ScriptTransfer(caller, (deposit - secondTopBidAmount), unit), ScriptTransfer(collector, (secondTopBidAmount - referrerPercent), unit)]
382- (referrerTransfer ++ transferDelta)
448+ let $t01555315654 = _referrerPercentTransfer(bidderHashKey, secondTopBidAmount)
449+ let referrerTransfer = $t01555315654._1
450+ let referrerPercent = $t01555315654._2
451+ let claimNft = invoke(registrar, "register", [name, winnerAddress, auctionEnd], nil)
452+ if ((claimNft == claimNft))
453+ then {
454+ let refund = (deposit - secondTopBidAmount)
455+ let transferDelta = if ((refund > 0))
456+ then [ScriptTransfer(caller, refund, unit)]
457+ else nil
458+ let transferCollector = [ScriptTransfer(collector, (secondTopBidAmount - referrerPercent), unit)]
459+ ((referrerTransfer ++ transferCollector) ++ transferDelta)
460+ }
461+ else throw("Strict value is not equal to itself.")
383462 }
384- else throw("Strict value is not equal to itself.")
463+ else [ScriptTransfer(caller, deposit, unit)]
464+ ((acc ++ deleteEntries) ++ transferAndDeleteEntry)
385465 }
386- else [ScriptTransfer(caller, deposit, unit)]
387- ((acc ++ deleteEntries) ++ transferAndDeleteEntry)
466+ else throw("Strict value is not equal to itself.")
388467 }
389468
390469 let $l = hashes
391470 let $s = size($l)
392471 let $acc0 = nil
393472 func $f0_1 ($a,$i) = if (($i >= $s))
394473 then $a
395474 else foldRefund($a, $l[$i])
396475
397476 func $f0_2 ($a,$i) = if (($i >= $s))
398477 then $a
399478 else throw("List size exceeds 10")
400479
401480 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
402481 }
403482 else throw("Strict value is not equal to itself.")
404483 }
405484
406485
407486
408487 @Callable(inv)
409488 func addReferrer (referrerName,referrerAddress,percent) = valueOrElse(modifiers([onlyAdmin(inv), onlyValidAddress(referrerAddress), if (if ((percent > 0))
410489 then (100 > percent)
411490 else false)
412491 then unit
413492 else throw("Percent must be between 0 and 100"), if ((size(referrerName) > 0))
414493 then unit
415494 else throw("Referrer name cannot be empty")]), [StringEntry(key_referrerAddress(referrerName), referrerAddress), IntegerEntry(key_referrerPercent(referrerName), percent)])
416495
417496
418497
419498 @Callable(inv)
420499 func revokeBid (auctionId,hash) = {
421500 let caller = inv.caller
422501 let callerStr = toString(caller)
423- let bidderHashKey = key_bidderHash(toString(auctionId), callerStr, hash)
424- let bidKey = key_bid(bidderHashKey)
425- let bid = getInteger(this, bidKey)
426- let $t01469214749 = getAuctionPhase()
427- let currentAuctionId = $t01469214749._1
428- let currentPeriod = $t01469214749._2
429- if ((currentAuctionId != auctionId))
430- then throw("Auction is already over")
431- else if ((currentPeriod != PHASE_BID))
432- then throw("Bid period is already over")
433- else if (!(isDefined(bid)))
434- then throw((("Bid with " + hash) + " not found"))
435- else [ScriptTransfer(caller, value(bid), unit), DeleteEntry(bidKey)]
502+ let checkHash = fromBase58String(hash)
503+ if ((checkHash == checkHash))
504+ then {
505+ let bidderHashKey = key_bidderHash(toString(auctionId), callerStr, hash)
506+ let bidKey = key_bid(bidderHashKey)
507+ let bid = getInteger(this, bidKey)
508+ let $t01710717164 = getAuctionPhase()
509+ let currentAuctionId = $t01710717164._1
510+ let currentPeriod = $t01710717164._2
511+ if ((currentAuctionId != auctionId))
512+ then throw("Auction is already over")
513+ else if ((currentPeriod != PHASE_BID))
514+ then throw("Bid period is already over")
515+ else if (!(isDefined(bid)))
516+ then throw((("Bid with " + hash) + " not found"))
517+ else [ScriptTransfer(caller, value(bid), unit), DeleteEntry(bidKey)]
518+ }
519+ else throw("Strict value is not equal to itself.")
436520 }
521+
522+
523+
524+@Callable(inv)
525+func setNextMinimalLength (auctionId,minimalLenght) = valueOrElse(modifiers([onlyAdmin(inv)]), {
526+ let nextMinimalLength = getString(this, key_nextNameMinimalLength)
527+ if (isDefined(nextMinimalLength))
528+ then {
529+ let $t01778417965 = {
530+ let values = split(value(nextMinimalLength), ",")
531+ $Tuple2(parseIntValue(values[0]), parseIntValue(values[1]))
532+ }
533+ let nextAuctionId = $t01778417965._1
534+ let nextMinimalLenght = $t01778417965._2
535+[IntegerEntry(key_nameMinimalLength, nextMinimalLenght), StringEntry(key_nextNameMinimalLength, ((toString(auctionId) + ",") + toString(minimalLenght)))]
536+ }
537+ else [StringEntry(key_nextNameMinimalLength, ((toString(auctionId) + ",") + toString(minimalLenght)))]
538+ })
437539
438540

github/deemru/w8io/873ac7e 
64.48 ms