tx · Hdr93jgyU83ubtkarjBnNLPPg835LkU1CY1m58bdD9B4 3N8WDKbqGox5Eky326PHHT7rUyrby5MXdmb: -0.03300000 Waves 2022.07.07 20:28 [2129580] smart account 3N8WDKbqGox5Eky326PHHT7rUyrby5MXdmb > SELF 0.00000000 Waves
{ "type": 13, "id": "Hdr93jgyU83ubtkarjBnNLPPg835LkU1CY1m58bdD9B4", "fee": 3300000, "feeAssetId": null, "timestamp": 1657214949134, "version": 2, "chainId": 84, "sender": "3N8WDKbqGox5Eky326PHHT7rUyrby5MXdmb", "senderPublicKey": "FWSsBbeCwLVkekWhvNKtX6JkrZiruRybKKVuiS3F4bqN", "proofs": [ "4shxJa8JmiDcB7SxbYkeAsmFqtSwNGhzs4pcMSt5HzUjouUy8249fqR7k3FdyiTvyzM45Sahv26fgokft8FGcq4t" ], "script": "base64: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aWxkaW5nU3RhdHVzS2V5AAAAD2ZpbmlzaEhlaWdodEtleQAAAA10cmFuc2FjdGlvbklkBAAAAAZjaHVua3MJAQAAABFnZXRBc3NldFR5cGVMZXZlbAAAAAEFAAAACGFzc2V0U3RyBAAAAAxzdHJBc3NldFR5cGUIBQAAAAZjaHVua3MAAAACXzEEAAAABWxldmVsCAUAAAAGY2h1bmtzAAAAAl8yBAAAABRidWlsZGluZ0ZpbmlzaEhlaWdodAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAPZmluaXNoSGVpZ2h0S2V5AwkAAGYAAAACBQAAABRidWlsZGluZ0ZpbmlzaEhlaWdodAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAdQnVpbGRpbmcgaXMgbm90IGZpbmlzaGVkIHlldCAJAAGkAAAAAQkAAGUAAAACBQAAABRidWlsZGluZ0ZpbmlzaEhlaWdodAUAAAAGaGVpZ2h0AgAAACcgYmxvY2tzIHJlbWFpbmluZywgaXQgd2lsbCB0YWtlIGFyb3VuZCAJAAGkAAAAAQkAAGUAAAACBQAAABRidWlsZGluZ0ZpbmlzaEhlaWdodAUAAAAGaGVpZ2h0AgAAAAggbWludXRlcwMJAAAAAAAAAgkAAS8AAAACBQAAAAxzdHJBc3NldFR5cGUAAAAAAAAAAAQCAAAABFRFQ0gEAAAACmRpc2NvdmVyZWQJAAP8AAAABAkBAAAAB0FkZHJlc3MAAAABBQAAAA5uYXRpb25zQWRkcmVzcwIAAAAYc2V0VGVjbmhub2xvZ3lEaXNjb3ZlcmVkCQAETAAAAAIFAAAABmNhbGxlcgkABEwAAAACBQAAAAhhc3NldFN0cgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAACmRpc2NvdmVyZWQGCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAAEUJ1aWxkaW5nU3RhdHVzS2V5CQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAAD2ZpbmlzaEhlaWdodEtleQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAQZ2V0QXNzZXRPd25lcktleQAA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dGVnZXIAAAABCQABLAAAAAIFAAAADGFnZ3JBc3NldGtleQIAAAAEX1F0eQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAQZ2V0QXNzZXRPd25lcktleQAAAAIFAAAADXRyYW5zYWN0aW9uSWQFAAAACGFzc2V0U3RyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgUAAAAMYWdnckFzc2V0a2V5AgAAAAZfT3duZXIFAAAABmNhbGxlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAMYWdnckFzc2V0a2V5CQAAZAAAAAIFAAAABWNvaW5zBQAAAAphc3NldENvaW5zCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADGFnZ3JBc3NldGtleQIAAAAEX1F0eQkAAGQAAAACBQAAAANxdHkAAAAAAAAAAAEJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAARQnVpbGRpbmdTdGF0dXNLZXkJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAPZmluaXNoSGVpZ2h0S2V5BQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACGFzc2V0S2V5BQAAAAphc3NldENvaW5zCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAAEUJ1aWxkaW5nU3RhdHVzS2V5CQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAAD2ZpbmlzaEhlaWdodEtleQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEAAAAPY2hlY2tBc3NldE93bmVyAAAAAgAAAAZjYWxsZXIAAAAIYXNzZXRLZXkEAAAACmFzc2V0T3duZXIJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAAWZ2V0QXNzZXRPd25lcktleVN0cmluZwAAAAEFAAAACGFzc2V0S2V5CQAAAAAAAAIFAAAACmFzc2V0T3duZXIFAAAABmNhbGxlcgEAAAAVaXNOYXRpb25SZXNlcnZlZEFzc2V0AAAAAgAAAAROYW1lAAAA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ZmljZUtleQkAAAIAAAABAgAAACx5b3UgYXJlIG5vdCB0aGUgb3duZXIgb2YgdGhlIFNhY3JpZmljZSBhc3NldAQAAAAGY2h1bmtzCQEAAAARZ2V0QXNzZXRUeXBlTGV2ZWwAAAABBQAAAAxTYWNyaWZpY2VLZXkDAwkBAAAAAiE9AAAAAgUAAAAIYXNzZXRTYWMIBQAAAAZjaHVua3MAAAACXzEGCQEAAAACIT0AAAACBQAAAAthc3NldFNhY2x2bAgFAAAABmNodW5rcwAAAAJfMgkAAAIAAAABAgAAAC50aGUgc2FjcmlmaWNlQXNzZXQgaGFzIHRoZSB3cm9uZyB0eXBlIG9yIGxldmVsBgEAAAAZQ2hlY2tBc3NldEJ1aWxkYWJsZU5hdGlvbgAAAAQAAAAETmFtZQAAAAVMZXZlbAAAAAlOYXRpb25LZXkAAAAMU2FjcmlmaWNlS2V5BAAAAAdjbmZnS2V5CQEAAAAIZ2V0QUxLZXkAAAACBQAAAAROYW1lBQAAAAVMZXZlbAQAAAADdGVjCQEAAAAQY29uZlRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgUAAAAHY25mZ0tleQIAAAAWX1RlY25ob2xvZ3lfZGlzY292ZXJlZAMJAQAAAAIhPQAAAAIFAAAAA3RlYwIAAAAAAwkBAAAAFG5hdGlvbnNUcnlHZXRCb29sZWFuAAAAAQkAASwAAAACCQABLAAAAAIFAAAACU5hdGlvbktleQIAAAABXwUAAAADdGVjCQEAAAAcQ2hlY2tBc3NldEJ1aWxkYWJsZVNhY3JpZmljZQAAAAMFAAAAB2NuZmdLZXkFAAAACU5hdGlvbktleQUAAAAMU2FjcmlmaWNlS2V5BwkBAAAAHENoZWNrQXNzZXRCdWlsZGFibGVTYWNyaWZpY2UAAAADBQAAAAdjbmZnS2V5BQAAAAlOYXRpb25LZXkFAAAADFNhY3JpZmljZUtleQEAAAAXQ2hlY2tBc3NldEJ1aWxkYWJsZVVzZXIAAAAEAAAABE5hbWUAAAAFTGV2ZWwAAAAGY2FsbGVyAAAADFNhY3JpZmljZUtleQQAAAAGY25mS2V5CQEAAAAIZ2V0QUxLZXkAAAACBQAAAAROYW1lBQAAAAVMZXZlbAQAAAAIbmF0aW9uSWQJAQAAABRuYXRpb25zVHJ5R2V0SW50ZWdlcgAAAAEFAAAABmNhbGxlcgMJAAAAAAAAAgUAAAAIbmF0aW9uSWQAAAAAAAAAAAAHBAAAAAN0ZWMJAQAAABBjb25mVHJ5R2V0U3RyaW5nAAAAAQkAASwAAAACBQAAAAZjbmZLZXkCAAAAFl9UZWNuaG9sb2d5X2Rpc2NvdmVyZWQDCQEAAAACIT0AAAACBQAAAAN0ZWMCAAAAAAQAAAAJTmF0aW9uS2V5CQEAAAATbmF0aW9uc1RyeUdldFN0cmluZwAAAAEJAAGkAAAAAQUAAAAIbmF0aW9uSWQDCQEAAAAUbmF0aW9uc1RyeUdldEJvb2xlYW4AAAABCQABLAAAAAIJAAEsAAAAAgUAAAAJTmF0aW9uS2V5AgAAAAFfBQAAAAN0ZWMJAQAAABxDaGVja0Fzc2V0QnVpbGRhYmxlU2FjcmlmaWNlAAAAAwUAAAAGY25mS2V5BQAAAAZjYWxsZXIFAAAADFNhY3JpZmljZUtleQcJAQAAABxDaGVja0Fzc2V0QnVpbGRhYmxlU2FjcmlmaWNlAAAAAwUAAAAGY25mS2V5BQAAAAZjYWxsZXIFAAAADFNhY3JpZmljZUtleQEAAAATQ2hlY2tBc3NldEJ1aWxkYWJsZQAAAAUAAAAETmFtZQAAAAVMZXZlbAAAAAZDYWxsZXIAAAAJTmF0aW9uS2V5AAAADFNhY3JpZmljZUtleQMJAQAAAAIhPQAAAAIFAAAACU5hdGlvbktleQIAAAAACQEAAAAZQ2hlY2tBc3NldEJ1aWxkYWJsZU5hdGlvbgAAAAQFAAAABE5hbWUFAAAABUxldmVsBQAAAAlOYXRpb25LZXkFAAAADFNhY3JpZmljZUtleQkBAAAAF0NoZWNrQXNzZXRCdWlsZGFibGVVc2VyAAAABAUAAAAETmFtZQUAAAAFTGV2ZWwFAAAABkNhbGxlcgUAAAAMU2FjcmlmaWNlS2V5AAAACwAAAAFpAQAAAApTdGFydEJ1aWxkAAAABAAAAAxzdHJBc3NldFR5cGUAAAAFTGV2ZWwAAAAJTmF0aW9uS2V5AAAADFNhY3JpZmljZUtleQMJAQAAAAEhAAAAAQkBAAAAE0NoZWNrQXNzZXRCdWlsZGFibGUAAAAFBQAAAAxzdHJBc3NldFR5cGUFAAAABUxldmVsCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAJTmF0aW9uS2V5BQAAAAxTYWNyaWZpY2VLZXkJAAACAAAAAQIAAAAaWW91IGNhbm5vdCBidWlsZCB0aGlzIEl0ZW0EAAAAB2NuZmdLZXkJAQAAAAhnZXRBTEtleQAAAAIFAAAADHN0ckFzc2V0VHlwZQUAAAAFTGV2ZWwEAAAAEGRlbGF5Rm9yQnVpbGRpbmcJAQAAABFjb25mVHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgUAAAAHY25mZ0tleQIAAAAKX0J1aWxkVGltZQQAAAAOYXNzZXRCdWlsZENvc3QJAQAAABFjb25mVHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgUAAAAHY25mZ0tleQIAAAAFX0Nvc3QEAAAADVRvQWRtaW5XYWxsZXQJAABpAAAAAgkAAGgAAAACBQAAAA5hc3NldEJ1aWxkQ29zdAAAAAAAAAAABQAAAAAAAAAAZAQAAAATVG9HYW1lUmV3YXJkc1dhbGxldAkAAGkAAAACCQAAaAAAAAIFAAAADmFzc2V0QnVpbGRDb3N0AAAAAAAAAAAKAAAAAAAAAABkBAAAABZUb1N0YWtpbmdSZXdhcmRzV2FsbGV0CQAAaQAAAAIJAABoAAAAAgUAAAAOYXNzZXRCdWlsZENvc3QAAAAAAAAAAEEAAAAAAAAAAGQEAAAADVVuaXRTdGFrZVNoZWcJAABlAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAADmFzc2V0QnVpbGRDb3N0BQAAAA1Ub0FkbWluV2FsbGV0BQAAABNUb0dhbWVSZXdhcmRzV2FsbGV0BQAAABZUb1N0YWtpbmdSZXdhcmRzV2FsbGV0AwkBAAAAFWlzTmF0aW9uUmVzZXJ2ZWRBc3NldAAAAAIFAAAADHN0ckFzc2V0VHlwZQUAAAAFTGV2ZWwDAwkBAAAAASEAAAABCQEAAAAPY2hlY2tBc3NldE93bmVyAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAACU5hdGlvbktleQkBAAAAASEAAAABCQEAAAAKY2hlY2tBZG1pbgAAAAEIBQAAAAFpAAAABmNhbGxlcgcJAAACAAAAAQIAAAAjWW91IGFyZSBub3QgdGhlIG93bmVyIG9mIHRoZSBuYXRpb24EAAAACm5hdGlvbnNoZWcJAQAAABV0cmVhc3VyeVRyeUdldEludGVnZXIAAAABCQEAAAAOZ2V0VHJlYXN1cnlLZXkAAAABBQAAAAlOYXRpb25LZXkDCQAAZgAAAAIFAAAADmFzc2V0QnVpbGRDb3N0BQAAAApuYXRpb25zaGVnCQAAAgAAAAECAAAAHlRoZSBuYXRpb24gaGFzbid0IGVub3VnaCBmdW5kcwQAAAABZAkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAAD3RyZWFzdXJ5QWRkcmVzcwIAAAAUZGVjcmVhc2VOYXRpb25XYWxsZXQJAARMAAAAAgUAAAAJTmF0aW9uS2V5CQAETAAAAAIFAAAADmFzc2V0QnVpbGRDb3N0BQAAAANuaWwFAAAAA25pbAQAAAAHJG1hdGNoMAUAAAABZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFyBQAAAAckbWF0Y2gwBAAAAAJwdwkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAAD3RyZWFzdXJ5QWRkcmVzcwIAAAARYXJiaXRyYXJ5QWRkQ29pbnMJAARMAAAAAgUAAAAJTmF0aW9uS2V5CQAETAAAAAIFAAAADVVuaXRTdGFrZVNoZWcFAAAAA25pbAUAAAADbmlsBAAAAAckbWF0Y2gxBQAAAAJwdwMJAAABAAAAAgUAAAAHJG1hdGNoMQIAAAADSW50BAAAAAFiBQAAAAckbWF0Y2gxBAAAAAh0cmFuc2ZlcgkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAAD3RyZWFzdXJ5QWRkcmVzcwIAAAAaZGlzdHJpYnV0ZU5hdGlvblBheVJld2FyZHMJAARMAAAAAgUAAAAOYXNzZXRCdWlsZENvc3QFAAAAA25pbAUAAAADbmlsBAAAAAckbWF0Y2gyBQAAAAh0cmFuc2ZlcgMJAAABAAAAAgUAAAAHJG1hdGNoMgIAAAADSW50BAAAAAF0BQAAAAckbWF0Y2gyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABRnZXRCdWlsZGluZ1N0YXR1c0tleQAAAAMJAAQlAAAAAQgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAAdjbmZnS2V5BQAAAAxCdWlsZFN0YXJ0ZWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGdldEFzc2V0T3duZXJLZXkAAAACCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAAdjbmZnS2V5BQAAAAlOYXRpb25LZXkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABpnZXRCdWlsZGluZ0ZpbmlzaEhlaWdodEtleQAAAAMJAAQlAAAAAQgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAAdjbmZnS2V5CQAAZAAAAAIFAAAABmhlaWdodAUAAAAQZGVsYXlGb3JCdWlsZGluZwUAAAADbmlsCQAAAgAAAAECAAAAIEVycm9yIERpc3RyaWJ1dGluZyBhc3NldCByZXdhcmRzCQAAAgAAAAECAAAAHUVycm9yIERlcG9zaXRpbmcgbmF0aW9uIGZ1bmRzCQAAAgAAAAECAAAAHUVycm9yIERlcG9zaXRpbmcgbmF0aW9uIGZ1bmRzBAAAAAhhc3NldFNhYwkBAAAAEGNvbmZUcnlHZXRTdHJpbmcAAAABCQABLAAAAAIFAAAAB2NuZmdLZXkCAAAAD19TYWNyaWZpY2VBc3NldAMJAQAAAAIhPQAAAAIFAAAACGFzc2V0U2FjAgAAAAAJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAMU2FjcmlmaWNlS2V5CQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAAEsAAAAAgUAAAAMU2FjcmlmaWNlS2V5AgAAAAZfT3duZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAFGdldEJ1aWxkaW5nU3RhdHVzS2V5AAAAAwkABCUAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQFAAAAB2NuZmdLZXkFAAAADEJ1aWxkU3RhcnRlZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQZ2V0QXNzZXRPd25lcktleQAAAAIIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQFAAAAB2NuZmdLZXkJAAQlAAAAAQgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAaZ2V0QnVpbGRpbmdGaW5pc2hIZWlnaHRLZXkAAAADCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcggFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAAHY25mZ0tleQkAAGQAAAACBQAAAAZoZWlnaHQFAAAAEGRlbGF5Rm9yQnVpbGRpbmcFAAAAA25pbAQAAAAIYW1vdW50SW4JAQAAAAV2YWx1ZQAAAAEICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAMJAABmAAAAAgUAAAAOYXNzZXRCdWlsZENvc3QFAAAACGFtb3VudEluCQAAAgAAAAEJAAEsAAAAAgIAAAA+WW91IHByb3ZpZGVkIGxlc3MgJGhlZyB0aGFuIHRoZSBuZWVkZWQgY29zdCBmb3IgYnVpbGRpbmcgdGhpcyAFAAAADHN0ckFzc2V0VHlwZQMJAQAAAAIhPQAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQFAAAACnNoaW55d2dnaWQJAAACAAAAAQIAAAAaT25seSAkSEVHIHBheW1lbnRzIGFsbG93ZWQEAAAAAnB3CQAD/AAAAAQJAQAAAAdBZGRyZXNzAAAAAQUAAAAPdHJlYXN1cnlBZGRyZXNzAgAAAAdEZXBvc2l0BQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAACnNoaW55d2dnaWQFAAAADVVuaXRTdGFrZVNoZWcFAAAAA25pbAQAAAAHJG1hdGNoMAUAAAACcHcDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABcgUAAAAHJG1hdGNoMAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAUZ2V0QnVpbGRpbmdTdGF0dXNLZXkAAAADCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcggFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAAHY25mZ0tleQUAAAAMQnVpbGRTdGFydGVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRBc3NldE93bmVyS2V5AAAAAggFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAAHY25mZ0tleQkABCUAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABpnZXRCdWlsZGluZ0ZpbmlzaEhlaWdodEtleQAAAAMJAAQlAAAAAQgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAAdjbmZnS2V5CQAAZAAAAAIFAAAABmhlaWdodAUAAAAQZGVsYXlGb3JCdWlsZGluZwkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAthZG1pbldhbGxldAUAAAANVG9BZG1pbldhbGxldAUAAAAKc2hpbnl3Z2dpZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABZkYWlseUdhbWVSZXdhcmRzV2FsbGV0BQAAABNUb0dhbWVSZXdhcmRzV2FsbGV0BQAAAApzaGlueXdnZ2lkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAGWRhaWx5U3Rha2luZ1Jld2FyZHNXYWxsZXQFAAAAFlRvU3Rha2luZ1Jld2FyZHNXYWxsZXQFAAAACnNoaW55d2dnaWQFAAAAA25pbAkAAAIAAAABAgAAABdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAAAAAFpAQAAAAtGaW5pc2hCdWlsZAAAAAQAAAAHdHhJZFN0cgAAAAhhc3NldFN0cgAAAAVMZXZlbAAAAAlOYXRpb25LZXkEAAAABHR4SWQJAAJZAAAAAQUAAAAHdHhJZFN0cgQAAAAFQUxLZXkJAQAAAAhnZXRBTEtleQAAAAIFAAAACGFzc2V0U3RyBQAAAAVMZXZlbAQAAAARQnVpbGRpbmdTdGF0dXNLZXkJAQAAABRnZXRCdWlsZGluZ1N0YXR1c0tleQAAAAMJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAAR0eElkBQAAAAVBTEtleQQAAAAPZmluaXNoSGVpZ2h0S2V5CQEAAAAaZ2V0QnVpbGRpbmdGaW5pc2hIZWlnaHRLZXkAAAADCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAEdHhJZAUAAAAFQUxLZXkEAAAACGFzc2V0S2V5CQEAAAANZ2V0QXNzZXRJZEtleQAAAAIFAAAABHR4SWQFAAAABUFMS2V5BAAAAAphc3NldE93bmVyCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAAEGdldEFzc2V0T3duZXJLZXkAAAACBQAAAAR0eElkBQAAAAVBTEtleQMJAQAAABVpc05hdGlvblJlc2VydmVkQXNzZXQAAAACBQAAAAhhc3NldFN0cgUAAAAFTGV2ZWwDAwkBAAAAASEAAAABCQEAAAAPY2hlY2tBc3NldE93bmVyAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAACU5hdGlvbktleQkBAAAAASEAAAABCQEAAAAKY2hlY2tBZG1pbgAAAAEIBQAAAAFpAAAABmNhbGxlcgcJAAACAAAAAQIAAAAwWW91IGFyZSBub3QgYXV0aG9yaXplZCB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uCQEAAAATaW50ZXJuYWxGaW5pc2hCdWlsZAAAAAYFAAAACU5hdGlvbktleQUAAAAFQUxLZXkFAAAACGFzc2V0S2V5BQAAABFCdWlsZGluZ1N0YXR1c0tleQUAAAAPZmluaXNoSGVpZ2h0S2V5BQAAAAR0eElkAwkBAAAAAiE9AAAAAgUAAAAKYXNzZXRPd25lcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQkAASwAAAACAgAAACFZb3UgY2Fubm90IGNsYWltIG90aGVyJ3MgcGxheWVycyAFAAAACGFzc2V0U3RyBAAAABBidWlsZGluZ1R4U3RhdHVzCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQUAAAARQnVpbGRpbmdTdGF0dXNLZXkDCQAAAAAAAAIFAAAAEGJ1aWxkaW5nVHhTdGF0dXMCAAAAAAkAAAIAAAABAgAAACRObyBwZW5kaW5nIG9wZXJhdGlvbnMgZm9yIHRoaXMgYXNzZXQEAAAACGFzc2V0U2FjCQEAAAAQY29uZlRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgUAAAAFQUxLZXkCAAAAD19TYWNyaWZpY2VBc3NldAQAAAANYXNzZXRTYWNMZXZlbAkBAAAAEWNvbmZUcnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACBQAAAAVBTEtleQIAAAAUX1NhY3JpZmljZUFzc2V0TGV2ZWwDCQEAAAACIT0AAAACBQAAAAhhc3NldFNhYwIAAAAACQEAAAAcaW50ZXJuYWxTYWNyaWZpY2VGaW5pc2hCdWlsZAAAAAcJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAAVBTEtleQUAAAAIYXNzZXRLZXkFAAAAEUJ1aWxkaW5nU3RhdHVzS2V5BQAAAA9maW5pc2hIZWlnaHRLZXkFAAAABHR4SWQJAQAAAAhnZXRBTEtleQAAAAIFAAAACGFzc2V0U2FjBQAAAA1hc3NldFNhY0xldmVsCQEAAAATaW50ZXJuYWxGaW5pc2hCdWlsZAAAAAYJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAAVBTEtleQUAAAAIYXNzZXRLZXkFAAAAEUJ1aWxkaW5nU3RhdHVzS2V5BQAAAA9maW5pc2hIZWlnaHRLZXkFAAAABHR4SWQAAAABaQEAAAARdHJhbnNmZXJPd25lcnNoaXAAAAADAAAAB2Fzc2V0SWQAAAAIbmV3T3duZXIAAAADcXR5AwkBAAAAASEAAAABCQEAAAAKY2hlY2tBZG1pbgAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAAClPbmx5IHRoZSBhZG1pbiBjYW4gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbgkABRQAAAACCQEAAAAZaW50ZXJuYWxUcmFzbmZlck93bmVyc2hpcAAAAAMFAAAAB2Fzc2V0SWQFAAAACG5ld093bmVyBQAAAANxdHkFAAAACG5ld093bmVyAAAAAWkBAAAAF2Rlc3Ryb3lBc3NldEFuZFRyYW5zZmVyAAAAAwAAAAdhc3NldElkAAAAA3F0eQAAAAl0b0FkZHJlc3MEAAAABmNodW5rcwkBAAAAEWdldEFzc2V0VHlwZUxldmVsAAAAAQUAAAAHYXNzZXRJZAQAAAAMc3RyQXNzZXRUeXBlCAUAAAAGY2h1bmtzAAAAAl8xBAAAAAVsZXZlbAgFAAAABmNodW5rcwAAAAJfMgQAAAABawkBAAAACGdldEFMS2V5AAAAAgUAAAAMc3RyQXNzZXRUeXBl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BSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgUAAAAFJGFjYzAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAMAAAAAAAAAAAQAAAAAAAAAAAUAAAAAAAAAAAYAAAAAAAAAAAcAAAAAAAAAAAgAAAAAAAAAAAkAAAAAAAAAAAoAAAAAAAAAAAsAAAAAAAAAAAwAAAAAAAAAAA0AAAAAAAAAAA4AAAAAAAAAAA8AAAAAAAAAABAAAAAAAAAAABEAAAAAAAAAABIAAAAAAAAAABMAAAAAAAAAABQAAAAAAAAAABUAAAAAAAAAABYAAAAAAAAAABcAAAAAAAAAABgAAAAAAAAAABkAAAAAAAAAABoAAAAAAAAAABsAAAAAAAAAABwAAAAAAAAAAB0AAAAAAAAAAB4AAAAAAAAAAB8AAAAAAAAAACAAAAAAAAAAACEAAAAAAAAAACIAAAAAAAAAACMAAAAAAAAAACQAAAAAAAAAACUAAAAAAAAAACYAAAAAAAAAACcAAAAAAAAAACgAAAAAAAAAACkAAAAAAAAAACoAAAAAAAAAACsAAAAAAAAAACwAAAAAAAAAAC0AAAAAAAAAAC4AAAAAAAAA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BE0AAAACCQEAAAAZaW50ZXJuYWxUcmFzbmZlck93bmVyc2hpcAAAAAMFAAAAB2Fzc2V0SWQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAAAAAAAAAAABCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEFAAAAD3RyZWFzdXJ5QWRkcmVzcwUAAAAIYW1vdW50SW4FAAAACnNoaW55d2dnaWQJAAACAAAAAQIAAAApRXJyb3IgdHJhbnNmZXJyaW5nIFNIRUcgdG8gbmF0aW9ucyB3YWxsZXQAAAABaQEAAAAWQWRkQXNzZXRGcm9tTWFya2VwbGFjZQAAAAMAAAAHYXNzZXRJZAAAAAhvbGRPd25lcgAAAAlhc3NldFNoZWcEAAAABmNodW5rcwkBAAAAEWdldEFzc2V0VHlwZUxldmVsAAAAAQUAAAAHYXNzZXRJZAQAAAAMc3RyQXNzZXRUeXBlCAUAAAAGY2h1bmtzAAAAAl8xBAAAAAVsZXZlbAgFAAAABmNodW5rcwAAAAJfMgQAAAABawkBAAAACGdldEFMS2V5AAAAAgUAAAAMc3RyQXNzZXRUeXBlBQAAAAVsZXZlbAQAAAAMY3VycmVudFBvd2VyCQEAAAAUbmF0aW9uc1RyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAgAAAAZfUG93ZXIEAAAACmFzc2V0UG93ZXIJAQAAABFjb25mVHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgUAAAABawIAAAAGX1Bvd2VyAwkBAAAAASEAAAABCQEAAAAKY2hlY2tBZG1pbgAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAAC1Zb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24DCQEAAAARY29uZlRyeUdldEJvb2xlYW4AAAABCQABLAAAAAIFAAAAAWsCAAAAC19BZ2dyZWdhdGVkBAAAAAdhY2h1bmtzCQAEtQAAAAIFAAAAB2Fzc2V0SWQCAAAAAV8EAAAACWFvbGRPd25lcgkAAZEAAAACBQAAAAdhY2h1bmtzAAAAAAAAAAACCQEAAAAXSW5jcmVhc2VBZ2dyZWdhdGVkQXNzZXQA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", "height": 2129580, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D9hSjsYxjrYbE63CLrsb5BK6bRW4tbiZvxLaMuY1NhAU Next: 5icomuz8ju7xjM8P4nCQ6axo483cxwAhG9WpPyA8z89F Diff:
Old | New | Differences | |
---|---|---|---|
119 | 119 | ||
120 | 120 | ||
121 | 121 | func getAssetOwnerKeyString (assetId) = (assetId + "_Owner") | |
122 | + | ||
123 | + | ||
124 | + | func assetsTryGetInteger (key) = match getInteger(Address(assetsAddress), key) { | |
125 | + | case b: Int => | |
126 | + | b | |
127 | + | case _ => | |
128 | + | 0 | |
129 | + | } | |
122 | 130 | ||
123 | 131 | ||
124 | 132 | let BuildStarted = "BUILD_STARTED" | |
255 | 263 | } | |
256 | 264 | ||
257 | 265 | ||
266 | + | func IncreaseAggregatedAsset (assetId,Owner,qty) = { | |
267 | + | let chunks = getAssetTypeLevel(assetId) | |
268 | + | let strAssetType = chunks._1 | |
269 | + | let level = chunks._2 | |
270 | + | let k = getALKey(strAssetType, level) | |
271 | + | let assetPower = confTryGetInteger((k + "_Power")) | |
272 | + | let qtyPower = (assetPower * qty) | |
273 | + | let Coins = tryGetInteger(assetId) | |
274 | + | let qtyAsset = tryGetInteger((assetId + "_Qty")) | |
275 | + | let ownerPower = nationsTryGetInteger((Owner + "_Power")) | |
276 | + | let singleCoin = ((confTryGetInteger((k + "_Cost")) * 20) / 100) | |
277 | + | let pw = invoke(Address(nationsAddress), "setUserPower", [Owner, (ownerPower - qtyPower)], nil) | |
278 | + | if ((pw == pw)) | |
279 | + | then [IntegerEntry((assetId + "_Qty"), (qtyAsset + qty)), IntegerEntry(assetId, (Coins + (qty * singleCoin)))] | |
280 | + | else throw("Strict value is not equal to itself.") | |
281 | + | } | |
282 | + | ||
283 | + | ||
284 | + | func DecreaseAggregatedAsset (assetId,Owner,qty) = { | |
285 | + | let qtyAsset = tryGetInteger((assetId + "_Qty")) | |
286 | + | if ((0 > (qtyAsset - qty))) | |
287 | + | then throw("you don't have enough unit") | |
288 | + | else IncreaseAggregatedAsset(assetId, Owner, (0 - qty)) | |
289 | + | } | |
290 | + | ||
291 | + | ||
258 | 292 | func internalTrasnferOwnership (assetId,newOwner,qty) = { | |
259 | 293 | let chunks = getAssetTypeLevel(assetId) | |
260 | 294 | let strAssetType = chunks._1 | |
263 | 297 | let oldOwner = tryGetString(getAssetOwnerKeyString(assetId)) | |
264 | 298 | if (confTryGetBoolean((k + "_Aggregated"))) | |
265 | 299 | then { | |
266 | - | let assetPower = confTryGetInteger((k + "_Power")) | |
267 | - | let qtyPower = (assetPower * qty) | |
268 | - | let aggrAssetkey = ((k + "_") + oldOwner) | |
269 | - | let oldPower = nationsTryGetInteger((oldOwner + "_Power")) | |
270 | - | let oldCoins = tryGetInteger(aggrAssetkey) | |
271 | - | let singleCoin = fraction(oldCoins, 1, qty) | |
272 | - | let oldItemqty = tryGetInteger((aggrAssetkey + "_Qty")) | |
273 | 300 | let newAggrAssetKey = ((k + "_") + newOwner) | |
274 | - | let newCoins = tryGetInteger(newAggrAssetKey) | |
275 | - | let newItemqty = tryGetInteger((newAggrAssetKey + "_Qty")) | |
276 | - | let newPower = nationsTryGetInteger((newOwner + "_Power")) | |
277 | - | let pwOld = invoke(Address(nationsAddress), "setUserPower", [oldOwner, (oldPower - qtyPower)], nil) | |
278 | - | if ((pwOld == pwOld)) | |
279 | - | then { | |
280 | - | let pwNew = invoke(Address(nationsAddress), "setUserPower", [newOwner, (newPower + qtyPower)], nil) | |
281 | - | if ((pwNew == pwNew)) | |
282 | - | then [IntegerEntry((aggrAssetkey + "_Qty"), (oldItemqty - qty)), IntegerEntry((newAggrAssetKey + "_Qty"), (newItemqty + qty)), IntegerEntry(aggrAssetkey, (oldCoins - (qty * singleCoin))), IntegerEntry(newAggrAssetKey, (newCoins + (qty * singleCoin)))] | |
283 | - | else throw("Strict value is not equal to itself.") | |
284 | - | } | |
285 | - | else throw("Strict value is not equal to itself.") | |
301 | + | let achunks = split(assetId, "_") | |
302 | + | let aoldOwner = achunks[2] | |
303 | + | let aggrAssetkey = ((k + "_") + aoldOwner) | |
304 | + | let dec = DecreaseAggregatedAsset(aggrAssetkey, aoldOwner, qty) | |
305 | + | let inc = IncreaseAggregatedAsset(newAggrAssetKey, newOwner, qty) | |
306 | + | (inc ++ dec) | |
286 | 307 | } | |
287 | 308 | else { | |
288 | 309 | let assetPower = confTryGetInteger((k + "_Power")) | |
487 | 508 | if (confTryGetBoolean((k + "_Aggregated"))) | |
488 | 509 | then { | |
489 | 510 | let unitAssetCoins = ((confTryGetInteger((k + "_Cost")) * 20) / 100) | |
490 | - | let qtyAsset = tryGetInteger((k + "_Qty")) | |
511 | + | let achunks = split(assetId, "_") | |
512 | + | let aoldOwner = achunks[2] | |
513 | + | let qtyAsset = tryGetInteger((assetId + "_Qty")) | |
491 | 514 | if ((0 > (qtyAsset - qty))) | |
492 | 515 | then throw(("you don't have enough " + strAssetType)) | |
493 | 516 | else { | |
494 | - | let pw = invoke(Address(nationsAddress), "setUserPower", [ | |
517 | + | let pw = invoke(Address(nationsAddress), "setUserPower", [aoldOwner, (currentPower - (assetPower * qty))], nil) | |
495 | 518 | match pw { | |
496 | 519 | case r: Int => | |
497 | 520 | let attackers = split(toAddress, "#") | |
511 | 534 | } | |
512 | 535 | if ((dist == dist)) | |
513 | 536 | then if (((qtyAsset - qty) > 0)) | |
514 | - | then [IntegerEntry(( | |
537 | + | then [IntegerEntry((assetId + "_Qty"), (qtyAsset - qty))] | |
515 | 538 | else [DeleteEntry(assetId), DeleteEntry(getAssetOwnerKeyString(assetId))] | |
516 | 539 | else throw("Strict value is not equal to itself.") | |
517 | 540 | case _ => | |
569 | 592 | if (confTryGetBoolean((k + "_Aggregated"))) | |
570 | 593 | then { | |
571 | 594 | let unitAssetCoins = ((confTryGetInteger((k + "_Cost")) * 20) / 100) | |
572 | - | let qtyAsset = tryGetInteger((k + "_Qty")) | |
595 | + | let aggrAssetkey = ((k + "_") + toString(i.caller)) | |
596 | + | let qtyAsset = tryGetInteger((aggrAssetkey + "_Qty")) | |
573 | 597 | if ((0 > (qtyAsset - qty))) | |
574 | 598 | then throw(("you don't have enough " + strAssetType)) | |
575 | 599 | else { | |
579 | 603 | let tr = invoke(Address(treasuryAddress), "adminTransfer", [toString(i.caller), (unitAssetCoins * qty)], nil) | |
580 | 604 | match tr { | |
581 | 605 | case t: Int => | |
582 | - | if (((qtyAsset - qty) > 0)) | |
583 | - | then [IntegerEntry((k + "_Qty"), (qtyAsset - qty))] | |
584 | - | else [DeleteEntry(assetId), DeleteEntry(getAssetOwnerKeyString(assetId))] | |
606 | + | [IntegerEntry((aggrAssetkey + "_Qty"), (qtyAsset - qty))] | |
585 | 607 | case _ => | |
586 | 608 | throw("Error transferring coins") | |
587 | 609 | } | |
658 | 680 | ||
659 | 681 | ||
660 | 682 | @Callable(i) | |
661 | - | func AddAssetFromMarkeplace (assetId,oldOwner,assetSheg) = if (!(checkAdmin(i.caller))) | |
662 | - | then throw("You are not allowed to perform this operation") | |
663 | - | else $Tuple2([StringEntry(getAssetOwnerKeyString(assetId), oldOwner), IntegerEntry(assetId, assetSheg)], oldOwner) | |
683 | + | func AddAssetFromMarkeplace (assetId,oldOwner,assetSheg) = { | |
684 | + | let chunks = getAssetTypeLevel(assetId) | |
685 | + | let strAssetType = chunks._1 | |
686 | + | let level = chunks._2 | |
687 | + | let k = getALKey(strAssetType, level) | |
688 | + | let currentPower = nationsTryGetInteger((toString(i.caller) + "_Power")) | |
689 | + | let assetPower = confTryGetInteger((k + "_Power")) | |
690 | + | if (!(checkAdmin(i.caller))) | |
691 | + | then throw("You are not allowed to perform this operation") | |
692 | + | else if (confTryGetBoolean((k + "_Aggregated"))) | |
693 | + | then { | |
694 | + | let achunks = split(assetId, "_") | |
695 | + | let aoldOwner = achunks[2] | |
696 | + | IncreaseAggregatedAsset(assetId, aoldOwner, 1) | |
697 | + | } | |
698 | + | else $Tuple2([StringEntry(getAssetOwnerKeyString(assetId), oldOwner), IntegerEntry(assetId, assetSheg)], oldOwner) | |
699 | + | } | |
664 | 700 | ||
665 | 701 | ||
666 | 702 | ||
667 | 703 | @Callable(i) | |
668 | - | func TransferAssetToMarketplace (assetId,sellprice) = if (!(checkAssetOwner(toString(i.caller), assetId))) | |
669 | - | then throw("You are not the owner of this asset") | |
670 | - | else { | |
671 | - | let assetSheg = tryGetInteger(assetId) | |
672 | - | let tr = invoke(Address(marketplaceAddress), "putOnSale", [assetId, assetSheg, sellprice], nil) | |
673 | - | match tr { | |
674 | - | case t: Int => | |
704 | + | func TransferAssetToMarketplace (assetId,sellprice) = { | |
705 | + | let chunks = getAssetTypeLevel(assetId) | |
706 | + | let strAssetType = chunks._1 | |
707 | + | let level = chunks._2 | |
708 | + | let k = getALKey(strAssetType, level) | |
709 | + | let currentPower = nationsTryGetInteger((toString(i.caller) + "_Power")) | |
710 | + | let assetPower = confTryGetInteger((k + "_Power")) | |
711 | + | let assetSheg = tryGetInteger(assetId) | |
712 | + | if (!(checkAssetOwner(toString(i.caller), assetId))) | |
713 | + | then throw("You are not the owner of this asset") | |
714 | + | else if (confTryGetBoolean((k + "_Aggregated"))) | |
715 | + | then { | |
716 | + | let achunks = split(assetId, "_") | |
717 | + | let oldOwner = achunks[2] | |
718 | + | let tr = invoke(Address(marketplaceAddress), "putOnSale", [assetId, assetSheg, sellprice], nil) | |
719 | + | match tr { | |
720 | + | case t: Int => | |
721 | + | DecreaseAggregatedAsset(assetId, oldOwner, 1) | |
722 | + | case _ => | |
723 | + | throw("Error putting the item on the marketplace") | |
724 | + | } | |
725 | + | } | |
726 | + | else { | |
727 | + | let tr = invoke(Address(marketplaceAddress), "putOnSale", [assetId, assetSheg, sellprice], nil) | |
728 | + | match tr { | |
729 | + | case t: Int => | |
675 | 730 | [DeleteEntry(getAssetOwnerKeyString(assetId)), DeleteEntry(assetId)] | |
676 | - | case _ => | |
677 | - | throw("Error putting the item on the marketplace") | |
678 | - | } | |
679 | - | } | |
731 | + | case _ => | |
732 | + | throw("Error putting the item on the marketplace") | |
733 | + | } | |
734 | + | } | |
735 | + | } | |
680 | 736 | ||
681 | 737 | ||
682 | 738 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let shinywggid = base58'AFQS5E4ELtxex3iANtWtUU2V2oWJZSo8VVnK8z3VFmqf' | |
5 | 5 | ||
6 | 6 | let treasuryAddress = base58'3MyDGEoKp1gF4LSRknk9vSuDEyrwuYXcQEQ' | |
7 | 7 | ||
8 | 8 | let assetsAddress = base58'3N8WDKbqGox5Eky326PHHT7rUyrby5MXdmb' | |
9 | 9 | ||
10 | 10 | let marketplaceAddress = base58'3Mra7mjPipcQd5sJaRmXK8xgS4scb8gPF4A' | |
11 | 11 | ||
12 | 12 | let configurationAddress = base58'3N9tj3b2djcaZozn97VkYchL9S1i6cdEbC1' | |
13 | 13 | ||
14 | 14 | let nationsAddress = base58'3MvyzDtzWWV5MZ1GP8JfQhhQqiGU4Nbifdy' | |
15 | 15 | ||
16 | 16 | let adminWallet = addressFromStringValue("3MpNtiPSRSq6NnaQYk38BfWSzZcgAYTyrQ9") | |
17 | 17 | ||
18 | 18 | let dailyGameRewardsWallet = addressFromStringValue("3MuSrXTTiwo9bdoD6FeaBpMUYMiU5saDv2U") | |
19 | 19 | ||
20 | 20 | let dailyStakingRewardsWallet = addressFromStringValue("3Mv3mr3uNXdpgkVPApbGEJjMQXqau37DY5i") | |
21 | 21 | ||
22 | 22 | func checkAdmin (caller) = if (if (if (if (if ((caller == adminWallet)) | |
23 | 23 | then true | |
24 | 24 | else (caller == this)) | |
25 | 25 | then true | |
26 | 26 | else (caller.bytes == assetsAddress)) | |
27 | 27 | then true | |
28 | 28 | else (caller.bytes == treasuryAddress)) | |
29 | 29 | then true | |
30 | 30 | else (caller.bytes == marketplaceAddress)) | |
31 | 31 | then true | |
32 | 32 | else (caller.bytes == nationsAddress) | |
33 | 33 | ||
34 | 34 | ||
35 | 35 | func tryGetInteger (key) = match getInteger(this, key) { | |
36 | 36 | case b: Int => | |
37 | 37 | b | |
38 | 38 | case _ => | |
39 | 39 | 0 | |
40 | 40 | } | |
41 | 41 | ||
42 | 42 | ||
43 | 43 | func tryGetBoolean (key) = match getBoolean(this, key) { | |
44 | 44 | case b: Boolean => | |
45 | 45 | b | |
46 | 46 | case _ => | |
47 | 47 | false | |
48 | 48 | } | |
49 | 49 | ||
50 | 50 | ||
51 | 51 | func tryGetString (key) = match getString(this, key) { | |
52 | 52 | case b: String => | |
53 | 53 | b | |
54 | 54 | case _ => | |
55 | 55 | "" | |
56 | 56 | } | |
57 | 57 | ||
58 | 58 | ||
59 | 59 | func getALKey (Name,Level) = ((Name + "_lvl") + toString(Level)) | |
60 | 60 | ||
61 | 61 | ||
62 | 62 | func confTryGetInteger (key) = match getInteger(Address(configurationAddress), key) { | |
63 | 63 | case b: Int => | |
64 | 64 | b | |
65 | 65 | case _ => | |
66 | 66 | 0 | |
67 | 67 | } | |
68 | 68 | ||
69 | 69 | ||
70 | 70 | func confTryGetString (key) = match getString(Address(configurationAddress), key) { | |
71 | 71 | case b: String => | |
72 | 72 | b | |
73 | 73 | case _ => | |
74 | 74 | "" | |
75 | 75 | } | |
76 | 76 | ||
77 | 77 | ||
78 | 78 | func confTryGetBoolean (key) = match getBoolean(Address(configurationAddress), key) { | |
79 | 79 | case b: Boolean => | |
80 | 80 | b | |
81 | 81 | case _ => | |
82 | 82 | false | |
83 | 83 | } | |
84 | 84 | ||
85 | 85 | ||
86 | 86 | func getTreasuryKey (nationid) = (nationid + "_Treasury") | |
87 | 87 | ||
88 | 88 | ||
89 | 89 | func treasuryTryGetInteger (key) = match getInteger(Address(treasuryAddress), key) { | |
90 | 90 | case b: Int => | |
91 | 91 | b | |
92 | 92 | case _ => | |
93 | 93 | 0 | |
94 | 94 | } | |
95 | 95 | ||
96 | 96 | ||
97 | 97 | func nationsTryGetInteger (key) = match getInteger(Address(nationsAddress), key) { | |
98 | 98 | case b: Int => | |
99 | 99 | b | |
100 | 100 | case _ => | |
101 | 101 | 0 | |
102 | 102 | } | |
103 | 103 | ||
104 | 104 | ||
105 | 105 | func nationsTryGetBoolean (key) = match getBoolean(Address(nationsAddress), key) { | |
106 | 106 | case b: Boolean => | |
107 | 107 | b | |
108 | 108 | case _ => | |
109 | 109 | false | |
110 | 110 | } | |
111 | 111 | ||
112 | 112 | ||
113 | 113 | func nationsTryGetString (key) = match getString(Address(nationsAddress), key) { | |
114 | 114 | case b: String => | |
115 | 115 | b | |
116 | 116 | case _ => | |
117 | 117 | "" | |
118 | 118 | } | |
119 | 119 | ||
120 | 120 | ||
121 | 121 | func getAssetOwnerKeyString (assetId) = (assetId + "_Owner") | |
122 | + | ||
123 | + | ||
124 | + | func assetsTryGetInteger (key) = match getInteger(Address(assetsAddress), key) { | |
125 | + | case b: Int => | |
126 | + | b | |
127 | + | case _ => | |
128 | + | 0 | |
129 | + | } | |
122 | 130 | ||
123 | 131 | ||
124 | 132 | let BuildStarted = "BUILD_STARTED" | |
125 | 133 | ||
126 | 134 | let BuildFinished = "BUILD_FINISHED" | |
127 | 135 | ||
128 | 136 | func getAssetIdKey (txId,assetType) = ((assetType + "_") + toBase58String(txId)) | |
129 | 137 | ||
130 | 138 | ||
131 | 139 | func getAssetOwnerKey (txId,assetType) = (getAssetIdKey(txId, assetType) + "_Owner") | |
132 | 140 | ||
133 | 141 | ||
134 | 142 | func getBuildingFinishHeightKey (address,txId,assetType) = (((address + "_") + getAssetIdKey(txId, assetType)) + "_fh") | |
135 | 143 | ||
136 | 144 | ||
137 | 145 | func getBuildingStatusKey (address,txId,assetType) = (((address + "_") + getAssetIdKey(txId, assetType)) + "_status") | |
138 | 146 | ||
139 | 147 | ||
140 | 148 | func getAssetTypeLevel (assetStr) = { | |
141 | 149 | let chunks = split(assetStr, "_") | |
142 | 150 | let strAssetType = chunks[0] | |
143 | 151 | let level = parseIntValue(drop(chunks[1], 3)) | |
144 | 152 | $Tuple2(strAssetType, level) | |
145 | 153 | } | |
146 | 154 | ||
147 | 155 | ||
148 | 156 | func internalDistrib (addressStr,amount) = { | |
149 | 157 | let tr = invoke(Address(treasuryAddress), "addReward", [addressFromStringValue(addressStr), amount], nil) | |
150 | 158 | if ((tr == tr)) | |
151 | 159 | then match tr { | |
152 | 160 | case t: Int => | |
153 | 161 | amount | |
154 | 162 | case _ => | |
155 | 163 | 0 | |
156 | 164 | } | |
157 | 165 | else throw("Strict value is not equal to itself.") | |
158 | 166 | } | |
159 | 167 | ||
160 | 168 | ||
161 | 169 | func distribDestroyRewards (accum,nextValue) = { | |
162 | 170 | let val = split(nextValue, "_") | |
163 | 171 | let addr = val[0] | |
164 | 172 | let amnt = val[1] | |
165 | 173 | (accum :+ internalDistrib(addr, parseIntValue(amnt))) | |
166 | 174 | } | |
167 | 175 | ||
168 | 176 | ||
169 | 177 | func internalSacrificeFinishBuild (caller,assetStr,assetKey,BuildingStatusKey,finishHeightKey,transactionId,sacrificekey) = { | |
170 | 178 | let chunks = getAssetTypeLevel(assetStr) | |
171 | 179 | let strAssetType = chunks._1 | |
172 | 180 | let level = chunks._2 | |
173 | 181 | let buildingFinishHeight = getIntegerValue(this, finishHeightKey) | |
174 | 182 | if ((buildingFinishHeight > height)) | |
175 | 183 | then throw((((("Building is not finished yet " + toString((buildingFinishHeight - height))) + " blocks remaining, it will take around ") + toString((buildingFinishHeight - height))) + " minutes")) | |
176 | 184 | else if ((take(strAssetType, 4) == "TECH")) | |
177 | 185 | then { | |
178 | 186 | let discovered = invoke(Address(nationsAddress), "setTecnhnologyDiscovered", [caller, assetStr], nil) | |
179 | 187 | if ((discovered == true)) | |
180 | 188 | then [DeleteEntry(BuildingStatusKey), DeleteEntry(finishHeightKey), DeleteEntry(getAssetOwnerKey(transactionId, assetStr))] | |
181 | 189 | else throw("error discovering technology") | |
182 | 190 | } | |
183 | 191 | else { | |
184 | 192 | let assetPower = confTryGetInteger((assetStr + "_Power")) | |
185 | 193 | let assetCoins = ((confTryGetInteger((sacrificekey + "_Cost")) * 20) / 100) | |
186 | 194 | if ((assetPower > 0)) | |
187 | 195 | then { | |
188 | 196 | let currentPower = nationsTryGetInteger((caller + "_Power")) | |
189 | 197 | let pw = invoke(Address(nationsAddress), "setUserPower", [caller, (currentPower + assetPower)], nil) | |
190 | 198 | if ((pw == pw)) | |
191 | 199 | then [IntegerEntry(assetKey, assetCoins), DeleteEntry(BuildingStatusKey), DeleteEntry(finishHeightKey)] | |
192 | 200 | else throw("Strict value is not equal to itself.") | |
193 | 201 | } | |
194 | 202 | else [IntegerEntry(assetKey, assetCoins), DeleteEntry(BuildingStatusKey), DeleteEntry(finishHeightKey)] | |
195 | 203 | } | |
196 | 204 | } | |
197 | 205 | ||
198 | 206 | ||
199 | 207 | func internalFinishBuild (caller,assetStr,assetKey,BuildingStatusKey,finishHeightKey,transactionId) = { | |
200 | 208 | let chunks = getAssetTypeLevel(assetStr) | |
201 | 209 | let strAssetType = chunks._1 | |
202 | 210 | let level = chunks._2 | |
203 | 211 | let buildingFinishHeight = getIntegerValue(this, finishHeightKey) | |
204 | 212 | if ((buildingFinishHeight > height)) | |
205 | 213 | then throw((((("Building is not finished yet " + toString((buildingFinishHeight - height))) + " blocks remaining, it will take around ") + toString((buildingFinishHeight - height))) + " minutes")) | |
206 | 214 | else if ((take(strAssetType, 4) == "TECH")) | |
207 | 215 | then { | |
208 | 216 | let discovered = invoke(Address(nationsAddress), "setTecnhnologyDiscovered", [caller, assetStr], nil) | |
209 | 217 | if ((discovered == true)) | |
210 | 218 | then [DeleteEntry(BuildingStatusKey), DeleteEntry(finishHeightKey), DeleteEntry(getAssetOwnerKey(transactionId, assetStr))] | |
211 | 219 | else throw("error discovering technology") | |
212 | 220 | } | |
213 | 221 | else { | |
214 | 222 | let assetPower = confTryGetInteger((assetStr + "_Power")) | |
215 | 223 | let assetCoins = ((confTryGetInteger((assetStr + "_Cost")) * 20) / 100) | |
216 | 224 | let refCall = invoke(Address(treasuryAddress), "Pay", [caller, assetCoins], nil) | |
217 | 225 | if ((refCall == refCall)) | |
218 | 226 | then if ((assetPower > 0)) | |
219 | 227 | then { | |
220 | 228 | let currentPower = nationsTryGetInteger((caller + "_Power")) | |
221 | 229 | let pw = invoke(Address(nationsAddress), "setUserPower", [caller, (currentPower + assetPower)], nil) | |
222 | 230 | if ((pw == pw)) | |
223 | 231 | then if (confTryGetBoolean((assetStr + "_Aggregated"))) | |
224 | 232 | then { | |
225 | 233 | let aggrAssetkey = ((assetStr + "_") + caller) | |
226 | 234 | let coins = tryGetInteger(aggrAssetkey) | |
227 | 235 | let qty = tryGetInteger((aggrAssetkey + "_Qty")) | |
228 | 236 | [DeleteEntry(getAssetOwnerKey(transactionId, assetStr)), StringEntry((aggrAssetkey + "_Owner"), caller), IntegerEntry(aggrAssetkey, (coins + assetCoins)), IntegerEntry((aggrAssetkey + "_Qty"), (qty + 1)), DeleteEntry(BuildingStatusKey), DeleteEntry(finishHeightKey)] | |
229 | 237 | } | |
230 | 238 | else [IntegerEntry(assetKey, assetCoins), DeleteEntry(BuildingStatusKey), DeleteEntry(finishHeightKey)] | |
231 | 239 | else throw("Strict value is not equal to itself.") | |
232 | 240 | } | |
233 | 241 | else if (confTryGetBoolean((assetStr + "_Aggregated"))) | |
234 | 242 | then { | |
235 | 243 | let aggrAssetkey = ((assetStr + "_") + caller) | |
236 | 244 | let coins = tryGetInteger(aggrAssetkey) | |
237 | 245 | let qty = tryGetInteger((aggrAssetkey + "_Qty")) | |
238 | 246 | [DeleteEntry(getAssetOwnerKey(transactionId, assetStr)), StringEntry((aggrAssetkey + "_Owner"), caller), IntegerEntry(aggrAssetkey, (coins + assetCoins)), IntegerEntry((aggrAssetkey + "_Qty"), (qty + 1)), DeleteEntry(BuildingStatusKey), DeleteEntry(finishHeightKey)] | |
239 | 247 | } | |
240 | 248 | else [IntegerEntry(assetKey, assetCoins), DeleteEntry(BuildingStatusKey), DeleteEntry(finishHeightKey)] | |
241 | 249 | else throw("Strict value is not equal to itself.") | |
242 | 250 | } | |
243 | 251 | } | |
244 | 252 | ||
245 | 253 | ||
246 | 254 | func checkAssetOwner (caller,assetKey) = { | |
247 | 255 | let assetOwner = tryGetString(getAssetOwnerKeyString(assetKey)) | |
248 | 256 | (assetOwner == caller) | |
249 | 257 | } | |
250 | 258 | ||
251 | 259 | ||
252 | 260 | func isNationReservedAsset (Name,Level) = { | |
253 | 261 | let k = getALKey(Name, Level) | |
254 | 262 | confTryGetBoolean((k + "_NationReserved")) | |
255 | 263 | } | |
256 | 264 | ||
257 | 265 | ||
266 | + | func IncreaseAggregatedAsset (assetId,Owner,qty) = { | |
267 | + | let chunks = getAssetTypeLevel(assetId) | |
268 | + | let strAssetType = chunks._1 | |
269 | + | let level = chunks._2 | |
270 | + | let k = getALKey(strAssetType, level) | |
271 | + | let assetPower = confTryGetInteger((k + "_Power")) | |
272 | + | let qtyPower = (assetPower * qty) | |
273 | + | let Coins = tryGetInteger(assetId) | |
274 | + | let qtyAsset = tryGetInteger((assetId + "_Qty")) | |
275 | + | let ownerPower = nationsTryGetInteger((Owner + "_Power")) | |
276 | + | let singleCoin = ((confTryGetInteger((k + "_Cost")) * 20) / 100) | |
277 | + | let pw = invoke(Address(nationsAddress), "setUserPower", [Owner, (ownerPower - qtyPower)], nil) | |
278 | + | if ((pw == pw)) | |
279 | + | then [IntegerEntry((assetId + "_Qty"), (qtyAsset + qty)), IntegerEntry(assetId, (Coins + (qty * singleCoin)))] | |
280 | + | else throw("Strict value is not equal to itself.") | |
281 | + | } | |
282 | + | ||
283 | + | ||
284 | + | func DecreaseAggregatedAsset (assetId,Owner,qty) = { | |
285 | + | let qtyAsset = tryGetInteger((assetId + "_Qty")) | |
286 | + | if ((0 > (qtyAsset - qty))) | |
287 | + | then throw("you don't have enough unit") | |
288 | + | else IncreaseAggregatedAsset(assetId, Owner, (0 - qty)) | |
289 | + | } | |
290 | + | ||
291 | + | ||
258 | 292 | func internalTrasnferOwnership (assetId,newOwner,qty) = { | |
259 | 293 | let chunks = getAssetTypeLevel(assetId) | |
260 | 294 | let strAssetType = chunks._1 | |
261 | 295 | let level = chunks._2 | |
262 | 296 | let k = getALKey(strAssetType, level) | |
263 | 297 | let oldOwner = tryGetString(getAssetOwnerKeyString(assetId)) | |
264 | 298 | if (confTryGetBoolean((k + "_Aggregated"))) | |
265 | 299 | then { | |
266 | - | let assetPower = confTryGetInteger((k + "_Power")) | |
267 | - | let qtyPower = (assetPower * qty) | |
268 | - | let aggrAssetkey = ((k + "_") + oldOwner) | |
269 | - | let oldPower = nationsTryGetInteger((oldOwner + "_Power")) | |
270 | - | let oldCoins = tryGetInteger(aggrAssetkey) | |
271 | - | let singleCoin = fraction(oldCoins, 1, qty) | |
272 | - | let oldItemqty = tryGetInteger((aggrAssetkey + "_Qty")) | |
273 | 300 | let newAggrAssetKey = ((k + "_") + newOwner) | |
274 | - | let newCoins = tryGetInteger(newAggrAssetKey) | |
275 | - | let newItemqty = tryGetInteger((newAggrAssetKey + "_Qty")) | |
276 | - | let newPower = nationsTryGetInteger((newOwner + "_Power")) | |
277 | - | let pwOld = invoke(Address(nationsAddress), "setUserPower", [oldOwner, (oldPower - qtyPower)], nil) | |
278 | - | if ((pwOld == pwOld)) | |
279 | - | then { | |
280 | - | let pwNew = invoke(Address(nationsAddress), "setUserPower", [newOwner, (newPower + qtyPower)], nil) | |
281 | - | if ((pwNew == pwNew)) | |
282 | - | then [IntegerEntry((aggrAssetkey + "_Qty"), (oldItemqty - qty)), IntegerEntry((newAggrAssetKey + "_Qty"), (newItemqty + qty)), IntegerEntry(aggrAssetkey, (oldCoins - (qty * singleCoin))), IntegerEntry(newAggrAssetKey, (newCoins + (qty * singleCoin)))] | |
283 | - | else throw("Strict value is not equal to itself.") | |
284 | - | } | |
285 | - | else throw("Strict value is not equal to itself.") | |
301 | + | let achunks = split(assetId, "_") | |
302 | + | let aoldOwner = achunks[2] | |
303 | + | let aggrAssetkey = ((k + "_") + aoldOwner) | |
304 | + | let dec = DecreaseAggregatedAsset(aggrAssetkey, aoldOwner, qty) | |
305 | + | let inc = IncreaseAggregatedAsset(newAggrAssetKey, newOwner, qty) | |
306 | + | (inc ++ dec) | |
286 | 307 | } | |
287 | 308 | else { | |
288 | 309 | let assetPower = confTryGetInteger((k + "_Power")) | |
289 | 310 | if ((assetPower > 0)) | |
290 | 311 | then { | |
291 | 312 | let currentPower = nationsTryGetInteger((oldOwner + "_Power")) | |
292 | 313 | let pw = invoke(Address(nationsAddress), "setUserPower", [oldOwner, (currentPower - assetPower)], nil) | |
293 | 314 | if ((pw == pw)) | |
294 | 315 | then if ((pw != (currentPower - assetPower))) | |
295 | 316 | then throw("Incorrect invoke result") | |
296 | 317 | else { | |
297 | 318 | let newcurrentPower = nationsTryGetInteger((newOwner + "_Power")) | |
298 | 319 | let pw2 = invoke(Address(nationsAddress), "setUserPower", [newOwner, (newcurrentPower + assetPower)], nil) | |
299 | 320 | if ((pw2 == pw2)) | |
300 | 321 | then match pw2 { | |
301 | 322 | case r: Int => | |
302 | 323 | [StringEntry(getAssetOwnerKeyString(assetId), newOwner)] | |
303 | 324 | case _ => | |
304 | 325 | throw("Incorrect invoke result") | |
305 | 326 | } | |
306 | 327 | else throw("Strict value is not equal to itself.") | |
307 | 328 | } | |
308 | 329 | else throw("Strict value is not equal to itself.") | |
309 | 330 | } | |
310 | 331 | else [StringEntry(getAssetOwnerKeyString(assetId), newOwner)] | |
311 | 332 | } | |
312 | 333 | } | |
313 | 334 | ||
314 | 335 | ||
315 | 336 | func CheckAssetBuildableSacrifice (ALKey,caller,SacrificeKey) = { | |
316 | 337 | let assetSac = confTryGetString((ALKey + "_SacrificeAsset")) | |
317 | 338 | let assetSaclvl = confTryGetInteger((ALKey + "_SacrificeAssetLevel")) | |
318 | 339 | if ((assetSac == "")) | |
319 | 340 | then true | |
320 | 341 | else if (!(checkAssetOwner(caller, SacrificeKey))) | |
321 | 342 | then throw("you are not the owner of the Sacrifice asset") | |
322 | 343 | else { | |
323 | 344 | let chunks = getAssetTypeLevel(SacrificeKey) | |
324 | 345 | if (if ((assetSac != chunks._1)) | |
325 | 346 | then true | |
326 | 347 | else (assetSaclvl != chunks._2)) | |
327 | 348 | then throw("the sacrificeAsset has the wrong type or level") | |
328 | 349 | else true | |
329 | 350 | } | |
330 | 351 | } | |
331 | 352 | ||
332 | 353 | ||
333 | 354 | func CheckAssetBuildableNation (Name,Level,NationKey,SacrificeKey) = { | |
334 | 355 | let cnfgKey = getALKey(Name, Level) | |
335 | 356 | let tec = confTryGetString((cnfgKey + "_Tecnhology_discovered")) | |
336 | 357 | if ((tec != "")) | |
337 | 358 | then if (nationsTryGetBoolean(((NationKey + "_") + tec))) | |
338 | 359 | then CheckAssetBuildableSacrifice(cnfgKey, NationKey, SacrificeKey) | |
339 | 360 | else false | |
340 | 361 | else CheckAssetBuildableSacrifice(cnfgKey, NationKey, SacrificeKey) | |
341 | 362 | } | |
342 | 363 | ||
343 | 364 | ||
344 | 365 | func CheckAssetBuildableUser (Name,Level,caller,SacrificeKey) = { | |
345 | 366 | let cnfKey = getALKey(Name, Level) | |
346 | 367 | let nationId = nationsTryGetInteger(caller) | |
347 | 368 | if ((nationId == 0)) | |
348 | 369 | then false | |
349 | 370 | else { | |
350 | 371 | let tec = confTryGetString((cnfKey + "_Tecnhology_discovered")) | |
351 | 372 | if ((tec != "")) | |
352 | 373 | then { | |
353 | 374 | let NationKey = nationsTryGetString(toString(nationId)) | |
354 | 375 | if (nationsTryGetBoolean(((NationKey + "_") + tec))) | |
355 | 376 | then CheckAssetBuildableSacrifice(cnfKey, caller, SacrificeKey) | |
356 | 377 | else false | |
357 | 378 | } | |
358 | 379 | else CheckAssetBuildableSacrifice(cnfKey, caller, SacrificeKey) | |
359 | 380 | } | |
360 | 381 | } | |
361 | 382 | ||
362 | 383 | ||
363 | 384 | func CheckAssetBuildable (Name,Level,Caller,NationKey,SacrificeKey) = if ((NationKey != "")) | |
364 | 385 | then CheckAssetBuildableNation(Name, Level, NationKey, SacrificeKey) | |
365 | 386 | else CheckAssetBuildableUser(Name, Level, Caller, SacrificeKey) | |
366 | 387 | ||
367 | 388 | ||
368 | 389 | @Callable(i) | |
369 | 390 | func StartBuild (strAssetType,Level,NationKey,SacrificeKey) = if (!(CheckAssetBuildable(strAssetType, Level, toString(i.caller), NationKey, SacrificeKey))) | |
370 | 391 | then throw("You cannot build this Item") | |
371 | 392 | else { | |
372 | 393 | let cnfgKey = getALKey(strAssetType, Level) | |
373 | 394 | let delayForBuilding = confTryGetInteger((cnfgKey + "_BuildTime")) | |
374 | 395 | let assetBuildCost = confTryGetInteger((cnfgKey + "_Cost")) | |
375 | 396 | let ToAdminWallet = ((assetBuildCost * 5) / 100) | |
376 | 397 | let ToGameRewardsWallet = ((assetBuildCost * 10) / 100) | |
377 | 398 | let ToStakingRewardsWallet = ((assetBuildCost * 65) / 100) | |
378 | 399 | let UnitStakeSheg = (((assetBuildCost - ToAdminWallet) - ToGameRewardsWallet) - ToStakingRewardsWallet) | |
379 | 400 | if (isNationReservedAsset(strAssetType, Level)) | |
380 | 401 | then if (if (!(checkAssetOwner(toString(i.caller), NationKey))) | |
381 | 402 | then !(checkAdmin(i.caller)) | |
382 | 403 | else false) | |
383 | 404 | then throw("You are not the owner of the nation") | |
384 | 405 | else { | |
385 | 406 | let nationsheg = treasuryTryGetInteger(getTreasuryKey(NationKey)) | |
386 | 407 | if ((assetBuildCost > nationsheg)) | |
387 | 408 | then throw("The nation hasn't enough funds") | |
388 | 409 | else { | |
389 | 410 | let d = invoke(Address(treasuryAddress), "decreaseNationWallet", [NationKey, assetBuildCost], nil) | |
390 | 411 | match d { | |
391 | 412 | case r: Int => | |
392 | 413 | let pw = invoke(Address(treasuryAddress), "arbitraryAddCoins", [NationKey, UnitStakeSheg], nil) | |
393 | 414 | match pw { | |
394 | 415 | case b: Int => | |
395 | 416 | let transfer = invoke(Address(treasuryAddress), "distributeNationPayRewards", [assetBuildCost], nil) | |
396 | 417 | match transfer { | |
397 | 418 | case t: Int => | |
398 | 419 | [StringEntry(getBuildingStatusKey(toString(i.originCaller), i.transactionId, cnfgKey), BuildStarted), StringEntry(getAssetOwnerKey(i.transactionId, cnfgKey), NationKey), IntegerEntry(getBuildingFinishHeightKey(toString(i.originCaller), i.transactionId, cnfgKey), (height + delayForBuilding))] | |
399 | 420 | case _ => | |
400 | 421 | throw("Error Distributing asset rewards") | |
401 | 422 | } | |
402 | 423 | case _ => | |
403 | 424 | throw("Error Depositing nation funds") | |
404 | 425 | } | |
405 | 426 | case _ => | |
406 | 427 | throw("Error Depositing nation funds") | |
407 | 428 | } | |
408 | 429 | } | |
409 | 430 | } | |
410 | 431 | else { | |
411 | 432 | let assetSac = confTryGetString((cnfgKey + "_SacrificeAsset")) | |
412 | 433 | if ((assetSac != "")) | |
413 | 434 | then [DeleteEntry(SacrificeKey), DeleteEntry((SacrificeKey + "_Owner")), StringEntry(getBuildingStatusKey(toString(i.originCaller), i.transactionId, cnfgKey), BuildStarted), StringEntry(getAssetOwnerKey(i.transactionId, cnfgKey), toString(i.originCaller)), IntegerEntry(getBuildingFinishHeightKey(toString(i.originCaller), i.transactionId, cnfgKey), (height + delayForBuilding))] | |
414 | 435 | else { | |
415 | 436 | let amountIn = value(i.payments[0].amount) | |
416 | 437 | if ((assetBuildCost > amountIn)) | |
417 | 438 | then throw(("You provided less $heg than the needed cost for building this " + strAssetType)) | |
418 | 439 | else if ((i.payments[0].assetId != shinywggid)) | |
419 | 440 | then throw("Only $HEG payments allowed") | |
420 | 441 | else { | |
421 | 442 | let pw = invoke(Address(treasuryAddress), "Deposit", nil, [AttachedPayment(shinywggid, UnitStakeSheg)]) | |
422 | 443 | match pw { | |
423 | 444 | case r: Int => | |
424 | 445 | [StringEntry(getBuildingStatusKey(toString(i.originCaller), i.transactionId, cnfgKey), BuildStarted), StringEntry(getAssetOwnerKey(i.transactionId, cnfgKey), toString(i.originCaller)), IntegerEntry(getBuildingFinishHeightKey(toString(i.originCaller), i.transactionId, cnfgKey), (height + delayForBuilding)), ScriptTransfer(adminWallet, ToAdminWallet, shinywggid), ScriptTransfer(dailyGameRewardsWallet, ToGameRewardsWallet, shinywggid), ScriptTransfer(dailyStakingRewardsWallet, ToStakingRewardsWallet, shinywggid)] | |
425 | 446 | case _ => | |
426 | 447 | throw("Incorrect invoke result") | |
427 | 448 | } | |
428 | 449 | } | |
429 | 450 | } | |
430 | 451 | } | |
431 | 452 | } | |
432 | 453 | ||
433 | 454 | ||
434 | 455 | ||
435 | 456 | @Callable(i) | |
436 | 457 | func FinishBuild (txIdStr,assetStr,Level,NationKey) = { | |
437 | 458 | let txId = fromBase58String(txIdStr) | |
438 | 459 | let ALKey = getALKey(assetStr, Level) | |
439 | 460 | let BuildingStatusKey = getBuildingStatusKey(toString(i.caller), txId, ALKey) | |
440 | 461 | let finishHeightKey = getBuildingFinishHeightKey(toString(i.caller), txId, ALKey) | |
441 | 462 | let assetKey = getAssetIdKey(txId, ALKey) | |
442 | 463 | let assetOwner = tryGetString(getAssetOwnerKey(txId, ALKey)) | |
443 | 464 | if (isNationReservedAsset(assetStr, Level)) | |
444 | 465 | then if (if (!(checkAssetOwner(toString(i.caller), NationKey))) | |
445 | 466 | then !(checkAdmin(i.caller)) | |
446 | 467 | else false) | |
447 | 468 | then throw("You are not authorized to perform this operation") | |
448 | 469 | else internalFinishBuild(NationKey, ALKey, assetKey, BuildingStatusKey, finishHeightKey, txId) | |
449 | 470 | else if ((assetOwner != toString(i.caller))) | |
450 | 471 | then throw(("You cannot claim other's players " + assetStr)) | |
451 | 472 | else { | |
452 | 473 | let buildingTxStatus = tryGetString(BuildingStatusKey) | |
453 | 474 | if ((buildingTxStatus == "")) | |
454 | 475 | then throw("No pending operations for this asset") | |
455 | 476 | else { | |
456 | 477 | let assetSac = confTryGetString((ALKey + "_SacrificeAsset")) | |
457 | 478 | let assetSacLevel = confTryGetInteger((ALKey + "_SacrificeAssetLevel")) | |
458 | 479 | if ((assetSac != "")) | |
459 | 480 | then internalSacrificeFinishBuild(toString(i.caller), ALKey, assetKey, BuildingStatusKey, finishHeightKey, txId, getALKey(assetSac, assetSacLevel)) | |
460 | 481 | else internalFinishBuild(toString(i.caller), ALKey, assetKey, BuildingStatusKey, finishHeightKey, txId) | |
461 | 482 | } | |
462 | 483 | } | |
463 | 484 | } | |
464 | 485 | ||
465 | 486 | ||
466 | 487 | ||
467 | 488 | @Callable(i) | |
468 | 489 | func transferOwnership (assetId,newOwner,qty) = if (!(checkAdmin(i.caller))) | |
469 | 490 | then throw("Only the admin can perform this operation") | |
470 | 491 | else $Tuple2(internalTrasnferOwnership(assetId, newOwner, qty), newOwner) | |
471 | 492 | ||
472 | 493 | ||
473 | 494 | ||
474 | 495 | @Callable(i) | |
475 | 496 | func destroyAssetAndTransfer (assetId,qty,toAddress) = { | |
476 | 497 | let chunks = getAssetTypeLevel(assetId) | |
477 | 498 | let strAssetType = chunks._1 | |
478 | 499 | let level = chunks._2 | |
479 | 500 | let k = getALKey(strAssetType, level) | |
480 | 501 | if (!(checkAdmin(i.caller))) | |
481 | 502 | then throw("Only the admin can perform this operation") | |
482 | 503 | else { | |
483 | 504 | let oldOwner = tryGetString(getAssetOwnerKeyString(assetId)) | |
484 | 505 | let assetCoins = tryGetInteger(assetId) | |
485 | 506 | let currentPower = nationsTryGetInteger((oldOwner + "_Power")) | |
486 | 507 | let assetPower = confTryGetInteger((k + "_Power")) | |
487 | 508 | if (confTryGetBoolean((k + "_Aggregated"))) | |
488 | 509 | then { | |
489 | 510 | let unitAssetCoins = ((confTryGetInteger((k + "_Cost")) * 20) / 100) | |
490 | - | let qtyAsset = tryGetInteger((k + "_Qty")) | |
511 | + | let achunks = split(assetId, "_") | |
512 | + | let aoldOwner = achunks[2] | |
513 | + | let qtyAsset = tryGetInteger((assetId + "_Qty")) | |
491 | 514 | if ((0 > (qtyAsset - qty))) | |
492 | 515 | then throw(("you don't have enough " + strAssetType)) | |
493 | 516 | else { | |
494 | - | let pw = invoke(Address(nationsAddress), "setUserPower", [ | |
517 | + | let pw = invoke(Address(nationsAddress), "setUserPower", [aoldOwner, (currentPower - (assetPower * qty))], nil) | |
495 | 518 | match pw { | |
496 | 519 | case r: Int => | |
497 | 520 | let attackers = split(toAddress, "#") | |
498 | 521 | let dist = { | |
499 | 522 | let $l = attackers | |
500 | 523 | let $s = size($l) | |
501 | 524 | let $acc0 = nil | |
502 | 525 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
503 | 526 | then $a | |
504 | 527 | else distribDestroyRewards($a, $l[$i]) | |
505 | 528 | ||
506 | 529 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
507 | 530 | then $a | |
508 | 531 | else throw("List size exceeds 50") | |
509 | 532 | ||
510 | 533 | $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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50) | |
511 | 534 | } | |
512 | 535 | if ((dist == dist)) | |
513 | 536 | then if (((qtyAsset - qty) > 0)) | |
514 | - | then [IntegerEntry(( | |
537 | + | then [IntegerEntry((assetId + "_Qty"), (qtyAsset - qty))] | |
515 | 538 | else [DeleteEntry(assetId), DeleteEntry(getAssetOwnerKeyString(assetId))] | |
516 | 539 | else throw("Strict value is not equal to itself.") | |
517 | 540 | case _ => | |
518 | 541 | throw("Error setting user power") | |
519 | 542 | } | |
520 | 543 | } | |
521 | 544 | } | |
522 | 545 | else { | |
523 | 546 | let attackers = split(toAddress, "#") | |
524 | 547 | let dist = { | |
525 | 548 | let $l = attackers | |
526 | 549 | let $s = size($l) | |
527 | 550 | let $acc0 = nil | |
528 | 551 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
529 | 552 | then $a | |
530 | 553 | else distribDestroyRewards($a, $l[$i]) | |
531 | 554 | ||
532 | 555 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
533 | 556 | then $a | |
534 | 557 | else throw("List size exceeds 50") | |
535 | 558 | ||
536 | 559 | $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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50) | |
537 | 560 | } | |
538 | 561 | if ((dist == dist)) | |
539 | 562 | then { | |
540 | 563 | let pw = invoke(Address(nationsAddress), "setUserPower", [oldOwner, (currentPower - assetPower)], nil) | |
541 | 564 | if ((pw == pw)) | |
542 | 565 | then match pw { | |
543 | 566 | case r: Int => | |
544 | 567 | [DeleteEntry(assetId), DeleteEntry(getAssetOwnerKeyString(assetId))] | |
545 | 568 | case _ => | |
546 | 569 | throw("Error setting user power") | |
547 | 570 | } | |
548 | 571 | else throw("Strict value is not equal to itself.") | |
549 | 572 | } | |
550 | 573 | else throw("Strict value is not equal to itself.") | |
551 | 574 | } | |
552 | 575 | } | |
553 | 576 | } | |
554 | 577 | ||
555 | 578 | ||
556 | 579 | ||
557 | 580 | @Callable(i) | |
558 | 581 | func destroyAssetFromUser (assetId,qty) = { | |
559 | 582 | let chunks = getAssetTypeLevel(assetId) | |
560 | 583 | let strAssetType = chunks._1 | |
561 | 584 | let level = chunks._2 | |
562 | 585 | let k = getALKey(strAssetType, level) | |
563 | 586 | if (!(checkAssetOwner(toString(i.caller), assetId))) | |
564 | 587 | then throw("You don't own this asset") | |
565 | 588 | else { | |
566 | 589 | let assetCoins = tryGetInteger(assetId) | |
567 | 590 | let currentPower = nationsTryGetInteger((toString(i.caller) + "_Power")) | |
568 | 591 | let assetPower = confTryGetInteger((k + "_Power")) | |
569 | 592 | if (confTryGetBoolean((k + "_Aggregated"))) | |
570 | 593 | then { | |
571 | 594 | let unitAssetCoins = ((confTryGetInteger((k + "_Cost")) * 20) / 100) | |
572 | - | let qtyAsset = tryGetInteger((k + "_Qty")) | |
595 | + | let aggrAssetkey = ((k + "_") + toString(i.caller)) | |
596 | + | let qtyAsset = tryGetInteger((aggrAssetkey + "_Qty")) | |
573 | 597 | if ((0 > (qtyAsset - qty))) | |
574 | 598 | then throw(("you don't have enough " + strAssetType)) | |
575 | 599 | else { | |
576 | 600 | let pw = invoke(Address(nationsAddress), "setUserPower", [toString(i.caller), (currentPower - (assetPower * qty))], nil) | |
577 | 601 | match pw { | |
578 | 602 | case r: Int => | |
579 | 603 | let tr = invoke(Address(treasuryAddress), "adminTransfer", [toString(i.caller), (unitAssetCoins * qty)], nil) | |
580 | 604 | match tr { | |
581 | 605 | case t: Int => | |
582 | - | if (((qtyAsset - qty) > 0)) | |
583 | - | then [IntegerEntry((k + "_Qty"), (qtyAsset - qty))] | |
584 | - | else [DeleteEntry(assetId), DeleteEntry(getAssetOwnerKeyString(assetId))] | |
606 | + | [IntegerEntry((aggrAssetkey + "_Qty"), (qtyAsset - qty))] | |
585 | 607 | case _ => | |
586 | 608 | throw("Error transferring coins") | |
587 | 609 | } | |
588 | 610 | case _ => | |
589 | 611 | throw("Error setting user power") | |
590 | 612 | } | |
591 | 613 | } | |
592 | 614 | } | |
593 | 615 | else { | |
594 | 616 | let pw = invoke(Address(nationsAddress), "setUserPower", [toString(i.caller), (currentPower - assetPower)], nil) | |
595 | 617 | match pw { | |
596 | 618 | case r: Int => | |
597 | 619 | let tr = invoke(Address(treasuryAddress), "adminTransfer", [toString(i.caller), assetCoins], nil) | |
598 | 620 | match tr { | |
599 | 621 | case t: Int => | |
600 | 622 | [DeleteEntry(assetId), DeleteEntry(getAssetOwnerKeyString(assetId))] | |
601 | 623 | case _ => | |
602 | 624 | throw("Error transferring coins") | |
603 | 625 | } | |
604 | 626 | case _ => | |
605 | 627 | throw("Error setting user power") | |
606 | 628 | } | |
607 | 629 | } | |
608 | 630 | } | |
609 | 631 | } | |
610 | 632 | ||
611 | 633 | ||
612 | 634 | ||
613 | 635 | @Callable(i) | |
614 | 636 | func setNationOwner (nationKey,newOwner) = if (checkAdmin(i.caller)) | |
615 | 637 | then $Tuple2([StringEntry((nationKey + "_Owner"), newOwner)], true) | |
616 | 638 | else { | |
617 | 639 | let currentOwner = tryGetString((nationKey + "_Owner")) | |
618 | 640 | if ((currentOwner != toString(i.caller))) | |
619 | 641 | then throw("You are not the nation owner") | |
620 | 642 | else [StringEntry((nationKey + "_Owner"), newOwner)] | |
621 | 643 | } | |
622 | 644 | ||
623 | 645 | ||
624 | 646 | ||
625 | 647 | @Callable(i) | |
626 | 648 | func buyNationItem (assetId,NationKey) = { | |
627 | 649 | let chunks = getAssetTypeLevel(assetId) | |
628 | 650 | let strAssetType = chunks._1 | |
629 | 651 | let level = chunks._2 | |
630 | 652 | let k = getALKey(strAssetType, level) | |
631 | 653 | let n = nationsTryGetInteger(toString(i.caller)) | |
632 | 654 | let nid = nationsTryGetInteger(NationKey) | |
633 | 655 | if ((n != nid)) | |
634 | 656 | then throw("you can buy assets only from your nation") | |
635 | 657 | else if (!(checkAssetOwner(NationKey, assetId))) | |
636 | 658 | then throw("The asset does not belong to the nation") | |
637 | 659 | else if (!(isNationReservedAsset(strAssetType, level))) | |
638 | 660 | then throw("this asset cannot be sold by the nation") | |
639 | 661 | else { | |
640 | 662 | let assetPrice = confTryGetInteger((getALKey(strAssetType, level) + "_SellPrice")) | |
641 | 663 | let amountIn = value(i.payments[0].amount) | |
642 | 664 | if ((assetPrice > amountIn)) | |
643 | 665 | then throw(("You provided less $heg than the needed cost for buying this " + strAssetType)) | |
644 | 666 | else if ((i.payments[0].assetId != shinywggid)) | |
645 | 667 | then throw("Only $HEG payments allowed") | |
646 | 668 | else { | |
647 | 669 | let a = invoke(Address(treasuryAddress), "increaseNationWallet", [NationKey, amountIn], nil) | |
648 | 670 | match a { | |
649 | 671 | case b: Int => | |
650 | 672 | (internalTrasnferOwnership(assetId, toString(i.caller), 1) :+ ScriptTransfer(Address(treasuryAddress), amountIn, shinywggid)) | |
651 | 673 | case _ => | |
652 | 674 | throw("Error transferring SHEG to nations wallet") | |
653 | 675 | } | |
654 | 676 | } | |
655 | 677 | } | |
656 | 678 | } | |
657 | 679 | ||
658 | 680 | ||
659 | 681 | ||
660 | 682 | @Callable(i) | |
661 | - | func AddAssetFromMarkeplace (assetId,oldOwner,assetSheg) = if (!(checkAdmin(i.caller))) | |
662 | - | then throw("You are not allowed to perform this operation") | |
663 | - | else $Tuple2([StringEntry(getAssetOwnerKeyString(assetId), oldOwner), IntegerEntry(assetId, assetSheg)], oldOwner) | |
683 | + | func AddAssetFromMarkeplace (assetId,oldOwner,assetSheg) = { | |
684 | + | let chunks = getAssetTypeLevel(assetId) | |
685 | + | let strAssetType = chunks._1 | |
686 | + | let level = chunks._2 | |
687 | + | let k = getALKey(strAssetType, level) | |
688 | + | let currentPower = nationsTryGetInteger((toString(i.caller) + "_Power")) | |
689 | + | let assetPower = confTryGetInteger((k + "_Power")) | |
690 | + | if (!(checkAdmin(i.caller))) | |
691 | + | then throw("You are not allowed to perform this operation") | |
692 | + | else if (confTryGetBoolean((k + "_Aggregated"))) | |
693 | + | then { | |
694 | + | let achunks = split(assetId, "_") | |
695 | + | let aoldOwner = achunks[2] | |
696 | + | IncreaseAggregatedAsset(assetId, aoldOwner, 1) | |
697 | + | } | |
698 | + | else $Tuple2([StringEntry(getAssetOwnerKeyString(assetId), oldOwner), IntegerEntry(assetId, assetSheg)], oldOwner) | |
699 | + | } | |
664 | 700 | ||
665 | 701 | ||
666 | 702 | ||
667 | 703 | @Callable(i) | |
668 | - | func TransferAssetToMarketplace (assetId,sellprice) = if (!(checkAssetOwner(toString(i.caller), assetId))) | |
669 | - | then throw("You are not the owner of this asset") | |
670 | - | else { | |
671 | - | let assetSheg = tryGetInteger(assetId) | |
672 | - | let tr = invoke(Address(marketplaceAddress), "putOnSale", [assetId, assetSheg, sellprice], nil) | |
673 | - | match tr { | |
674 | - | case t: Int => | |
704 | + | func TransferAssetToMarketplace (assetId,sellprice) = { | |
705 | + | let chunks = getAssetTypeLevel(assetId) | |
706 | + | let strAssetType = chunks._1 | |
707 | + | let level = chunks._2 | |
708 | + | let k = getALKey(strAssetType, level) | |
709 | + | let currentPower = nationsTryGetInteger((toString(i.caller) + "_Power")) | |
710 | + | let assetPower = confTryGetInteger((k + "_Power")) | |
711 | + | let assetSheg = tryGetInteger(assetId) | |
712 | + | if (!(checkAssetOwner(toString(i.caller), assetId))) | |
713 | + | then throw("You are not the owner of this asset") | |
714 | + | else if (confTryGetBoolean((k + "_Aggregated"))) | |
715 | + | then { | |
716 | + | let achunks = split(assetId, "_") | |
717 | + | let oldOwner = achunks[2] | |
718 | + | let tr = invoke(Address(marketplaceAddress), "putOnSale", [assetId, assetSheg, sellprice], nil) | |
719 | + | match tr { | |
720 | + | case t: Int => | |
721 | + | DecreaseAggregatedAsset(assetId, oldOwner, 1) | |
722 | + | case _ => | |
723 | + | throw("Error putting the item on the marketplace") | |
724 | + | } | |
725 | + | } | |
726 | + | else { | |
727 | + | let tr = invoke(Address(marketplaceAddress), "putOnSale", [assetId, assetSheg, sellprice], nil) | |
728 | + | match tr { | |
729 | + | case t: Int => | |
675 | 730 | [DeleteEntry(getAssetOwnerKeyString(assetId)), DeleteEntry(assetId)] | |
676 | - | case _ => | |
677 | - | throw("Error putting the item on the marketplace") | |
678 | - | } | |
679 | - | } | |
731 | + | case _ => | |
732 | + | throw("Error putting the item on the marketplace") | |
733 | + | } | |
734 | + | } | |
735 | + | } | |
680 | 736 | ||
681 | 737 | ||
682 | 738 | ||
683 | 739 | @Callable(i) | |
684 | 740 | func DelKey (key) = if (!(checkAdmin(i.caller))) | |
685 | 741 | then throw("") | |
686 | 742 | else [DeleteEntry(key)] | |
687 | 743 | ||
688 | 744 | ||
689 | 745 | ||
690 | 746 | @Callable(i) | |
691 | 747 | func UpdKey (key,val) = if (!(checkAdmin(i.caller))) | |
692 | 748 | then throw("") | |
693 | 749 | else [StringEntry(key, val)] | |
694 | 750 | ||
695 | 751 |
github/deemru/w8io/026f985 105.01 ms ◑