tx · Azp733djjyp4fqLyUQYeHSrJ33CbnW4SDQ1SpM4KfEXp

3MxVJox4gUBhTYKrzK458PLEwbnhsijAihN:  -0.01200000 Waves

2024.10.07 20:27 [3316721] smart account 3MxVJox4gUBhTYKrzK458PLEwbnhsijAihN > SELF 0.00000000 Waves

{ "type": 13, "id": "Azp733djjyp4fqLyUQYeHSrJ33CbnW4SDQ1SpM4KfEXp", "fee": 1200000, "feeAssetId": null, "timestamp": 1728322064424, "version": 2, "chainId": 84, "sender": "3MxVJox4gUBhTYKrzK458PLEwbnhsijAihN", "senderPublicKey": "6aKE4Qk85jkJi2fPfWV4HG1XuygMnFL6uw2YZC6uvTJU", "proofs": [ "RDywJ478VSToeWpbWxfDeD2gugipboi5iYLnjEuaGL6vgkbwn3zwPnG1H3vEAGGkQ57a3svp5UiKhDD3WxTGDQA" ], "script": "base64:BgIfCAISAwoBCBIDCgEBEgQKAgEBEgQKAgEIEgUKAwgBCB8ACWJhc2VQcmljZQCAiXoACGluY3JlYXNlAAEAEGluY3JlYXNlRGVjaW1hbHMAAwEJaXNUZXN0RW52AAQHdGVzdGVudgQHJG1hdGNoMAkAmwgCBQR0aGlzAgdURVNURU5WAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgHBQd0ZXN0ZW52AQ9kdWNrQ2FwYWNpdHlLZXkBBmR1Y2tJZAkArAICAg9hZGRlZF9jYXBhY2l0eV8FBmR1Y2tJZAEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEMdHJ5R2V0U3RyaW5nAQNrZXkJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIFBHRoaXMFA2tleQENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIZd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAEJYXNCb29sZWFuAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQHYm9vbGVhbgUHJG1hdGNoMAUHYm9vbGVhbgkAAgECIkNBQjogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEJvb2xlYW4BF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAIVc3RhdGljX2JyZWVkZXJBZGRyZXNzARVzdGF0aWNLZXlfaHVudEFkZHJlc3MAAhJzdGF0aWNfaHVudEFkZHJlc3MBFHN0YXRpY0tleV9lZ2dBc3NldElkAAIRc3RhdGljX2VnZ0Fzc2V0SWQBF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAIUc3RhdGljX2ZlZUFnZ3JlZ2F0b3IBGHN0YXRpY0tleV9jb3Vwb25zQWRkcmVzcwACFXN0YXRpY19jb3Vwb25zQWRkcmVzcwEcc3RhdGljS2V5X3JlZkNvbnRyYWN0QWRkcmVzcwACGXN0YXRpY19yZWZDb250cmFjdEFkZHJlc3MBFXN0YXRpY0tleV9idXJuQWRkcmVzcwACEnN0YXRpY19idXJuQWRkcmVzcwEJZ2V0T3JhY2xlAAkBB0FkZHJlc3MBCQDZBAEJAQx0cnlHZXRTdHJpbmcBCQEXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAARFnZXRDb3Vwb25zQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGHN0YXRpY0tleV9jb3Vwb25zQWRkcmVzcwABDWdldEVnZ0Fzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAQ9nZXREdWNrQ2FwYWNpdHkBBmR1Y2tJZAkBDXRyeUdldEludGVnZXIBCQEPZHVja0NhcGFjaXR5S2V5AQUGZHVja0lkARFnZXRCcmVlZGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwABDmdldEh1bnRBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEVc3RhdGljS2V5X2h1bnRBZGRyZXNzAAEQZ2V0RmVlQWdncmVnYXRvcgAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAEVZ2V0UmVmQ29udHJhY3RBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEcc3RhdGljS2V5X3JlZkNvbnRyYWN0QWRkcmVzcwABDmdldEJ1cm5BZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEVc3RhdGljS2V5X2J1cm5BZGRyZXNzAAEMa2V5RHVja093bmVyAQdhc3NldElkCQCsAgIJAKwCAgIFZHVja18FB2Fzc2V0SWQCBl9vd25lcgEGY29tbW9uBAVuZnRJZAhwYXltZW50cw1hZGRlZENhcGFjaXR5DnJlZmVyZXJBZGRyZXNzBAhjaGlsZHJlbgkBBWFzSW50AQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFBW5mdElkBQNuaWwFA25pbAMJAAACBQhjaGlsZHJlbgUIY2hpbGRyZW4ECGNhcGFjaXR5CQEPZ2V0RHVja0NhcGFjaXR5AQUFbmZ0SWQEDXRvdGFsQ2FwYWNpdHkJAGQCBQhjYXBhY2l0eQUNYWRkZWRDYXBhY2l0eQQEZGlmZgkBBWFzSW50AQkA/AcEBQR0aGlzAhFjYWxjdWxhdGVEaWZmRWdncwkAzAgCBQhjYXBhY2l0eQkAzAgCBQ10b3RhbENhcGFjaXR5BQNuaWwFA25pbAMJAAACBQRkaWZmBQRkaWZmBBNhbW91bnRQYWlkQnlDb3Vwb25zCQEFYXNJbnQBCQD8BwQJARFnZXRDb3Vwb25zQWRkcmVzcwACCnVzZUNvdXBvbnMJAMwIAgUEZGlmZgUDbmlsBQNuaWwDCQAAAgUTYW1vdW50UGFpZEJ5Q291cG9ucwUTYW1vdW50UGFpZEJ5Q291cG9ucwQJbGVmdFRvUGF5CQBlAgUEZGlmZgUTYW1vdW50UGFpZEJ5Q291cG9ucwQLcGF5bWVudExlZnQDCQECIT0CBQlsZWZ0VG9QYXkAAAQKZWdnUGF5bWVudAkBBXZhbHVlAQkAkQMCBQhwYXltZW50cwkAZQIJAJADAQUIcGF5bWVudHMAAQMJAQIhPQIIBQplZ2dQYXltZW50B2Fzc2V0SWQJAQ1nZXRFZ2dBc3NldElkAAkAAgEJAKwCAgJBQ0JSOiBZb3UgY2FuIGF0dGFjaCBvbmx5IEVHRyB0b2tlbnMgd2l0aCB0aGUgZm9sbG93aW5nIGFzc2V0IGlkOiAJANgEAQkBDWdldEVnZ0Fzc2V0SWQAAwkBAiE9AggFCmVnZ1BheW1lbnQGYW1vdW50BQlsZWZ0VG9QYXkJAAIBCQCsAgICQkNCUjogVG8gYnJlZWQgeW91IGN1cnJlbnRseSBuZWVkIHRoZSBmb2xsb3dpbmcgYW1vdW50IG9mIEVHR2xldHM6IAkApAMBBQlsZWZ0VG9QYXkEFXJlZmVyZXJSZXdhcmRGb3JQZXJjaAkAawMFCWxlZnRUb1BheQAFAGQEB3JlZkNhbGwJAQlhc0Jvb2xlYW4BCQD8BwQJARVnZXRSZWZDb250cmFjdEFkZHJlc3MAAgpyZWZQYXltZW50CQDMCAIFDnJlZmVyZXJBZGRyZXNzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRFZ2dBc3NldElkAAUVcmVmZXJlclJld2FyZEZvclBlcmNoBQNuaWwDCQAAAgUHcmVmQ2FsbAUHcmVmQ2FsbAQGdG9CdXJuAwUHcmVmQ2FsbAkAZQIFCWxlZnRUb1BheQUVcmVmZXJlclJld2FyZEZvclBlcmNoBQlsZWZ0VG9QYXkECGJ1cm5DYWxsCQD8BwQJAQ5nZXRCdXJuQWRkcmVzcwACFGJ1cm5BdHRhY2hlZFBheW1lbnRzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRFZ2dBc3NldElkAAUGdG9CdXJuBQNuaWwDCQAAAgUIYnVybkNhbGwFCGJ1cm5DYWxsBQlsZWZ0VG9QYXkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAMJAAACBQtwYXltZW50TGVmdAULcGF5bWVudExlZnQEBWRlYnVnCQC5CQIJAMwIAgkArAICAgxvbGRDYXBhY2l0eT0JAKQDAQUIY2FwYWNpdHkJAMwIAgkArAICAgxuZXdDYXBhY2l0eT0JAKQDAQUNdG90YWxDYXBhY2l0eQkAzAgCCQCsAgICDWRpZmZDYXBhY2l0eT0JAKQDAQUNYWRkZWRDYXBhY2l0eQkAzAgCCQCsAgICCWRpZmZQYWlkPQkApAMBBQRkaWZmBQNuaWwCATsJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9kdWNrQ2FwYWNpdHlLZXkBBQVuZnRJZAUNdG90YWxDYXBhY2l0eQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkBD2R1Y2tDYXBhY2l0eUtleQEFBW5mdElkAgdfZGVidWdfCQCkAwEFBmhlaWdodAUFZGVidWcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZQ0NBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxDQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsBQFpAQ9jb25maWd1cmVPcmFjbGUBBm9yYWNsZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECD0NDTzogYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCCQEXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MABQZvcmFjbGUFA25pbAFpARdjYWxjdWxhdGVUb3RhbFByaWNlRWdncwEEZWdncwQHcG93UGFydAkAZQIJAGwGCQBkAgDoBwUIaW5jcmVhc2UFEGluY3JlYXNlRGVjaW1hbHMJAGQCBQRlZ2dzAAEAAAAIBQZIQUxGVVAAgMLXLwQFcHJpY2UJAGkCCQBpAgkAaAIFCWJhc2VQcmljZQUHcG93UGFydAUIaW5jcmVhc2UAoI0GCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIWUFJJQ0VfQ0FMQ1VMQVRJT05fUE9XXwkApAMBBQRlZ2dzBQdwb3dQYXJ0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICElBSSUNFX0NBTENVTEFUSU9OXwkApAMBBQRlZ2dzBQVwcmljZQUDbmlsBQVwcmljZQFpARFjYWxjdWxhdGVEaWZmRWdncwIHb2xkRWdncwduZXdFZ2dzBAthbHJlYWR5UGFpZAkBBWFzSW50AQkA/AcEBQR0aGlzAhdjYWxjdWxhdGVUb3RhbFByaWNlRWdncwkAzAgCBQdvbGRFZ2dzBQNuaWwFA25pbAMJAAACBQthbHJlYWR5UGFpZAULYWxyZWFkeVBhaWQECnRvdGFsVG9QYXkJAQVhc0ludAEJAPwHBAUEdGhpcwIXY2FsY3VsYXRlVG90YWxQcmljZUVnZ3MJAMwIAgUHbmV3RWdncwUDbmlsBQNuaWwDCQAAAgUKdG90YWxUb1BheQUKdG90YWxUb1BheQQEZGlmZgkAZQIFCnRvdGFsVG9QYXkFC2FscmVhZHlQYWlkBAVkZWJ1ZwkAuQkCCQDMCAIJAKwCAgIIb2xkUGFpZD0JAKQDAQULYWxyZWFkeVBhaWQJAMwIAgkArAICAghuZXdQYWlkPQkApAMBBQp0b3RhbFRvUGF5BQNuaWwCATsJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCAhJERUJVR19DQUxDVUxBVElPTlMFBWRlYnVnBQNuaWwFBGRpZmYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERYWRkQ2FwYWNpdHlUb0R1Y2sCDWFkZGVkQ2FwYWNpdHkOcmVmZXJlckFkZHJlc3MECm5mdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAQQLZHVja0Fzc2V0SWQJANgEAQkBBXZhbHVlAQgFCm5mdFBheW1lbnQHYXNzZXRJZAQMcmVjb3JkQWN0aW9uCQD8BwQJARFnZXRDb3Vwb25zQWRkcmVzcwACDHJlY29yZEFjdGlvbgkAzAgCAghSRUNIQVJHRQUDbmlsBQNuaWwDCQAAAgUMcmVjb3JkQWN0aW9uBQxyZWNvcmRBY3Rpb24DCQECIT0CCAUKbmZ0UGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQJAM4IAgkAzggCCQEGY29tbW9uBAULZHVja0Fzc2V0SWQIBQFpCHBheW1lbnRzBQ1hZGRlZENhcGFjaXR5BQ5yZWZlcmVyQWRkcmVzcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQkBBXZhbHVlAQgFCm5mdFBheW1lbnQHYXNzZXRJZAUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEXYWRkQ2FwYWNpdHlUb0R1Y2tJbkh1bnQDBW5mdElkDWFkZGVkQ2FwYWNpdHkOcmVmZXJlckFkZHJlc3MEC293bmVySW5IdW50CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEOZ2V0SHVudEFkZHJlc3MACQEMa2V5RHVja093bmVyAQUFbmZ0SWQEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAAEDHJlY29yZEFjdGlvbgkA/AcECQERZ2V0Q291cG9uc0FkZHJlc3MAAgxyZWNvcmRBY3Rpb24JAMwIAgIIUkVDSEFSR0UFA25pbAUDbmlsAwkAAAIFDHJlY29yZEFjdGlvbgUMcmVjb3JkQWN0aW9uAwkBAiE9AgULb3duZXJJbkh1bnQJAKUIAQgFAWkGY2FsbGVyCQACAQIsQ0JSOiBZb3UgY2FuIG9ubHkgYWRkIGNhcGFjaXR5IHRvIG93biBkdWNrcyEJAM4IAgkBBmNvbW1vbgQFBW5mdElkCAUBaQhwYXltZW50cwUNYWRkZWRDYXBhY2l0eQUOcmVmZXJlckFkZHJlc3MFDHZhbGlkUGF5bWVudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQADCQEJaXNUZXN0RW52AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQQJZmlyc3RVc2VyASBRHOT9Zv8SadLxWhSfO7Li9Dt/wctoJ6I0Xmw411fdbQQKc2Vjb25kVXNlcgEgXHIOS67xIU9m5hlF+mqise2xNilZXxnMzLDhTUGIan0ECXRoaXJkVXNlcgEgoK+R5S15Q2FhMhKtjrn6GFlRnS1TSTbD0KP3qGAZO04ED2ZpcnN0VXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQlmaXJzdFVzZXIAAQAABBBzZWNvbmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUKc2Vjb25kVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUKc2Vjb25kVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUKc2Vjb25kVXNlcgABAAAED3RoaXJkVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQl0aGlyZFVzZXIAAQAABA9zaWduYXR1cmVzQ291bnQJAGQCCQBkAgUPZmlyc3RVc2VyU2lnbmVkBRBzZWNvbmRVc2VyU2lnbmVkBQ90aGlyZFVzZXJTaWduZWQEByRtYXRjaDAFAnR4CQBnAgUPc2lnbmF0dXJlc0NvdW50AAJhC62i", "height": 3316721, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let basePrice = 2000000
5+
6+let increase = 1
7+
8+let increaseDecimals = 3
9+
10+func isTestEnv () = {
11+ let testenv = match getBoolean(this, "TESTENV") {
12+ case x: Boolean =>
13+ x
14+ case _ =>
15+ false
16+ }
17+ testenv
18+ }
19+
20+
21+func duckCapacityKey (duckId) = ("added_capacity_" + duckId)
22+
23+
24+func tryGetStringExternal (address,key) = match getString(address, key) {
25+ case a: String =>
26+ a
27+ case _ =>
28+ ""
29+}
30+
31+
32+func tryGetString (key) = tryGetStringExternal(this, key)
33+
34+
35+func tryGetInteger (key) = match getInteger(this, key) {
36+ case b: Int =>
37+ b
38+ case _ =>
39+ 0
40+}
41+
42+
43+func asInt (value) = match value {
44+ case int: Int =>
45+ int
46+ case _ =>
47+ throw("wrong type, expected: Int")
48+}
49+
50+
51+func asBoolean (value) = match value {
52+ case boolean: Boolean =>
53+ boolean
54+ case _ =>
55+ throw("CAB: wrong type, expected: Boolean")
56+}
57+
58+
59+func staticKey_oracleAddress () = "static_oracleAddress"
60+
61+
62+func staticKey_extraFee () = "static_extraFee"
63+
64+
65+func staticKey_breederAddress () = "static_breederAddress"
66+
67+
68+func staticKey_huntAddress () = "static_huntAddress"
69+
70+
71+func staticKey_eggAssetId () = "static_eggAssetId"
72+
73+
74+func staticKey_feeAggregator () = "static_feeAggregator"
75+
76+
77+func staticKey_couponsAddress () = "static_couponsAddress"
78+
79+
80+func staticKey_refContractAddress () = "static_refContractAddress"
81+
82+
83+func staticKey_burnAddress () = "static_burnAddress"
84+
85+
86+func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
87+
88+
89+func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
90+
91+
92+func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
93+
94+
95+func getDuckCapacity (duckId) = tryGetInteger(duckCapacityKey(duckId))
96+
97+
98+func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
99+
100+
101+func getHuntAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntAddress())))
102+
103+
104+func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
105+
106+
107+func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
108+
109+
110+func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
111+
112+
113+func keyDuckOwner (assetId) = (("duck_" + assetId) + "_owner")
114+
115+
116+func common (nftId,payments,addedCapacity,refererAddress) = {
117+ let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [nftId], nil))
118+ if ((children == children))
119+ then {
120+ let capacity = getDuckCapacity(nftId)
121+ let totalCapacity = (capacity + addedCapacity)
122+ let diff = asInt(invoke(this, "calculateDiffEggs", [capacity, totalCapacity], nil))
123+ if ((diff == diff))
124+ then {
125+ let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [diff], nil))
126+ if ((amountPaidByCoupons == amountPaidByCoupons))
127+ then {
128+ let leftToPay = (diff - amountPaidByCoupons)
129+ let paymentLeft = if ((leftToPay != 0))
130+ then {
131+ let eggPayment = value(payments[(size(payments) - 1)])
132+ if ((eggPayment.assetId != getEggAssetId()))
133+ then throw(("CBR: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
134+ else if ((eggPayment.amount != leftToPay))
135+ then throw(("CBR: To breed you currently need the following amount of EGGlets: " + toString(leftToPay)))
136+ else {
137+ let refererRewardForPerch = fraction(leftToPay, 5, 100)
138+ let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
139+ if ((refCall == refCall))
140+ then {
141+ let toBurn = if (refCall)
142+ then (leftToPay - refererRewardForPerch)
143+ else leftToPay
144+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
145+ if ((burnCall == burnCall))
146+ then leftToPay
147+ else throw("Strict value is not equal to itself.")
148+ }
149+ else throw("Strict value is not equal to itself.")
150+ }
151+ }
152+ else 0
153+ if ((paymentLeft == paymentLeft))
154+ then {
155+ let debug = makeString([("oldCapacity=" + toString(capacity)), ("newCapacity=" + toString(totalCapacity)), ("diffCapacity=" + toString(addedCapacity)), ("diffPaid=" + toString(diff))], ";")
156+[IntegerEntry(duckCapacityKey(nftId), totalCapacity), StringEntry(((duckCapacityKey(nftId) + "_debug_") + toString(height)), debug)]
157+ }
158+ else throw("Strict value is not equal to itself.")
159+ }
160+ else throw("Strict value is not equal to itself.")
161+ }
162+ else throw("Strict value is not equal to itself.")
163+ }
164+ else throw("Strict value is not equal to itself.")
165+ }
166+
167+
168+func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
169+ then throw("CCAP: Please attach waves")
170+ else {
171+ let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
172+ if ((payment.amount != feeAmount))
173+ then throw((("CCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
174+ else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
175+ }
176+
177+
178+@Callable(i)
179+func configureOracle (oracle) = if ((i.caller != this))
180+ then throw("CCO: admin only")
181+ else [StringEntry(staticKey_oracleAddress(), oracle)]
182+
183+
184+
185+@Callable(i)
186+func calculateTotalPriceEggs (eggs) = {
187+ let powPart = (pow((1000 + increase), increaseDecimals, (eggs + 1), 0, 8, HALFUP) - 100000000)
188+ let price = (((basePrice * powPart) / increase) / 100000)
189+ $Tuple2([IntegerEntry(("PRICE_CALCULATION_POW_" + toString(eggs)), powPart), IntegerEntry(("PRICE_CALCULATION_" + toString(eggs)), price)], price)
190+ }
191+
192+
193+
194+@Callable(i)
195+func calculateDiffEggs (oldEggs,newEggs) = {
196+ let alreadyPaid = asInt(invoke(this, "calculateTotalPriceEggs", [oldEggs], nil))
197+ if ((alreadyPaid == alreadyPaid))
198+ then {
199+ let totalToPay = asInt(invoke(this, "calculateTotalPriceEggs", [newEggs], nil))
200+ if ((totalToPay == totalToPay))
201+ then {
202+ let diff = (totalToPay - alreadyPaid)
203+ let debug = makeString([("oldPaid=" + toString(alreadyPaid)), ("newPaid=" + toString(totalToPay))], ";")
204+ $Tuple2([StringEntry("DEBUG_CALCULATIONS", debug)], diff)
205+ }
206+ else throw("Strict value is not equal to itself.")
207+ }
208+ else throw("Strict value is not equal to itself.")
209+ }
210+
211+
212+
213+@Callable(i)
214+func addCapacityToDuck (addedCapacity,refererAddress) = {
215+ let nftPayment = value(i.payments[0])
216+ let validPayment = checkAdditionalPayment(i.payments[1])
217+ let duckAssetId = toBase58String(value(nftPayment.assetId))
218+ let recordAction = invoke(getCouponsAddress(), "recordAction", ["RECHARGE"], nil)
219+ if ((recordAction == recordAction))
220+ then if ((nftPayment.amount != 1))
221+ then throw("NFT is not attached")
222+ else ((common(duckAssetId, i.payments, addedCapacity, refererAddress) ++ [ScriptTransfer(i.caller, 1, value(nftPayment.assetId))]) ++ validPayment)
223+ else throw("Strict value is not equal to itself.")
224+ }
225+
226+
227+
228+@Callable(i)
229+func addCapacityToDuckInHunt (nftId,addedCapacity,refererAddress) = {
230+ let ownerInHunt = tryGetStringExternal(getHuntAddress(), keyDuckOwner(nftId))
231+ let validPayment = checkAdditionalPayment(i.payments[0])
232+ let recordAction = invoke(getCouponsAddress(), "recordAction", ["RECHARGE"], nil)
233+ if ((recordAction == recordAction))
234+ then if ((ownerInHunt != toString(i.caller)))
235+ then throw("CBR: You can only add capacity to own ducks!")
236+ else (common(nftId, i.payments, addedCapacity, refererAddress) ++ validPayment)
237+ else throw("Strict value is not equal to itself.")
238+ }
239+
240+
241+@Verifier(tx)
242+func verify () = if (isTestEnv())
243+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
244+ else {
245+ let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
246+ let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
247+ let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
248+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
249+ then 1
250+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
251+ then 1
252+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
253+ then 1
254+ else 0
255+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
256+ then 1
257+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
258+ then 1
259+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
260+ then 1
261+ else 0
262+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
263+ then 1
264+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
265+ then 1
266+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
267+ then 1
268+ else 0
269+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
270+ match tx {
271+ case _ =>
272+ (signaturesCount >= 2)
273+ }
274+ }
275+

github/deemru/w8io/c3f4982 
19.29 ms