tx · 3LapG6R7tHyCvhzxeDJreDFqL3uefc2BH2XJNEQK39pa

3MxiJLrY6Qa5bSYxxSFHSG5bVV2n59x1MGn:  -0.01400000 Waves

2022.05.18 12:47 [2056937] smart account 3MxiJLrY6Qa5bSYxxSFHSG5bVV2n59x1MGn > SELF 0.00000000 Waves

{ "type": 13, "id": "3LapG6R7tHyCvhzxeDJreDFqL3uefc2BH2XJNEQK39pa", "fee": 1400000, "feeAssetId": null, "timestamp": 1652867276920, "version": 2, "chainId": 84, "sender": "3MxiJLrY6Qa5bSYxxSFHSG5bVV2n59x1MGn", "senderPublicKey": "9M1hAsbWkVP73NKHvZezCkamwZfSdkejc3b8sejqT98D", "proofs": [ "2xgvvzto4vG3RfMxH4omWvuHQsk2RpC4KK9y3EEXXibMT3ATipHZvc9kwf9yE7XEGS3keag7QwG3up29zsCSa6pV" ], "script": "base64:AAIFAAAAAAAAAAgIAhIECgIBAQAAACAAAAAACXNlcGFyYXRvcgIAAAABXwAAAAANc2hhcmVEZWNpbWFscwAN4Lazp2QAAAAAAAASa2V5Q2hhckN1cnJlbnRMYW5kAgAAABFjaGFyX2N1cnJlbnRfbGFuZAAAAAAfa2V5Q2hhckluaXRpYWxHZW5lcmF0ZWRTdXBwbGllcwIAAAAfY2hhcl9pbml0aWFsX2dlbmVyYXRlZF9zdXBwbGllcwAAAAAQa2V5TGFuZFB5cm9Qb3dlcgIAAAAPbGFuZF9weXJvX3Bvd2VyAAAAABBrZXlMYW5kQXF1YVBvd2VyAgAAAA9sYW5kX2FxdWFfcG93ZXIAAAAAEWtleUxhbmRUZXJyYVBvd2VyAgAAABBsYW5kX3RlcnJhX3Bvd2VyAAAAABBrZXlMYW5kQWVyb1Bvd2VyAgAAAA9sYW5kX2Flcm9fcG93ZXIAAAAAF2tleUNoYXJJbml0aWFsUHlyb1NoYXJlAgAAABdjaGFyX2luaXRpYWxfcHlyb19zaGFyZQAAAAAXa2V5Q2hhckluaXRpYWxBcXVhU2hhcmUCAAAAF2NoYXJfaW5pdGlhbF9hcXVhX3NoYXJlAAAAABhrZXlDaGFySW5pdGlhbFRlcnJhU2hhcmUCAAAAGGNoYXJfaW5pdGlhbF90ZXJyYV9zaGFyZQAAAAAXa2V5Q2hhckluaXRpYWxBZXJvU2hhcmUCAAAAF2NoYXJfaW5pdGlhbF9hZXJvX3NoYXJlAAAAABJrZXlDaGFyVG90YWxJbmNvbWUCAAAAEWNoYXJfdG90YWxfaW5jb21lAAAAABVrZXlBZGRyZXNzVG90YWxJbmNvbWUCAAAAFGFkZHJlc3NfdG90YWxfaW5jb21lAAAAAAZnb3ZBcHAJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAECAAAAIzNNeXhmd3ZidWVVQnluWUhmUXN1dE5YWk5xTm96R2lNbnNHAAAAABVrZXlFY29zeXN0ZW1BZGRyZXNzZXMCAAAAE2Vjb3N5c3RlbV9hZGRyZXNzZXMAAAAADWtleVRvdGFsTGFuZHMCAAAAC3RvdGFsX2xhbmRzAAAAABRrZXlUb2tlbkVtaXNzaW9uUmF0ZQIAAAATdG9rZW5fZW1pc3Npb25fcmF0ZQAAAAAIY2hhcnNBcHAJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAECAAAAIzNOQTNMUlNpZ2s2a25MWjE2dVR6Y2RMTm93MkVRWnRYVGFKAAAAAAhrZXlPd25lcgIAAAAFb3duZXIAAAAAE2tleU5hdHVyYWxQeXJvQm9udXMCAAAAEm5hdHVyYWxfcHlyb19ib251cwAAAAATa2V5TmF0dXJhbEFxdWFCb251cwIAAAASbmF0dXJhbF9hcXVhX2JvbnVzAAAAABRrZXlOYXR1cmFsVGVycmFCb251cwIAAAATbmF0dXJhbF90ZXJyYV9ib251cwAAAAATa2V5TmF0dXJhbEFlcm9Cb251cwIAAAASbmF0dXJhbF9hZXJvX2JvbnVzAQAAAAxpbnZva2VDaGVja3MAAAABAAAACmNhbGxlckFkZHIDCQEAAAACIT0AAAACCQAEHgAAAAEFAAAABmdvdkFwcAcJAAACAAAAAQIAAAAXR292ZXJuaW5nIGFwcCBub3QgcmVhZHkEAAAAEmVjb3N5c3RlbUFkZHJlc3NlcwkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAGZ292QXBwBQAAABVrZXlFY29zeXN0ZW1BZGRyZXNzZXMDCQEAAAACIT0AAAACCQEAAAAIY29udGFpbnMAAAACBQAAABJlY29zeXN0ZW1BZGRyZXNzZXMJAAQlAAAAAQUAAAAKY2FsbGVyQWRkcgcJAAACAAAAAQIAAAANQWNjZXNzIGRlbmllZAYBAAAABHdpdGgAAAACAAAAAWEAAAABYgQAAAABYwQAAAAHJG1hdGNoMAUAAAABYgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAVpc0ludAUAAAAHJG1hdGNoMAkAAaQAAAABBQAAAAVpc0ludAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAVpc1N0cgUAAAAHJG1hdGNoMAUAAAAFaXNTdHIJAAACAAAAAQIAAAAfTWF0Y2hpbmcgaXNzdWUgaW4gd2l0aCBmdW5jdGlvbgkAASwAAAACCQABLAAAAAIFAAAAAWMFAAAACXNlcGFyYXRvcgUAAAABYQEAAAAXZ2V0Q2hhck5hdHVyYWxFbGVtQm9udXMAAAABAAAABmNoYXJJZAkABEwAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAhjaGFyc0FwcAkBAAAABHdpdGgAAAACBQAAABNrZXlOYXR1cmFsUHlyb0JvbnVzBQAAAAZjaGFySWQJAARMAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAIY2hhcnNBcHAJAQAAAAR3aXRoAAAAAgUAAAATa2V5TmF0dXJhbEFxdWFCb251cwUAAAAGY2hhcklkCQAETAAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAACGNoYXJzQXBwCQEAAAAEd2l0aAAAAAIFAAAAFGtleU5hdHVyYWxUZXJyYUJvbnVzBQAAAAZjaGFySWQJAARMAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAIY2hhcnNBcHAJAQAAAAR3aXRoAAAAAgUAAAATa2V5TmF0dXJhbEFlcm9Cb251cwUAAAAGY2hhcklkBQAAAANuaWwBAAAAEGdldExhbmRFbGVtUG93ZXIAAAABAAAABmxhbmRJZAkABEwAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAAR3aXRoAAAAAgUAAAAQa2V5TGFuZFB5cm9Qb3dlcgUAAAAGbGFuZElkAAAAAAAAAAAACQAETAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAABHdpdGgAAAACBQAAABBrZXlMYW5kQXF1YVBvd2VyBQAAAAZsYW5kSWQAAAAAAAAAAAAJAARMAAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAEd2l0aAAAAAIFAAAAEWtleUxhbmRUZXJyYVBvd2VyBQAAAAZsYW5kSWQAAAAAAAAAAAAJAARMAAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAEd2l0aAAAAAIFAAAAEGtleUxhbmRBZXJvUG93ZXIFAAAABmxhbmRJZAAAAAAAAAAAAAUAAAADbmlsAQAAABRjYWxjTmV3TGFuZEVsZW1Qb3dlcgAAAAIAAAAGbGFuZElkAAAAFGNoYXJOYXR1cmFsRWxlbUJvbnVzBAAAABBuZXdMYW5kRWxlbVBvd2VyCQEAAAAQZ2V0TGFuZEVsZW1Qb3dlcgAAAAEFAAAABmxhbmRJZAkABEwAAAACCQAAZAAAAAIJAAGRAAAAAgUAAAAQbmV3TGFuZEVsZW1Qb3dlcgAAAAAAAAAAAAkAAZEAAAACBQAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwAAAAAAAAAAAAkABEwAAAACCQAAZAAAAAIJAAGRAAAAAgUAAAAQbmV3TGFuZEVsZW1Qb3dlcgAAAAAAAAAAAQkAAZEAAAACBQAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwAAAAAAAAAAAQkABEwAAAACCQAAZAAAAAIJAAGRAAAAAgUAAAAQbmV3TGFuZEVsZW1Qb3dlcgAAAAAAAAAAAgkAAZEAAAACBQAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwAAAAAAAAAAAgkABEwAAAACCQAAZAAAAAIJAAGRAAAAAgUAAAAQbmV3TGFuZEVsZW1Qb3dlcgAAAAAAAAAAAwkAAZEAAAACBQAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwAAAAAAAAAAAwUAAAADbmlsAQAAABRjYWxjT2xkTGFuZEVsZW1Qb3dlcgAAAAIAAAAQb2xkTGFuZEVsZW1Qb3dlcgAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwkABEwAAAACCQAAZQAAAAIJAAGRAAAAAgUAAAAQb2xkTGFuZEVsZW1Qb3dlcgAAAAAAAAAAAAkAAZEAAAACBQAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwAAAAAAAAAAAAkABEwAAAACCQAAZQAAAAIJAAGRAAAAAgUAAAAQb2xkTGFuZEVsZW1Qb3dlcgAAAAAAAAAAAQkAAZEAAAACBQAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwAAAAAAAAAAAQkABEwAAAACCQAAZQAAAAIJAAGRAAAAAgUAAAAQb2xkTGFuZEVsZW1Qb3dlcgAAAAAAAAAAAgkAAZEAAAACBQAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwAAAAAAAAAAAgkABEwAAAACCQAAZQAAAAIJAAGRAAAAAgUAAAAQb2xkTGFuZEVsZW1Qb3dlcgAAAAAAAAAAAwkAAZEAAAACBQAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwAAAAAAAAAAAwUAAAADbmlsAQAAABJjYWxjQ2hhckVsZW1TaGFyZXMAAAACAAAAEGNoYXJOYXR1cmFsQm9udXMAAAANbGFuZEVsZW1Qb3dlcgkABEwAAAACCQAAawAAAAMFAAAADXNoYXJlRGVjaW1hbHMJAAGRAAAAAgUAAAAQY2hhck5hdHVyYWxCb251cwAAAAAAAAAAAAkAAZEAAAACBQAAAA1sYW5kRWxlbVBvd2VyAAAAAAAAAAAACQAETAAAAAIJAABrAAAAAwUAAAANc2hhcmVEZWNpbWFscwkAAZEAAAACBQAAABBjaGFyTmF0dXJhbEJvbnVzAAAAAAAAAAABCQABkQAAAAIFAAAADWxhbmRFbGVtUG93ZXIAAAAAAAAAAAEJAARMAAAAAgkAAGsAAAADBQAAAA1zaGFyZURlY2ltYWxzCQABkQAAAAIFAAAAEGNoYXJOYXR1cmFsQm9udXMAAAAAAAAAAAIJAAGRAAAAAgUAAAANbGFuZEVsZW1Qb3dlcgAAAAAAAAAAAgkABEwAAAACCQAAawAAAAMFAAAADXNoYXJlRGVjaW1hbHMJAAGRAAAAAgUAAAAQY2hhck5hdHVyYWxCb251cwAAAAAAAAAAAwkAAZEAAAACBQAAAA1sYW5kRWxlbVBvd2VyAAAAAAAAAAADBQAAAANuaWwBAAAADmNhbGNDaGFySW5jb21lAAAABAAAAAZjaGFySWQAAAAQb2xkTGFuZEVsZW1Qb3dlcgAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwAAABhjdXJyZW50R2VuZXJhdGVkU3VwcGxpZXMEAAAAHG9sZExhbmRDaGFyQ3VycmVudEVsZW1TaGFyZXMJAQAAABJjYWxjQ2hhckVsZW1TaGFyZXMAAAACBQAAABBvbGRMYW5kRWxlbVBvd2VyBQAAABRjaGFyTmF0dXJhbEVsZW1Cb251cwQAAAAcb2xkTGFuZENoYXJBdmVyYWdlRWxlbVNoYXJlcwkABEwAAAACCQAAaQAAAAIJAABkAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwkBAAAABHdpdGgAAAACBQAAABdrZXlDaGFySW5pdGlhbFB5cm9TaGFyZQUAAAAGY2hhcklkCQABkQAAAAIFAAAAHG9sZExhbmRDaGFyQ3VycmVudEVsZW1T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AAAGbGFuZElkCQAAAgAAAAECAAAAGUNoYXIgYWxyZWFkeSBvbiB0aGF0IGxhbmQEAAAAFGNoYXJOYXR1cmFsRWxlbUJvbnVzCQEAAAAXZ2V0Q2hhck5hdHVyYWxFbGVtQm9udXMAAAABBQAAAAZjaGFySWQEAAAAEG9sZExhbmRFbGVtUG93ZXIJAQAAABBnZXRMYW5kRWxlbVBvd2VyAAAAAQUAAAALY3VycmVudExhbmQEAAAAHmN1cnJlbnRHZW5lcmF0ZWRTdXBwbGllc1Jlc3VsdAkAA/wAAAAEBQAAAAZnb3ZBcHACAAAAFGdldEdlbmVyYXRlZFN1cHBsaWVzBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAeY3VycmVudEdlbmVyYXRlZFN1cHBsaWVzUmVzdWx0BQAAAB5jdXJyZW50R2VuZXJhdGVkU3VwcGxpZXNSZXN1bHQEAAAAGGN1cnJlbnRHZW5lcmF0ZWRTdXBwbGllcwQAAAAHJG1hdGNoMAUAAAAeY3VycmVudEdlbmVyYXRlZFN1cHBsaWVzUmVzdWx0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAABWlzSW50BQAAAAckbWF0Y2gwBQAAAAVpc0ludAkAAAIAAAABAgAAABFCYWQgaW52b2tlIHJlc3VsdAQAAAAOam9pbmluZ0FjdGlvbnMDCQEAAAACIT0AAAACBQAAAAZsYW5kSWQAAAAAAAAAAAAEAAAAE25ld0xhbmROZXdFbGVtUG93ZXIJAQAAABRjYWxjTmV3TGFuZEVsZW1Qb3dlcgAAAAIFAAAABmxhbmRJZAUAAAAUY2hhck5hdHVyYWxFbGVtQm9udXMEAAAAFW5ld0xhbmRDaGFyRWxlbVNoYXJlcwkBAAAAEmNhbGNDaGFyRWxlbVNoYXJlcwAAAAIFAAAAFGNoYXJOYXR1cmFsRWxlbUJvbnVzBQAAABNuZXdMYW5kTmV3RWxlbVBvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAEGtleUxhbmRQeXJvUG93ZXIFAAAABmxhbmRJZAkAAZEAAAACBQAAABNuZXdMYW5kTmV3RWxlbVBvd2VyAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAEGtleUxhbmRBcXVhUG93ZXIFAAAABmxhbmRJZAkAAZEAAAACBQAAABNuZXdMYW5kTmV3RWxlbVBvd2VyAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAEWtleUxhbmRUZXJyYVBvd2VyBQAAAAZsYW5kSWQJAAGRAAAAAgUAAAATbmV3TGFuZE5ld0VsZW1Qb3dlcgAAAAAAAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABBrZXlMYW5kQWVyb1Bvd2VyBQAAAAZsYW5kSWQJAAGRAAAAAgUAAAATbmV3TGFuZE5ld0VsZW1Qb3dlcgAAAAAAAAAAAwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAAB9rZXlDaGFySW5pdGlhbEdlbmVyYXRlZFN1cHBsaWVzBQAAAAZjaGFySWQFAAAAGGN1cnJlbnRHZW5lcmF0ZWRTdXBwbGllcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABdrZXlDaGFySW5pdGlhbFB5cm9TaGFyZQUAAAAGY2hhcklkCQABkQAAAAIFAAAAFW5ld0xhbmRDaGFyRWxlbVNoYXJlcwAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABdrZXlDaGFySW5pdGlhbEFxdWFTaGFyZQUAAAAGY2hhcklkCQABkQAAAAIFAAAAFW5ld0xhbmRDaGFyRWxlbVNoYXJlcwAAAAAAAAAAAQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABhrZXlDaGFySW5pdGlhbFRlcnJhU2hhcmUFAAAABmNoYXJJZAkAAZEAAAACBQAAABVuZXdMYW5kQ2hhckVsZW1TaGFyZXMAAAAAAAAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAAXa2V5Q2hhckluaXRpYWxBZXJvU2hhcmUFAAAABmNoYXJJZAkAAZEAAAACBQAAABVuZXdMYW5kQ2hhckVsZW1TaGFyZXMAAAAAAAAAAAMFAAAAA25pbAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAEd2l0aAAAAAIFAAAAH2tleUNoYXJJbml0aWFsR2VuZXJhdGVkU3VwcGxpZXMFAAAABmNoYXJJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAEd2l0aAAAAAIFAAAAF2tleUNoYXJJbml0aWFsUHlyb1NoYXJlBQAAAAZjaGFySWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAABHdpdGgAAAACBQAAABdrZXlDaGFySW5pdGlhbEFxdWFTaGFyZQUAAAAGY2hhcklkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAR3aXRoAAAAAgUAAAAYa2V5Q2hhckluaXRpYWxUZXJyYVNoYXJlBQAAAAZjaGFySWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAABHdpdGgAAAACBQAAABdrZXlDaGFySW5pdGlhbEFlcm9TaGFyZQUAAAAGY2hhcklkBQAAAANuaWwEAAAADmV4aXRpbmdBY3Rpb25zAwkBAAAAAiE9AAAAAgUAAAALY3VycmVudExhbmQAAAAAAAAAAAAEAAAAE3NlbmRUb2tlbnNUb0FkZHJlc3MJAAP8AAAABAUAAAAGZ292QXBwAgAAABNzZW5kVG9rZW5zVG9BZGRyZXNzCQAETAAAAAIJAQAAAA5jYWxjQ2hhckluY29tZQAAAAQFAAAABmNoYXJJZAUAAAAQb2xkTGFuZEVsZW1Qb3dlcgUAAAAUY2hhck5hdHVyYWxFbGVtQm9udXMFAAAAGGN1cnJlbnRHZW5lcmF0ZWRTdXBwbGllcwkABEwAAAACCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAATc2VuZFRva2Vuc1RvQWRkcmVzcwUAAAATc2VuZFRva2Vuc1RvQWRkcmVzcwQAAAAPY2hhclRva2VuSW5jb21lBAAAAAckbWF0Y2gwBQAAABNzZW5kVG9rZW5zVG9BZGRyZXNzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAABWlzSW50BQAAAAckbWF0Y2gwBQAAAAVpc0ludAkAAAIAAAABAgAAAAxJbnZva2UgaXNzdWUEAAAAEm5ld0NoYXJUb3RhbEluY29tZQkAAGQAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAAR3aXRoAAAAAgUAAAASa2V5Q2hhclRvdGFsSW5jb21lBQAAAAZjaGFySWQAAAAAAAAAAAAFAAAAD2NoYXJUb2tlbkluY29tZQQAAAAVbmV3QWRkcmVzc1RvdGFsSW5jb21lCQAAZAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAABHdpdGgAAAACBQAAABVrZXlBZGRyZXNzVG90YWxJbmNvbWUFAAAACmNhbGxlckFkZHIAAAAAAAAAAAAFAAAAD2NoYXJUb2tlbkluY29tZQQAAAATb2xkTGFuZE5ld0VsZW1Qb3dlcgkBAAAAFGNhbGNPbGRMYW5kRWxlbVBvd2VyAAAAAgUAAAAQb2xkTGFuZEVsZW1Qb3dlcgUAAAAUY2hhck5hdHVyYWxFbGVtQm9udXMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAASa2V5Q2hhclRvdGFsSW5jb21lBQAAAAZjaGFySWQFAAAAEm5ld0NoYXJUb3RhbEluY29tZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABVrZXlBZGRyZXNzVG90YWxJbmNvbWUFAAAACmNhbGxlckFkZHIFAAAAEm5ld0NoYXJUb3RhbEluY29tZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABBrZXlMYW5kUHlyb1Bvd2VyBQAAAAtjdXJyZW50TGFuZAkAAZEAAAACBQAAABNvbGRMYW5kTmV3RWxlbVBvd2VyAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAEGtleUxhbmRBcXVhUG93ZXIFAAAAC2N1cnJlbnRMYW5kCQABkQAAAAIFAAAAE29sZExhbmROZXdFbGVtUG93ZXIAAAAAAAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAARa2V5TGFuZFRlcnJhUG93ZXIFAAAAC2N1cnJlbnRMYW5kCQABkQAAAAIFAAAAE29sZExhbmROZXdFbGVtUG93ZXIAAAAAAAAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAAQa2V5TGFuZEFlcm9Qb3dlcgUAAAALY3VycmVudExhbmQJAAGRAAAAAgUAAAATb2xkTGFuZE5ld0VsZW1Qb3dlcgAAAAAAAAAAAwUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUAAAADbmlsCQAETgAAAAIJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABJrZXlDaGFyQ3VycmVudExhbmQFAAAABmNoYXJJZAUAAAAGbGFuZElkBQAAAANuaWwFAAAADmpvaW5pbmdBY3Rpb25zBQAAAA5leGl0aW5nQWN0aW9ucwkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleYHftKo=", "height": 2056937, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FQ6hkEt3dQ2Y4TgAUvv9d9ogU2PVsLT93nNPv12VjSZP Next: HZbJruGLQVyqmptfspxsKMnM7YqWwNAsYUfQkEgubWa3 Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "_"
55
6-let keyCurrentLand = "current_land"
6+let shareDecimals = 1000000000000000000
77
8-let keyStartingHeight = "starting_height"
8+let keyCharCurrentLand = "char_current_land"
99
10-let keyStartingGeneratedSupplies = "starting_generated_supplies"
10+let keyCharInitialGeneratedSupplies = "char_initial_generated_supplies"
1111
12-let govAddr = addressFromStringValue("3MyxfwvbueUBynYHfQsutNXZNqNozGiMnsG")
12+let keyLandPyroPower = "land_pyro_power"
13+
14+let keyLandAquaPower = "land_aqua_power"
15+
16+let keyLandTerraPower = "land_terra_power"
17+
18+let keyLandAeroPower = "land_aero_power"
19+
20+let keyCharInitialPyroShare = "char_initial_pyro_share"
21+
22+let keyCharInitialAquaShare = "char_initial_aqua_share"
23+
24+let keyCharInitialTerraShare = "char_initial_terra_share"
25+
26+let keyCharInitialAeroShare = "char_initial_aero_share"
27+
28+let keyCharTotalIncome = "char_total_income"
29+
30+let keyAddressTotalIncome = "address_total_income"
31+
32+let govApp = addressFromStringValue("3MyxfwvbueUBynYHfQsutNXZNqNozGiMnsG")
1333
1434 let keyEcosystemAddresses = "ecosystem_addresses"
1535
1636 let keyTotalLands = "total_lands"
1737
18-let charsAddr = addressFromStringValue("3NA3LRSigk6knLZ16uTzcdLNow2EQZtXTaJ")
38+let keyTokenEmissionRate = "token_emission_rate"
1939
20-let keyChar = "char"
40+let charsApp = addressFromStringValue("3NA3LRSigk6knLZ16uTzcdLNow2EQZtXTaJ")
2141
2242 let keyOwner = "owner"
2343
24-func invokChecks (callerAddr) = if ((isDataStorageUntouched(govAddr) != false))
44+let keyNaturalPyroBonus = "natural_pyro_bonus"
45+
46+let keyNaturalAquaBonus = "natural_aqua_bonus"
47+
48+let keyNaturalTerraBonus = "natural_terra_bonus"
49+
50+let keyNaturalAeroBonus = "natural_aero_bonus"
51+
52+func invokeChecks (callerAddr) = if ((isDataStorageUntouched(govApp) != false))
2553 then throw("Governing app not ready")
2654 else {
27- let ecosystemAddresses = getStringValue(govAddr, keyEcosystemAddresses)
55+ let ecosystemAddresses = getStringValue(govApp, keyEcosystemAddresses)
2856 if ((contains(ecosystemAddresses, toString(callerAddr)) != false))
2957 then throw("Access denied")
30- else unit
58+ else true
3159 }
3260
3361
34-func with (a,b) = ((toString(b) + separator) + a)
62+func with (a,b) = {
63+ let c = match b {
64+ case isInt: Int =>
65+ toString(isInt)
66+ case isStr: String =>
67+ isStr
68+ case _ =>
69+ throw("Matching issue in with function")
70+ }
71+ ((c + separator) + a)
72+ }
73+
74+
75+func getCharNaturalElemBonus (charId) = [getIntegerValue(charsApp, with(keyNaturalPyroBonus, charId)), getIntegerValue(charsApp, with(keyNaturalAquaBonus, charId)), getIntegerValue(charsApp, with(keyNaturalTerraBonus, charId)), getIntegerValue(charsApp, with(keyNaturalAeroBonus, charId))]
76+
77+
78+func getLandElemPower (landId) = [valueOrElse(getInteger(this, with(keyLandPyroPower, landId)), 0), valueOrElse(getInteger(this, with(keyLandAquaPower, landId)), 0), valueOrElse(getInteger(this, with(keyLandTerraPower, landId)), 0), valueOrElse(getInteger(this, with(keyLandAeroPower, landId)), 0)]
79+
80+
81+func calcNewLandElemPower (landId,charNaturalElemBonus) = {
82+ let newLandElemPower = getLandElemPower(landId)
83+[(newLandElemPower[0] + charNaturalElemBonus[0]), (newLandElemPower[1] + charNaturalElemBonus[1]), (newLandElemPower[2] + charNaturalElemBonus[2]), (newLandElemPower[3] + charNaturalElemBonus[3])]
84+ }
85+
86+
87+func calcOldLandElemPower (oldLandElemPower,charNaturalElemBonus) = [(oldLandElemPower[0] - charNaturalElemBonus[0]), (oldLandElemPower[1] - charNaturalElemBonus[1]), (oldLandElemPower[2] - charNaturalElemBonus[2]), (oldLandElemPower[3] - charNaturalElemBonus[3])]
88+
89+
90+func calcCharElemShares (charNaturalBonus,landElemPower) = [fraction(shareDecimals, charNaturalBonus[0], landElemPower[0]), fraction(shareDecimals, charNaturalBonus[1], landElemPower[1]), fraction(shareDecimals, charNaturalBonus[2], landElemPower[2]), fraction(shareDecimals, charNaturalBonus[3], landElemPower[3])]
91+
92+
93+func calcCharIncome (charId,oldLandElemPower,charNaturalElemBonus,currentGeneratedSupplies) = {
94+ let oldLandCharCurrentElemShares = calcCharElemShares(oldLandElemPower, charNaturalElemBonus)
95+ let oldLandCharAverageElemShares = [((getIntegerValue(this, with(keyCharInitialPyroShare, charId)) + oldLandCharCurrentElemShares[0]) / 2), ((getIntegerValue(this, with(keyCharInitialAquaShare, charId)) + oldLandCharCurrentElemShares[1]) / 2), ((getIntegerValue(this, with(keyCharInitialTerraShare, charId)) + oldLandCharCurrentElemShares[2]) / 2), ((getIntegerValue(this, with(keyCharInitialAeroShare, charId)) + oldLandCharCurrentElemShares[3]) / 2)]
96+ let charEligibleSupplies = (((currentGeneratedSupplies - getIntegerValue(this, with(keyCharInitialGeneratedSupplies, charId))) / getIntegerValue(govApp, keyTotalLands)) / 4)
97+ (((fraction(charEligibleSupplies, oldLandCharAverageElemShares[0], shareDecimals) + fraction(charEligibleSupplies, oldLandCharAverageElemShares[1], shareDecimals)) + fraction(charEligibleSupplies, oldLandCharAverageElemShares[2], shareDecimals)) + fraction(charEligibleSupplies, oldLandCharAverageElemShares[3], shareDecimals))
98+ }
3599
36100
37101 @Callable(i)
38-func bindCharToLand (charId,landId) = valueOrElse(invokChecks(i.caller), if ((getStringValue(charsAddr, with(keyOwner, charId)) != toBase58String(i.caller.bytes)))
39- then throw("Caller doesn't own this char")
40- else if (if ((1 > landId))
41- then true
42- else (landId > getIntegerValue(govAddr, keyTotalLands)))
43- then throw("Unknown land")
44- else {
45- let currentGeneratedTokensResult = invoke(govAddr, "getGeneratedSupplies", nil, nil)
46- if ((currentGeneratedTokensResult == currentGeneratedTokensResult))
47- then {
48- let currentGeneratedTokens = match currentGeneratedTokensResult {
49- case isInt: Int =>
50- isInt
51- case _ =>
52- throw("Invok result")
102+func charMovingLand (charId,landId) = if ((invokeChecks(i.caller) != true))
103+ then throw()
104+ else {
105+ let callerAddr = toBase58String(i.caller.bytes)
106+ if ((getStringValue(charsApp, with(keyOwner, charId)) != callerAddr))
107+ then throw("Caller doesn't own this char")
108+ else if (if ((0 > landId))
109+ then true
110+ else (landId > getIntegerValue(govApp, keyTotalLands)))
111+ then throw("Not a land")
112+ else {
113+ let currentLand = valueOrElse(getInteger(this, with(keyCharCurrentLand, charId)), 0)
114+ if ((currentLand == landId))
115+ then throw("Char already on that land")
116+ else {
117+ let charNaturalElemBonus = getCharNaturalElemBonus(charId)
118+ let oldLandElemPower = getLandElemPower(currentLand)
119+ let currentGeneratedSuppliesResult = invoke(govApp, "getGeneratedSupplies", nil, nil)
120+ if ((currentGeneratedSuppliesResult == currentGeneratedSuppliesResult))
121+ then {
122+ let currentGeneratedSupplies = match currentGeneratedSuppliesResult {
123+ case isInt: Int =>
124+ isInt
125+ case _ =>
126+ throw("Bad invoke result")
127+ }
128+ let joiningActions = if ((landId != 0))
129+ then {
130+ let newLandNewElemPower = calcNewLandElemPower(landId, charNaturalElemBonus)
131+ let newLandCharElemShares = calcCharElemShares(charNaturalElemBonus, newLandNewElemPower)
132+[IntegerEntry(with(keyLandPyroPower, landId), newLandNewElemPower[0]), IntegerEntry(with(keyLandAquaPower, landId), newLandNewElemPower[1]), IntegerEntry(with(keyLandTerraPower, landId), newLandNewElemPower[2]), IntegerEntry(with(keyLandAeroPower, landId), newLandNewElemPower[3]), IntegerEntry(with(keyCharInitialGeneratedSupplies, charId), currentGeneratedSupplies), IntegerEntry(with(keyCharInitialPyroShare, charId), newLandCharElemShares[0]), IntegerEntry(with(keyCharInitialAquaShare, charId), newLandCharElemShares[1]), IntegerEntry(with(keyCharInitialTerraShare, charId), newLandCharElemShares[2]), IntegerEntry(with(keyCharInitialAeroShare, charId), newLandCharElemShares[3])]
133+ }
134+ else [DeleteEntry(with(keyCharInitialGeneratedSupplies, charId)), DeleteEntry(with(keyCharInitialPyroShare, charId)), DeleteEntry(with(keyCharInitialAquaShare, charId)), DeleteEntry(with(keyCharInitialTerraShare, charId)), DeleteEntry(with(keyCharInitialAeroShare, charId))]
135+ let exitingActions = if ((currentLand != 0))
136+ then {
137+ let sendTokensToAddress = invoke(govApp, "sendTokensToAddress", [calcCharIncome(charId, oldLandElemPower, charNaturalElemBonus, currentGeneratedSupplies), i.caller.bytes], nil)
138+ if ((sendTokensToAddress == sendTokensToAddress))
139+ then {
140+ let charTokenIncome = match sendTokensToAddress {
141+ case isInt: Int =>
142+ isInt
143+ case _ =>
144+ throw("Invoke issue")
145+ }
146+ let newCharTotalIncome = (valueOrElse(getInteger(this, with(keyCharTotalIncome, charId)), 0) + charTokenIncome)
147+ let newAddressTotalIncome = (valueOrElse(getInteger(this, with(keyAddressTotalIncome, callerAddr)), 0) + charTokenIncome)
148+ let oldLandNewElemPower = calcOldLandElemPower(oldLandElemPower, charNaturalElemBonus)
149+[IntegerEntry(with(keyCharTotalIncome, charId), newCharTotalIncome), IntegerEntry(with(keyAddressTotalIncome, callerAddr), newCharTotalIncome), IntegerEntry(with(keyLandPyroPower, currentLand), oldLandNewElemPower[0]), IntegerEntry(with(keyLandAquaPower, currentLand), oldLandNewElemPower[1]), IntegerEntry(with(keyLandTerraPower, currentLand), oldLandNewElemPower[2]), IntegerEntry(with(keyLandAeroPower, currentLand), oldLandNewElemPower[3])]
150+ }
151+ else throw("Strict value is not equal to itself.")
152+ }
153+ else nil
154+ (([IntegerEntry(with(keyCharCurrentLand, charId), landId)] ++ joiningActions) ++ exitingActions)
155+ }
156+ else throw("Strict value is not equal to itself.")
157+ }
53158 }
54-[IntegerEntry(with(keyCurrentLand, charId), landId), IntegerEntry(with(keyStartingHeight, charId), height), IntegerEntry(with(keyStartingGeneratedSupplies, charId), currentGeneratedTokens)]
55- }
56- else throw("Strict value is not equal to itself.")
57- })
159+ }
58160
59161
60162 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "_"
55
6-let keyCurrentLand = "current_land"
6+let shareDecimals = 1000000000000000000
77
8-let keyStartingHeight = "starting_height"
8+let keyCharCurrentLand = "char_current_land"
99
10-let keyStartingGeneratedSupplies = "starting_generated_supplies"
10+let keyCharInitialGeneratedSupplies = "char_initial_generated_supplies"
1111
12-let govAddr = addressFromStringValue("3MyxfwvbueUBynYHfQsutNXZNqNozGiMnsG")
12+let keyLandPyroPower = "land_pyro_power"
13+
14+let keyLandAquaPower = "land_aqua_power"
15+
16+let keyLandTerraPower = "land_terra_power"
17+
18+let keyLandAeroPower = "land_aero_power"
19+
20+let keyCharInitialPyroShare = "char_initial_pyro_share"
21+
22+let keyCharInitialAquaShare = "char_initial_aqua_share"
23+
24+let keyCharInitialTerraShare = "char_initial_terra_share"
25+
26+let keyCharInitialAeroShare = "char_initial_aero_share"
27+
28+let keyCharTotalIncome = "char_total_income"
29+
30+let keyAddressTotalIncome = "address_total_income"
31+
32+let govApp = addressFromStringValue("3MyxfwvbueUBynYHfQsutNXZNqNozGiMnsG")
1333
1434 let keyEcosystemAddresses = "ecosystem_addresses"
1535
1636 let keyTotalLands = "total_lands"
1737
18-let charsAddr = addressFromStringValue("3NA3LRSigk6knLZ16uTzcdLNow2EQZtXTaJ")
38+let keyTokenEmissionRate = "token_emission_rate"
1939
20-let keyChar = "char"
40+let charsApp = addressFromStringValue("3NA3LRSigk6knLZ16uTzcdLNow2EQZtXTaJ")
2141
2242 let keyOwner = "owner"
2343
24-func invokChecks (callerAddr) = if ((isDataStorageUntouched(govAddr) != false))
44+let keyNaturalPyroBonus = "natural_pyro_bonus"
45+
46+let keyNaturalAquaBonus = "natural_aqua_bonus"
47+
48+let keyNaturalTerraBonus = "natural_terra_bonus"
49+
50+let keyNaturalAeroBonus = "natural_aero_bonus"
51+
52+func invokeChecks (callerAddr) = if ((isDataStorageUntouched(govApp) != false))
2553 then throw("Governing app not ready")
2654 else {
27- let ecosystemAddresses = getStringValue(govAddr, keyEcosystemAddresses)
55+ let ecosystemAddresses = getStringValue(govApp, keyEcosystemAddresses)
2856 if ((contains(ecosystemAddresses, toString(callerAddr)) != false))
2957 then throw("Access denied")
30- else unit
58+ else true
3159 }
3260
3361
34-func with (a,b) = ((toString(b) + separator) + a)
62+func with (a,b) = {
63+ let c = match b {
64+ case isInt: Int =>
65+ toString(isInt)
66+ case isStr: String =>
67+ isStr
68+ case _ =>
69+ throw("Matching issue in with function")
70+ }
71+ ((c + separator) + a)
72+ }
73+
74+
75+func getCharNaturalElemBonus (charId) = [getIntegerValue(charsApp, with(keyNaturalPyroBonus, charId)), getIntegerValue(charsApp, with(keyNaturalAquaBonus, charId)), getIntegerValue(charsApp, with(keyNaturalTerraBonus, charId)), getIntegerValue(charsApp, with(keyNaturalAeroBonus, charId))]
76+
77+
78+func getLandElemPower (landId) = [valueOrElse(getInteger(this, with(keyLandPyroPower, landId)), 0), valueOrElse(getInteger(this, with(keyLandAquaPower, landId)), 0), valueOrElse(getInteger(this, with(keyLandTerraPower, landId)), 0), valueOrElse(getInteger(this, with(keyLandAeroPower, landId)), 0)]
79+
80+
81+func calcNewLandElemPower (landId,charNaturalElemBonus) = {
82+ let newLandElemPower = getLandElemPower(landId)
83+[(newLandElemPower[0] + charNaturalElemBonus[0]), (newLandElemPower[1] + charNaturalElemBonus[1]), (newLandElemPower[2] + charNaturalElemBonus[2]), (newLandElemPower[3] + charNaturalElemBonus[3])]
84+ }
85+
86+
87+func calcOldLandElemPower (oldLandElemPower,charNaturalElemBonus) = [(oldLandElemPower[0] - charNaturalElemBonus[0]), (oldLandElemPower[1] - charNaturalElemBonus[1]), (oldLandElemPower[2] - charNaturalElemBonus[2]), (oldLandElemPower[3] - charNaturalElemBonus[3])]
88+
89+
90+func calcCharElemShares (charNaturalBonus,landElemPower) = [fraction(shareDecimals, charNaturalBonus[0], landElemPower[0]), fraction(shareDecimals, charNaturalBonus[1], landElemPower[1]), fraction(shareDecimals, charNaturalBonus[2], landElemPower[2]), fraction(shareDecimals, charNaturalBonus[3], landElemPower[3])]
91+
92+
93+func calcCharIncome (charId,oldLandElemPower,charNaturalElemBonus,currentGeneratedSupplies) = {
94+ let oldLandCharCurrentElemShares = calcCharElemShares(oldLandElemPower, charNaturalElemBonus)
95+ let oldLandCharAverageElemShares = [((getIntegerValue(this, with(keyCharInitialPyroShare, charId)) + oldLandCharCurrentElemShares[0]) / 2), ((getIntegerValue(this, with(keyCharInitialAquaShare, charId)) + oldLandCharCurrentElemShares[1]) / 2), ((getIntegerValue(this, with(keyCharInitialTerraShare, charId)) + oldLandCharCurrentElemShares[2]) / 2), ((getIntegerValue(this, with(keyCharInitialAeroShare, charId)) + oldLandCharCurrentElemShares[3]) / 2)]
96+ let charEligibleSupplies = (((currentGeneratedSupplies - getIntegerValue(this, with(keyCharInitialGeneratedSupplies, charId))) / getIntegerValue(govApp, keyTotalLands)) / 4)
97+ (((fraction(charEligibleSupplies, oldLandCharAverageElemShares[0], shareDecimals) + fraction(charEligibleSupplies, oldLandCharAverageElemShares[1], shareDecimals)) + fraction(charEligibleSupplies, oldLandCharAverageElemShares[2], shareDecimals)) + fraction(charEligibleSupplies, oldLandCharAverageElemShares[3], shareDecimals))
98+ }
3599
36100
37101 @Callable(i)
38-func bindCharToLand (charId,landId) = valueOrElse(invokChecks(i.caller), if ((getStringValue(charsAddr, with(keyOwner, charId)) != toBase58String(i.caller.bytes)))
39- then throw("Caller doesn't own this char")
40- else if (if ((1 > landId))
41- then true
42- else (landId > getIntegerValue(govAddr, keyTotalLands)))
43- then throw("Unknown land")
44- else {
45- let currentGeneratedTokensResult = invoke(govAddr, "getGeneratedSupplies", nil, nil)
46- if ((currentGeneratedTokensResult == currentGeneratedTokensResult))
47- then {
48- let currentGeneratedTokens = match currentGeneratedTokensResult {
49- case isInt: Int =>
50- isInt
51- case _ =>
52- throw("Invok result")
102+func charMovingLand (charId,landId) = if ((invokeChecks(i.caller) != true))
103+ then throw()
104+ else {
105+ let callerAddr = toBase58String(i.caller.bytes)
106+ if ((getStringValue(charsApp, with(keyOwner, charId)) != callerAddr))
107+ then throw("Caller doesn't own this char")
108+ else if (if ((0 > landId))
109+ then true
110+ else (landId > getIntegerValue(govApp, keyTotalLands)))
111+ then throw("Not a land")
112+ else {
113+ let currentLand = valueOrElse(getInteger(this, with(keyCharCurrentLand, charId)), 0)
114+ if ((currentLand == landId))
115+ then throw("Char already on that land")
116+ else {
117+ let charNaturalElemBonus = getCharNaturalElemBonus(charId)
118+ let oldLandElemPower = getLandElemPower(currentLand)
119+ let currentGeneratedSuppliesResult = invoke(govApp, "getGeneratedSupplies", nil, nil)
120+ if ((currentGeneratedSuppliesResult == currentGeneratedSuppliesResult))
121+ then {
122+ let currentGeneratedSupplies = match currentGeneratedSuppliesResult {
123+ case isInt: Int =>
124+ isInt
125+ case _ =>
126+ throw("Bad invoke result")
127+ }
128+ let joiningActions = if ((landId != 0))
129+ then {
130+ let newLandNewElemPower = calcNewLandElemPower(landId, charNaturalElemBonus)
131+ let newLandCharElemShares = calcCharElemShares(charNaturalElemBonus, newLandNewElemPower)
132+[IntegerEntry(with(keyLandPyroPower, landId), newLandNewElemPower[0]), IntegerEntry(with(keyLandAquaPower, landId), newLandNewElemPower[1]), IntegerEntry(with(keyLandTerraPower, landId), newLandNewElemPower[2]), IntegerEntry(with(keyLandAeroPower, landId), newLandNewElemPower[3]), IntegerEntry(with(keyCharInitialGeneratedSupplies, charId), currentGeneratedSupplies), IntegerEntry(with(keyCharInitialPyroShare, charId), newLandCharElemShares[0]), IntegerEntry(with(keyCharInitialAquaShare, charId), newLandCharElemShares[1]), IntegerEntry(with(keyCharInitialTerraShare, charId), newLandCharElemShares[2]), IntegerEntry(with(keyCharInitialAeroShare, charId), newLandCharElemShares[3])]
133+ }
134+ else [DeleteEntry(with(keyCharInitialGeneratedSupplies, charId)), DeleteEntry(with(keyCharInitialPyroShare, charId)), DeleteEntry(with(keyCharInitialAquaShare, charId)), DeleteEntry(with(keyCharInitialTerraShare, charId)), DeleteEntry(with(keyCharInitialAeroShare, charId))]
135+ let exitingActions = if ((currentLand != 0))
136+ then {
137+ let sendTokensToAddress = invoke(govApp, "sendTokensToAddress", [calcCharIncome(charId, oldLandElemPower, charNaturalElemBonus, currentGeneratedSupplies), i.caller.bytes], nil)
138+ if ((sendTokensToAddress == sendTokensToAddress))
139+ then {
140+ let charTokenIncome = match sendTokensToAddress {
141+ case isInt: Int =>
142+ isInt
143+ case _ =>
144+ throw("Invoke issue")
145+ }
146+ let newCharTotalIncome = (valueOrElse(getInteger(this, with(keyCharTotalIncome, charId)), 0) + charTokenIncome)
147+ let newAddressTotalIncome = (valueOrElse(getInteger(this, with(keyAddressTotalIncome, callerAddr)), 0) + charTokenIncome)
148+ let oldLandNewElemPower = calcOldLandElemPower(oldLandElemPower, charNaturalElemBonus)
149+[IntegerEntry(with(keyCharTotalIncome, charId), newCharTotalIncome), IntegerEntry(with(keyAddressTotalIncome, callerAddr), newCharTotalIncome), IntegerEntry(with(keyLandPyroPower, currentLand), oldLandNewElemPower[0]), IntegerEntry(with(keyLandAquaPower, currentLand), oldLandNewElemPower[1]), IntegerEntry(with(keyLandTerraPower, currentLand), oldLandNewElemPower[2]), IntegerEntry(with(keyLandAeroPower, currentLand), oldLandNewElemPower[3])]
150+ }
151+ else throw("Strict value is not equal to itself.")
152+ }
153+ else nil
154+ (([IntegerEntry(with(keyCharCurrentLand, charId), landId)] ++ joiningActions) ++ exitingActions)
155+ }
156+ else throw("Strict value is not equal to itself.")
157+ }
53158 }
54-[IntegerEntry(with(keyCurrentLand, charId), landId), IntegerEntry(with(keyStartingHeight, charId), height), IntegerEntry(with(keyStartingGeneratedSupplies, charId), currentGeneratedTokens)]
55- }
56- else throw("Strict value is not equal to itself.")
57- })
159+ }
58160
59161
60162 @Verifier(tx)
61163 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
62164

github/deemru/w8io/c3f4982 
33.24 ms