tx · 4odoGiSUcPdHGsCQnFWq6a8mWi5L7UcX1W8MHGrBcUGs

3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX:  -0.01100000 Waves

2023.01.24 12:03 [3484344] smart account 3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX > SELF 0.00000000 Waves

{ "type": 13, "id": "4odoGiSUcPdHGsCQnFWq6a8mWi5L7UcX1W8MHGrBcUGs", "fee": 1100000, "feeAssetId": null, "timestamp": 1674551018991, "version": 2, "chainId": 87, "sender": "3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX", "senderPublicKey": "27DK15MykfnsVojpifD1gbr8kRr8rpY5mw6EH4zL8R25", "proofs": [ "4gVy4rMbowBcsPVCnXNqvAxQPGrsuhvnD22C6FVaS7A7hfBPrNFiZuzhc2KSwt2JpTWQWavUg2XRXMdputGhGxFc" ], "script": "base64:BgIhCAISAwoBCBIAEgASBQoDCAgBEgYKBAgIAQESAwoBCBIAJAEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAmggCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDXRyeUdldEJvb2xlYW4BA2tleQQHJG1hdGNoMAkAoAgBBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBCWdldE9yYWNsZQAJAQdBZGRyZXNzAQkA2QQBCQEMdHJ5R2V0U3RyaW5nAQIUc3RhdGljX29yYWNsZUFkZHJlc3MBEGdldER1Y2tsaW5nUHJpY2UACQEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgkBCWdldE9yYWNsZQACFHN0YXRpY19kdWNrbGluZ1ByaWNlAQ1nZXRFZ2dBc3NldElkAAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIRc3RhdGljX2VnZ0Fzc2V0SWQBD2dldFNwaWNlQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACE3N0YXRpY19zcGljZUFzc2V0SWQBEWdldFJlYmlydGhBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhVzdGF0aWNfcmViaXJ0aEFkZHJlc3MBE2dldEluY3ViYXRvckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzARFnZXRDb3Vwb25zQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIVc3RhdGljX2NvdXBvbnNBZGRyZXNzAQ5nZXRCdXJuQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAISc3RhdGljX2J1cm5BZGRyZXNzAA1iYWNrZW5kUHViS2V5CQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQlnZXRPcmFjbGUAAhRzdGF0aWNfYmFja2VuZFB1YktleQANRFVDS0xJTkdQUklDRQCAwtcvABZwZXJjZW50R3Jvd3RoUHJlY2lzaW9uAICAhP6m3uERABBvbmVTcGljZVByZWNzaW9uAICA6YOx3hYAFktHbG9iYWxJc3N1ZWRUaW1lc3RhbXACF2dsb2JhbF9pc3N1ZWRfdGltZXN0YW1wABBEVUNLTElOR1BSSUNFT0xEAIDokiYAGXBlcmNlbnRHcm93dGhQcmVjaXNpb25PbGQAgICE/qbe4REBD2tleVRvdGFsRmVlZE9sZAEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAIFX2ZlZWQBDGtleVRvdGFsRmVlZAEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAILX2ZlZWRfc3BpY2UBEGtleVRvdGFsRmVlZFVzZXIBB2FkZHJlc3MJAKwCAgkArAICAgV1c2VyXwUHYWRkcmVzcwIFX2ZlZWQBD2tleUFkZHJlc3NOb25jZQEHYWRkcmVzcwkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgZfbm9uY2UBEGtleUR1Y2tsaW5nTGV2ZWwBCmR1Y2tsaW5nSWQJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCBl9sZXZlbAEQa2V5RHVja2xpbmdHcm93bgEKZHVja2xpbmdJZAkArAICCQCsAgICCWR1Y2tsaW5nXwUKZHVja2xpbmdJZAIGX2dyb3duARJrZXlTdGFydFBlcmNlbnRhZ2UBCmR1Y2tsaW5nSWQJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCEF9zdGFydFBlcmNlbnRhZ2UBCGtleU93bmVyAQpkdWNrbGluZ0lkCQCsAgIJAKwCAgIJZHVja2xpbmdfBQpkdWNrbGluZ0lkAgZfb3duZXIBDmtleUJsYWNrbGlzdGVkAQpkdWNrbGluZ0lkCQCsAgIJAKwCAgIJZHVja2xpbmdfBQpkdWNrbGluZ0lkAgxfYmxhY2tsaXN0ZWQBGGtleUFtb3VudE9mQWR1bHREdWNrbGluZwACD2FkdWx0X2R1Y2tsaW5ncwENdHJ5R2V0SW50ZWdlcgEDa2V5BAN2YWwEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAABQN2YWwBB2dldEJvb2wBA2tleQQHJG1hdGNoMAkAmwgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBFWdldER1Y2tsaW5nUGVyY2VudGFnZQEKZHVja2xpbmdJZAQScGVyY2VudGFnZUR1Y2tsaW5nCQENdHJ5R2V0SW50ZWdlcgEJARJrZXlTdGFydFBlcmNlbnRhZ2UBBQpkdWNrbGluZ0lkBARiYXNlAwkBAiE9AgUScGVyY2VudGFnZUR1Y2tsaW5nAAAFEnBlcmNlbnRhZ2VEdWNrbGluZwAFCQC2AgEJAGgCBQRiYXNlBRBvbmVTcGljZVByZWNzaW9uARVnZXRDdXJyZW50TGV2ZWxCaWdJbnQBCmR1Y2tsaW5nSWQECmtEdWNrTGV2ZWwJARBrZXlEdWNrbGluZ0xldmVsAQUKZHVja2xpbmdJZAQHJG1hdGNoMAkAoggBBQprRHVja0xldmVsAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApwMBBQFzBAckbWF0Y2gxCQCgCAEJAKwCAgkArAICAglkdWNrbGluZ18FCmR1Y2tsaW5nSWQCEV9pc3N1ZWRCeUZlZWRDYWxsAwkAAQIFByRtYXRjaDECB0Jvb2xlYW4EAWIFByRtYXRjaDEDAwkAAAIFAWIGCQAAAgkBDXRyeUdldEludGVnZXIBCQESa2V5U3RhcnRQZXJjZW50YWdlAQUKZHVja2xpbmdJZAAABwkAtgIBAAAJARVnZXREdWNrbGluZ1BlcmNlbnRhZ2UBBQpkdWNrbGluZ0lkCQEVZ2V0RHVja2xpbmdQZXJjZW50YWdlAQUKZHVja2xpbmdJZAEZY2FsY3VsYXRlTmV3RHVja2xpbmdMZXZlbAIKZHVja2xpbmdJZA1wYXltZW50QW1vdW50BAljdXJyZW50VHMIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAZncm93dGgJALoCAgkAvAIDCQC2AgEFDXBheW1lbnRBbW91bnQJALYCAQUWcGVyY2VudEdyb3d0aFByZWNpc2lvbgkAtgIBBQ1EVUNLTElOR1BSSUNFCQC2AgEAZAQMY3VycmVudExldmVsCQEVZ2V0Q3VycmVudExldmVsQmlnSW50AQUKZHVja2xpbmdJZAQIbmV3TGV2ZWwJALcCAgUMY3VycmVudExldmVsBQZncm93dGgEBnJlc3VsdAkApgMBBQhuZXdMZXZlbAkAlAoCBQZyZXN1bHQJAMwIAgkArAICAg1jdXJyZW50TGV2ZWw9CQCmAwEFDGN1cnJlbnRMZXZlbAkAzAgCCQCsAgICCW5ld0xldmVsPQkApgMBBQhuZXdMZXZlbAkAzAgCCQCsAgICB2dyb3d0aD0JAKYDAQUGZ3Jvd3RoBQNuaWwBD2dldEJhY2tlbmRQcm9vZgMNbWF4RmVlZEFtb3VudAl1c2VyTm9uY2UHYWRkcmVzcwkAuQkCCQDMCAIJAKQDAQUNbWF4RmVlZEFtb3VudAkAzAgCCQCkAwEFCXVzZXJOb25jZQkAzAgCBQdhZGRyZXNzBQNuaWwCATsBBWFzSW50AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAFA2ludAkAAgECHkJBSTogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAcBaQEPY29uZmlndXJlT3JhY2xlAQZvcmFjbGUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg9CQ086IGFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIUc3RhdGljX29yYWNsZUFkZHJlc3MFBm9yYWNsZQUDbmlsAWkBIWNhbGN1bGF0ZUR1Y2tsaW5nUHJpY2VUd29EZWNpbWFscwAEAXgJAQ10cnlHZXRJbnRlZ2VyAQkBGGtleUFtb3VudE9mQWR1bHREdWNrbGluZwAEBXByaWNlCQBkAgATCQBsBgUBeAAAAAgAAQACBQZIQUxGVVAJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCAgtERUJVR19QUklDRQkApAMBBQVwcmljZQUDbmlsBQVwcmljZQFpAQtidXlEdWNrbGluZwAECmV4YWN0UHJpY2UJARBnZXREdWNrbGluZ1ByaWNlAAMJAGYCAIDh6xcFCmV4YWN0UHJpY2UJAAIBAh9CQkQ6IEludmFsaWQgcHJpY2UgZnJvbSBvcmFjbGUhBBNhbW91bnRQYWlkQnlDb3Vwb25zCQEFYXNJbnQBCQD8BwQJARFnZXRDb3Vwb25zQWRkcmVzcwACCnVzZUNvdXBvbnMJAMwIAgUKZXhhY3RQcmljZQUDbmlsBQNuaWwDCQAAAgUTYW1vdW50UGFpZEJ5Q291cG9ucwUTYW1vdW50UGFpZEJ5Q291cG9ucwQJbGVmdFRvUGF5CQBlAgUKZXhhY3RQcmljZQUTYW1vdW50UGFpZEJ5Q291cG9ucwQHcGF5bWVudAMJAQIhPQIFCWxlZnRUb1BheQAABAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAMJAQIhPQIIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAkBDWdldEVnZ0Fzc2V0SWQACQACAQkArAICAkFCQkQ6IFlvdSBjYW4gYXR0YWNoIG9ubHkgRUdHIHRva2VucyB3aXRoIHRoZSBmb2xsb3dpbmcgYXNzZXQgaWQ6IAkA2AQBCQENZ2V0RWdnQXNzZXRJZAADCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAUJbGVmdFRvUGF5CQACAQkArAICAkhCQkQ6IFRvIGJ1eSBhIHBlcmNoIHlvdSBjdXJyZW50bHkgbmVlZCB0aGUgZm9sbG93aW5nIGFtb3VudCBvZiBFR0dsZXRzOiAJAKQDAQUJbGVmdFRvUGF5BAhidXJuQ2FsbAkA/AcECQEOZ2V0QnVybkFkZHJlc3MAAhRidXJuQXR0YWNoZWRQYXltZW50cwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0RWdnQXNzZXRJZAAFCWxlZnRUb1BheQUDbmlsAwkAAAIFCGJ1cm5DYWxsBQhidXJuQ2FsbAUJbGVmdFRvUGF5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAADCQAAAgUHcGF5bWVudAUHcGF5bWVudAQPZHVja2xpbmdBc3NldElkCQD8BwQFBHRoaXMCEWlzc3VlRnJlZUR1Y2tsaW5nCQDMCAIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQDMCAIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkAzAgCAAAFA25pbAUDbmlsAwkAAAIFD2R1Y2tsaW5nQXNzZXRJZAUPZHVja2xpbmdBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERaXNzdWVGcmVlRHVja2xpbmcDB2FkZHJlc3MHdHhJZFN0cgpwZXJjZW50YWdlAwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkGY2FsbGVyCQERZ2V0UmViaXJ0aEFkZHJlc3MABwkAAgECI0JJRkQ6IFlvdSBjYW4ndCBpc3N1ZSBmcmVlIGR1Y2tsaW5nBAVhc3NldAkAwwgHAhBCQUJZLTExMTExMTExLUdaAgAAAQAABwUEdW5pdAUGaGVpZ2h0BAdhc3NldElkCQC4CAEFBWFzc2V0CQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUHYWRkcmVzcwIBXwUHdHhJZFN0cgIDX2RpCQDYBAEFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQICDHN0YXRzX2Ftb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQIMc3RhdHNfYW1vdW50AAEJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlTdGFydFBlcmNlbnRhZ2UBCQDYBAEFB2Fzc2V0SWQFCnBlcmNlbnRhZ2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCGtleU93bmVyAQkA2AQBBQdhc3NldElkBQdhZGRyZXNzCQDMCAIFBWFzc2V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQV2YWx1ZQEJAKYIAQUHYWRkcmVzcwABBQdhc3NldElkBQNuaWwJANgEAQUHYXNzZXRJZAFpAQxmZWVkRHVja2xpbmcECmR1Y2tsaW5nSWQQYmFja2VuZFNpZ25hdHVyZQ1tYXhGZWVkQW1vdW50CXVzZXJOb25jZQQNYWRkcmVzc1N0cmluZwkApQgBCAUBaQZjYWxsZXIEDGJhY2tlbmRQcm9vZgkBD2dldEJhY2tlbmRQcm9vZgMFDW1heEZlZWRBbW91bnQFCXVzZXJOb25jZQUNYWRkcmVzc1N0cmluZwQNa0FkZHJlc3NOb25jZQkBD2tleUFkZHJlc3NOb25jZQEFDWFkZHJlc3NTdHJpbmcEDGN1cnJlbnROb25jZQkBDXRyeUdldEludGVnZXIBBQ1rQWRkcmVzc05vbmNlBA5yZWFsRHVja2xpbmdJZAMJAQEhAQkAxBMDCQCbAwEFDGJhY2tlbmRQcm9vZgkA2QQBBRBiYWNrZW5kU2lnbmF0dXJlBQ1iYWNrZW5kUHViS2V5CQACAQIfQkZEOiBJbnZhbGlkIHByb29mIGZyb20gYmFja2VuZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQ9nZXRTcGljZUFzc2V0SWQACQACAQIuQkZEOiBCYWQgcGF5bWVudCBhdHRhY2hlZCAoYXNzZXRbc10gb3IgYW1vdW50KQMJAQdnZXRCb29sAQkBEGtleUR1Y2tsaW5nR3Jvd24BBQpkdWNrbGluZ0lkCQACAQIeQkZEOiBEdWNrbGluZyBpcyBhbHJlYWR5IGdyb3duAwkBAiE9AgUJdXNlck5vbmNlCQBkAgUMY3VycmVudE5vbmNlAAEJAAIBCQCsAgIJAKwCAgkArAICAhpCRkQ6IFVzZXIgTm9uY2Ugc2hvdWxkIGJlIAkApAMBBQxjdXJyZW50Tm9uY2UCFSArIDEsIHdoaWxlIHJlY2VpdmVkIAkApAMBBQl1c2VyTm9uY2UEC2JsYWNrTGlzdGVkCQENdHJ5R2V0Qm9vbGVhbgEJAQ5rZXlCbGFja2xpc3RlZAEFCmR1Y2tsaW5nSWQDBQtibGFja0xpc3RlZAkAAgECJ0JGRDogQ2FuIG5vdCBmZWVkIGJsYWNrbGlzdGVkIGR1Y2tsaW5nIQMJAAACBQpkdWNrbGluZ0lkAgAJAAIBAiFCRkQ6IFBsZWFzZSBidXkgYSBkdWNrbGluZyBmaXJzdCEED2R1Y2tsaW5nSWRDaGVjawkBBXZhbHVlAQkA7AcBCQDZBAEFCmR1Y2tsaW5nSWQDCQECIT0CCQDwBwIIBQFpBmNhbGxlcggFD2R1Y2tsaW5nSWRDaGVjawJpZAABCQACAQIpQkZEOiBZb3UncmUgbm90IHRoZSBvd25lciBvZiB0aGUgZHVja2xpbmcDCQECIT0CCAUPZHVja2xpbmdJZENoZWNrBmlzc3VlcgUEdGhpcwkAAgECJEJGRDogQ2FudCBmaW5kIGR1Y2tsaW5nIHdpdGggc3VjaCBpZAkA2AQBCAUPZHVja2xpbmdJZENoZWNrAmlkBA5jdXJyZW50UGF5bWVudAgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECWtOZXdMZXZlbAkBEGtleUR1Y2tsaW5nTGV2ZWwBBQ5yZWFsRHVja2xpbmdJZAQKa1RvdGFsRmVlZAkBDGtleVRvdGFsRmVlZAEFDnJlYWxEdWNrbGluZ0lkBA5rVG90YWxGZWVkVXNlcgkBEGtleVRvdGFsRmVlZFVzZXIBBQ1hZGRyZXNzU3RyaW5nBAl0b3RhbEZlZWQJAQ10cnlHZXRJbnRlZ2VyAQUKa1RvdGFsRmVlZAQNdG90YWxGZWVkVXNlcgkBDXRyeUdldEludGVnZXIBBQ5rVG90YWxGZWVkVXNlcgQMa0ZlZWRUeFN0YXRzCQCsAgIJAKwCAgkArAICAglkdWNrbGluZ18FDnJlYWxEdWNrbGluZ0lkAgZfc3RhdF8JAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXADCQBmAgUOY3VycmVudFBheW1lbnQFDW1heEZlZWRBbW91bnQJAAIBCQCsAgICP0JGRDogQ2Fubm90IGZlZWQgZHVja2xpbmcgZm9yIHN1Y2ggYW1vdW50LCBtYXggZmVlZCBhbW91bnQgaXM6IAkApAMBBQ1tYXhGZWVkQW1vdW50BBBjYWxjdWxhdGVSZXN1bHRzCQEZY2FsY3VsYXRlTmV3RHVja2xpbmdMZXZlbAIFDnJlYWxEdWNrbGluZ0lkBQ5jdXJyZW50UGF5bWVudAQNZHVja2xpbmdPd25lcgkBDHRyeUdldFN0cmluZwEJAQhrZXlPd25lcgEFDnJlYWxEdWNrbGluZ0lkAwkBAiE9AgUNZHVja2xpbmdPd25lcgkApQgBCAUBaQZjYWxsZXIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQ5rZXlCbGFja2xpc3RlZAEFDnJlYWxEdWNrbGluZ0lkBgUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rQWRkcmVzc05vbmNlCQBkAgUMY3VycmVudE5vbmNlAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFCmtUb3RhbEZlZWQJAGQCBQl0b3RhbEZlZWQFDmN1cnJlbnRQYXltZW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rVG90YWxGZWVkVXNlcgkAZAIFDXRvdGFsRmVlZFVzZXIFDmN1cnJlbnRQYXltZW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrRmVlZFR4U3RhdHMFDmN1cnJlbnRQYXltZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtOZXdMZXZlbAgFEGNhbGN1bGF0ZVJlc3VsdHMCXzEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQxrRmVlZFR4U3RhdHMCBl9kZWJ1ZwkAuQkCCAUQY2FsY3VsYXRlUmVzdWx0cwJfMgIBOwUDbmlsAWkBCWZpeExldmVscwELZHVja2xpbmdJZHMDAwkBAiE9AggFAWkPY2FsbGVyUHVibGljS2V5ASDiMKtBpJpFj25o9v+IjV3L/FyCwCI4FpSSwXakAkBWIgkBAiE9AggFAWkGY2FsbGVyBQR0aGlzBwkAAgECE0JGTDogTm90IGF1dGhvcml6ZWQED2R1Y2tsaW5nSWRzTGlzdAkBBXZhbHVlAQkAtQkCBQtkdWNrbGluZ0lkcwIBLAoBCGhhbmRsZUlkAgNhY2MCaWQECmtUb3RhbEZlZWQJAQxrZXlUb3RhbEZlZWQBBQJpZAQJdG90YWxGZWVkCQENdHJ5R2V0SW50ZWdlcgEFCmtUb3RhbEZlZWQEDWtUb3RhbEZlZWRPbGQJAQ9rZXlUb3RhbEZlZWRPbGQBBQJpZAQMdG90YWxGZWVkT2xkCQENdHJ5R2V0SW50ZWdlcgEFDWtUb3RhbEZlZWRPbGQECWtOZXdMZXZlbAkBEGtleUR1Y2tsaW5nTGV2ZWwBBQJpZAQNc3RhcnRpbmdMZXZlbAQHJG1hdGNoMAkAoAgBCQCsAgIJAKwCAgIJZHVja2xpbmdfBQJpZAIRX2lzc3VlZEJ5RmVlZENhbGwDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAMDCQAAAgUBYgYJAAACCQENdHJ5R2V0SW50ZWdlcgEJARJrZXlTdGFydFBlcmNlbnRhZ2UBBQJpZAAABwkAtgIBAAAJARVnZXREdWNrbGluZ1BlcmNlbnRhZ2UBBQJpZAkBFWdldER1Y2tsaW5nUGVyY2VudGFnZQEFAmlkBAZncm93dGgJALwCAwkAtgIBCQBpAgUJdG90YWxGZWVkAGQJALYCAQUWcGVyY2VudEdyb3d0aFByZWNpc2lvbgkAtgIBBQ1EVUNLTElOR1BSSUNFBAlncm93dGhPbGQDCQECIT0CBQx0b3RhbEZlZWRPbGQAAAkAvAIDCQC2AgEFDHRvdGFsRmVlZE9sZAkAtgIBBRlwZXJjZW50R3Jvd3RoUHJlY2lzaW9uT2xkCQC2AgEFEERVQ0tMSU5HUFJJQ0VPTEQJALYCAQAACQDOCAIFA2FjYwkAzAgCCQELU3RyaW5nRW50cnkCBQlrTmV3TGV2ZWwJAKYDAQkAtwICCQC3AgIFDXN0YXJ0aW5nTGV2ZWwFBmdyb3d0aAUJZ3Jvd3RoT2xkCQDMCAIJAQtTdHJpbmdFbnRyeQICBURFQlVHCQCsAgIJAKwCAgkArAICCQCsAgIJAKYDAQUNc3RhcnRpbmdMZXZlbAIBIAkApgMBBQZncm93dGgCASAJAKYDAQUJZ3Jvd3RoT2xkBQNuaWwKAAIkbAUPZHVja2xpbmdJZHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhoYW5kbGVJZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAWkBFHR1cm5EdWNrbGluZ0ludG9EdWNrAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEBHR4SWQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAQUbGFzdElzc3VlZER1Y2tsaW5nVHMJAQ10cnlHZXRJbnRlZ2VyAQUWS0dsb2JhbElzc3VlZFRpbWVzdGFtcAQLZml2ZU1pbkluTXMJAGgCCQBoAgAFADwA6AcECHRpbWVEaWZmCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGQCBRRsYXN0SXNzdWVkRHVja2xpbmdUcwULZml2ZU1pbkluTXMDAwkAZgIFFGxhc3RJc3N1ZWREdWNrbGluZ1RzAAAJAGYCAAAFCHRpbWVEaWZmBwkAAgEJAKwCAgkArAICAkJCVEQ6IENhbiBpc3N1ZSBkdWNrbGluZ3Mgb25seSBvbmNlIHBlciA1IG1pbnV0ZXMsIHBsZWFzZSB3YWl0IGZvciAJAKQDAQkAawMFCHRpbWVEaWZmAAEA6AcCBSBzZWMuAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIuQlREOiBCYWQgcGF5bWVudCBhdHRhY2hlZCAoYXNzZXRbc10gb3IgYW1vdW50KQMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEJAAIBAhlCVEQ6IFBsZWFzZSBhdHRhY2ggYSBuZnQhBANwbXQJAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAtibGFja0xpc3RlZAkBDXRyeUdldEJvb2xlYW4BCQEOa2V5QmxhY2tsaXN0ZWQBCQDYBAEIBQNwbXQCaWQDBQtibGFja0xpc3RlZAkAAgECKkJURDogQ2FuIG5vdCBjb252ZXJ0IGJsYWNrbGlzdGVkIGR1Y2tsaW5nIQQOYWR1bHRQcmljZUNhbGwJAQVhc0ludAEJAPwHBAUEdGhpcwIhY2FsY3VsYXRlRHVja2xpbmdQcmljZVR3b0RlY2ltYWxzBQNuaWwFA25pbAMJAAACBQ5hZHVsdFByaWNlQ2FsbAUOYWR1bHRQcmljZUNhbGwED25vcm1hbGl6ZWRQcmljZQkAawMFDmFkdWx0UHJpY2VDYWxsBRBvbmVTcGljZVByZWNzaW9uAGQDCQC/AgIJALYCAQUPbm9ybWFsaXplZFByaWNlCQEVZ2V0Q3VycmVudExldmVsQmlnSW50AQkA2AQBCAUDcG10AmlkCQACAQIhQlREOiBEdWNrbGluZyBpcyBub3QgZ3Jvd24geWV0Li4uAwkBAiE9AggFA3BtdAZpc3N1ZXIFBHRoaXMJAAIBAipCVEQ6IENhbiB1c2Ugb25seSBkdWNrbGluZ3MgZnJvbSB0aGlzIGRBcHAEBGNhbGwJAPwHBAkBE2dldEluY3ViYXRvckFkZHJlc3MAAhFzdGFydER1Y2tIYXRjaGluZwkAzAgCAgAFA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwEDmtEdWNrbGluZ0dyb3duCQEQa2V5RHVja2xpbmdHcm93bgEJANgEAQgFA3BtdAJpZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUOa0R1Y2tsaW5nR3Jvd24GCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZLR2xvYmFsSXNzdWVkVGltZXN0YW1wCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleUFtb3VudE9mQWR1bHREdWNrbGluZwAJAGQCCQENdHJ5R2V0SW50ZWdlcgEJARhrZXlBbW91bnRPZkFkdWx0RHVja2xpbmcAAAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXk0Om4W", "height": 3484344, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7vNUk9gkSgNGjfttYpVseHKjWx8yBiNhiQQvdw6qriHR Next: 5FTobbeRrj7xJ3ZsqBGaXzCBLLG6jhoC2ptVYmtvXL9J Diff:
OldNewDifferences
119119 let percentageDuckling = tryGetInteger(keyStartPercentage(ducklingId))
120120 let base = if ((percentageDuckling != 0))
121121 then percentageDuckling
122- else 20
122+ else 5
123123 toBigInt((base * oneSpicePrecsion))
124124 }
125125
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetStringExternal (address,key) = match getString(address, key) {
55 case a: String =>
66 a
77 case _ =>
88 ""
99 }
1010
1111
1212 func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
1313 case b: Int =>
1414 b
1515 case _ =>
1616 0
1717 }
1818
1919
2020 func tryGetBoolean (key) = match getBoolean(key) {
2121 case b: Boolean =>
2222 b
2323 case _ =>
2424 false
2525 }
2626
2727
2828 func tryGetString (key) = tryGetStringExternal(this, key)
2929
3030
3131 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
3232
3333
3434 func getDucklingPrice () = tryGetIntegerExternal(getOracle(), "static_ducklingPrice")
3535
3636
3737 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
3838
3939
4040 func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_spiceAssetId"))
4141
4242
4343 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
4444
4545
4646 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
4747
4848
4949 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_couponsAddress")))
5050
5151
5252 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
5353
5454
5555 let backendPubKey = fromBase58String(getStringValue(getOracle(), "static_backendPubKey"))
5656
5757 let DUCKLINGPRICE = 100000000
5858
5959 let percentGrowthPrecision = 10000000000000000
6060
6161 let oneSpicePrecsion = 100000000000000
6262
6363 let KGlobalIssuedTimestamp = "global_issued_timestamp"
6464
6565 let DUCKLINGPRICEOLD = 80000000
6666
6767 let percentGrowthPrecisionOld = 10000000000000000
6868
6969 func keyTotalFeedOld (ducklingId) = (("duckling_" + ducklingId) + "_feed")
7070
7171
7272 func keyTotalFeed (ducklingId) = (("duckling_" + ducklingId) + "_feed_spice")
7373
7474
7575 func keyTotalFeedUser (address) = (("user_" + address) + "_feed")
7676
7777
7878 func keyAddressNonce (address) = (("address_" + address) + "_nonce")
7979
8080
8181 func keyDucklingLevel (ducklingId) = (("duckling_" + ducklingId) + "_level")
8282
8383
8484 func keyDucklingGrown (ducklingId) = (("duckling_" + ducklingId) + "_grown")
8585
8686
8787 func keyStartPercentage (ducklingId) = (("duckling_" + ducklingId) + "_startPercentage")
8888
8989
9090 func keyOwner (ducklingId) = (("duckling_" + ducklingId) + "_owner")
9191
9292
9393 func keyBlacklisted (ducklingId) = (("duckling_" + ducklingId) + "_blacklisted")
9494
9595
9696 func keyAmountOfAdultDuckling () = "adult_ducklings"
9797
9898
9999 func tryGetInteger (key) = {
100100 let val = match getInteger(this, key) {
101101 case b: Int =>
102102 b
103103 case _ =>
104104 0
105105 }
106106 val
107107 }
108108
109109
110110 func getBool (key) = match getBoolean(this, key) {
111111 case b: Boolean =>
112112 b
113113 case _ =>
114114 false
115115 }
116116
117117
118118 func getDucklingPercentage (ducklingId) = {
119119 let percentageDuckling = tryGetInteger(keyStartPercentage(ducklingId))
120120 let base = if ((percentageDuckling != 0))
121121 then percentageDuckling
122- else 20
122+ else 5
123123 toBigInt((base * oneSpicePrecsion))
124124 }
125125
126126
127127 func getCurrentLevelBigInt (ducklingId) = {
128128 let kDuckLevel = keyDucklingLevel(ducklingId)
129129 match getString(kDuckLevel) {
130130 case s: String =>
131131 parseBigIntValue(s)
132132 case _ =>
133133 match getBoolean((("duckling_" + ducklingId) + "_issuedByFeedCall")) {
134134 case b: Boolean =>
135135 if (if ((b == true))
136136 then (tryGetInteger(keyStartPercentage(ducklingId)) == 0)
137137 else false)
138138 then toBigInt(0)
139139 else getDucklingPercentage(ducklingId)
140140 case _ =>
141141 getDucklingPercentage(ducklingId)
142142 }
143143 }
144144 }
145145
146146
147147 func calculateNewDucklingLevel (ducklingId,paymentAmount) = {
148148 let currentTs = lastBlock.timestamp
149149 let growth = (fraction(toBigInt(paymentAmount), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE)) / toBigInt(100))
150150 let currentLevel = getCurrentLevelBigInt(ducklingId)
151151 let newLevel = (currentLevel + growth)
152152 let result = toString(newLevel)
153153 $Tuple2(result, [("currentLevel=" + toString(currentLevel)), ("newLevel=" + toString(newLevel)), ("growth=" + toString(growth))])
154154 }
155155
156156
157157 func getBackendProof (maxFeedAmount,userNonce,address) = makeString([toString(maxFeedAmount), toString(userNonce), address], ";")
158158
159159
160160 func asInt (value) = match value {
161161 case int: Int =>
162162 int
163163 case _ =>
164164 throw("BAI: wrong type, expected: Int")
165165 }
166166
167167
168168 @Callable(i)
169169 func configureOracle (oracle) = if ((i.caller != this))
170170 then throw("BCO: admin only")
171171 else [StringEntry("static_oracleAddress", oracle)]
172172
173173
174174
175175 @Callable(i)
176176 func calculateDucklingPriceTwoDecimals () = {
177177 let x = tryGetInteger(keyAmountOfAdultDuckling())
178178 let price = (19 + pow(x, 0, 8, 1, 2, HALFUP))
179179 $Tuple2([StringEntry("DEBUG_PRICE", toString(price))], price)
180180 }
181181
182182
183183
184184 @Callable(i)
185185 func buyDuckling () = {
186186 let exactPrice = getDucklingPrice()
187187 if ((50000000 > exactPrice))
188188 then throw("BBD: Invalid price from oracle!")
189189 else {
190190 let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil))
191191 if ((amountPaidByCoupons == amountPaidByCoupons))
192192 then {
193193 let leftToPay = (exactPrice - amountPaidByCoupons)
194194 let payment = if ((leftToPay != 0))
195195 then {
196196 let firstPayment = value(i.payments[0])
197197 if ((firstPayment.assetId != getEggAssetId()))
198198 then throw(("BBD: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
199199 else if ((firstPayment.amount != leftToPay))
200200 then throw(("BBD: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay)))
201201 else {
202202 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), leftToPay)])
203203 if ((burnCall == burnCall))
204204 then leftToPay
205205 else throw("Strict value is not equal to itself.")
206206 }
207207 }
208208 else 0
209209 if ((payment == payment))
210210 then {
211211 let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil)
212212 if ((ducklingAssetId == ducklingAssetId))
213213 then nil
214214 else throw("Strict value is not equal to itself.")
215215 }
216216 else throw("Strict value is not equal to itself.")
217217 }
218218 else throw("Strict value is not equal to itself.")
219219 }
220220 }
221221
222222
223223
224224 @Callable(i)
225225 func issueFreeDuckling (address,txIdStr,percentage) = if (if ((i.caller != this))
226226 then (i.caller != getRebirthAddress())
227227 else false)
228228 then throw("BIFD: You can't issue free duckling")
229229 else {
230230 let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
231231 let assetId = calculateAssetId(asset)
232232 $Tuple2([StringEntry((((address + "_") + txIdStr) + "_di"), toBase58String(assetId)), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), IntegerEntry(keyStartPercentage(toBase58String(assetId)), percentage), StringEntry(keyOwner(toBase58String(assetId)), address), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
233233 }
234234
235235
236236
237237 @Callable(i)
238238 func feedDuckling (ducklingId,backendSignature,maxFeedAmount,userNonce) = {
239239 let addressString = toString(i.caller)
240240 let backendProof = getBackendProof(maxFeedAmount, userNonce, addressString)
241241 let kAddressNonce = keyAddressNonce(addressString)
242242 let currentNonce = tryGetInteger(kAddressNonce)
243243 let realDucklingId = if (!(sigVerify_8Kb(toBytes(backendProof), fromBase58String(backendSignature), backendPubKey)))
244244 then throw("BFD: Invalid proof from backend")
245245 else if (if ((size(i.payments) != 1))
246246 then true
247247 else (value(i.payments[0]).assetId != getSpiceAssetId()))
248248 then throw("BFD: Bad payment attached (asset[s] or amount)")
249249 else if (getBool(keyDucklingGrown(ducklingId)))
250250 then throw("BFD: Duckling is already grown")
251251 else if ((userNonce != (currentNonce + 1)))
252252 then throw(((("BFD: User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
253253 else {
254254 let blackListed = tryGetBoolean(keyBlacklisted(ducklingId))
255255 if (blackListed)
256256 then throw("BFD: Can not feed blacklisted duckling!")
257257 else if ((ducklingId == ""))
258258 then throw("BFD: Please buy a duckling first!")
259259 else {
260260 let ducklingIdCheck = value(assetInfo(fromBase58String(ducklingId)))
261261 if ((assetBalance(i.caller, ducklingIdCheck.id) != 1))
262262 then throw("BFD: You're not the owner of the duckling")
263263 else if ((ducklingIdCheck.issuer != this))
264264 then throw("BFD: Cant find duckling with such id")
265265 else toBase58String(ducklingIdCheck.id)
266266 }
267267 }
268268 let currentPayment = value(i.payments[0]).amount
269269 let kNewLevel = keyDucklingLevel(realDucklingId)
270270 let kTotalFeed = keyTotalFeed(realDucklingId)
271271 let kTotalFeedUser = keyTotalFeedUser(addressString)
272272 let totalFeed = tryGetInteger(kTotalFeed)
273273 let totalFeedUser = tryGetInteger(kTotalFeedUser)
274274 let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp))
275275 if ((currentPayment > maxFeedAmount))
276276 then throw(("BFD: Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
277277 else {
278278 let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
279279 let ducklingOwner = tryGetString(keyOwner(realDucklingId))
280280 if ((ducklingOwner != toString(i.caller)))
281281 then [BooleanEntry(keyBlacklisted(realDucklingId), true)]
282282 else [IntegerEntry(kAddressNonce, (currentNonce + 1)), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kTotalFeedUser, (totalFeedUser + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))]
283283 }
284284 }
285285
286286
287287
288288 @Callable(i)
289289 func fixLevels (ducklingIds) = if (if ((i.callerPublicKey != base58'GDxBbsDRmeY39quNrDsTXKJzFWbQVtjxHseF4ikxZ7n9'))
290290 then (i.caller != this)
291291 else false)
292292 then throw("BFL: Not authorized")
293293 else {
294294 let ducklingIdsList = value(split(ducklingIds, ","))
295295 func handleId (acc,id) = {
296296 let kTotalFeed = keyTotalFeed(id)
297297 let totalFeed = tryGetInteger(kTotalFeed)
298298 let kTotalFeedOld = keyTotalFeedOld(id)
299299 let totalFeedOld = tryGetInteger(kTotalFeedOld)
300300 let kNewLevel = keyDucklingLevel(id)
301301 let startingLevel = match getBoolean((("duckling_" + id) + "_issuedByFeedCall")) {
302302 case b: Boolean =>
303303 if (if ((b == true))
304304 then (tryGetInteger(keyStartPercentage(id)) == 0)
305305 else false)
306306 then toBigInt(0)
307307 else getDucklingPercentage(id)
308308 case _ =>
309309 getDucklingPercentage(id)
310310 }
311311 let growth = fraction(toBigInt((totalFeed / 100)), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
312312 let growthOld = if ((totalFeedOld != 0))
313313 then fraction(toBigInt(totalFeedOld), toBigInt(percentGrowthPrecisionOld), toBigInt(DUCKLINGPRICEOLD))
314314 else toBigInt(0)
315315 (acc ++ [StringEntry(kNewLevel, toString(((startingLevel + growth) + growthOld))), StringEntry("DEBUG", ((((toString(startingLevel) + " ") + toString(growth)) + " ") + toString(growthOld)))])
316316 }
317317
318318 let $l = ducklingIdsList
319319 let $s = size($l)
320320 let $acc0 = nil
321321 func $f0_1 ($a,$i) = if (($i >= $s))
322322 then $a
323323 else handleId($a, $l[$i])
324324
325325 func $f0_2 ($a,$i) = if (($i >= $s))
326326 then $a
327327 else throw("List size exceeds 20")
328328
329329 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
330330 }
331331
332332
333333
334334 @Callable(i)
335335 func turnDucklingIntoDuck () = {
336336 let address = toString(i.caller)
337337 let txId = toBase58String(i.transactionId)
338338 let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
339339 let fiveMinInMs = ((5 * 60) * 1000)
340340 let timeDiff = (lastBlock.timestamp - (lastIssuedDucklingTs + fiveMinInMs))
341341 if (if ((lastIssuedDucklingTs > 0))
342342 then (0 > timeDiff)
343343 else false)
344344 then throw((("BTD: Can issue ducklings only once per 5 minutes, please wait for " + toString(fraction(timeDiff, 1, 1000))) + " sec."))
345345 else if ((size(i.payments) != 1))
346346 then throw("BTD: Bad payment attached (asset[s] or amount)")
347347 else if ((i.payments[0].amount != 1))
348348 then throw("BTD: Please attach a nft!")
349349 else {
350350 let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
351351 let blackListed = tryGetBoolean(keyBlacklisted(toBase58String(pmt.id)))
352352 if (blackListed)
353353 then throw("BTD: Can not convert blacklisted duckling!")
354354 else {
355355 let adultPriceCall = asInt(invoke(this, "calculateDucklingPriceTwoDecimals", nil, nil))
356356 if ((adultPriceCall == adultPriceCall))
357357 then {
358358 let normalizedPrice = fraction(adultPriceCall, oneSpicePrecsion, 100)
359359 if ((toBigInt(normalizedPrice) > getCurrentLevelBigInt(toBase58String(pmt.id))))
360360 then throw("BTD: Duckling is not grown yet...")
361361 else if ((pmt.issuer != this))
362362 then throw("BTD: Can use only ducklings from this dApp")
363363 else {
364364 let call = invoke(getIncubatorAddress(), "startDuckHatching", [""], nil)
365365 if ((call == call))
366366 then {
367367 let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
368368 [BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp), IntegerEntry(keyAmountOfAdultDuckling(), (tryGetInteger(keyAmountOfAdultDuckling()) + 1))]
369369 }
370370 else throw("Strict value is not equal to itself.")
371371 }
372372 }
373373 else throw("Strict value is not equal to itself.")
374374 }
375375 }
376376 }
377377
378378
379379 @Verifier(tx)
380380 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
381381

github/deemru/w8io/3ef1775 
47.39 ms