tx · AyvHf53oAhd9xGmjEpdmTPbpRPDdc5VkPoxrs5NMKyvo 3MvXnAcEtL9x3i499UcvTQZPufrT5ZZUEd5: -0.01300000 Waves 2022.09.12 17:24 [2226003] smart account 3MvXnAcEtL9x3i499UcvTQZPufrT5ZZUEd5 > SELF 0.00000000 Waves
{ "type": 13, "id": "AyvHf53oAhd9xGmjEpdmTPbpRPDdc5VkPoxrs5NMKyvo", "fee": 1300000, "feeAssetId": null, "timestamp": 1662992757619, "version": 1, "sender": "3MvXnAcEtL9x3i499UcvTQZPufrT5ZZUEd5", "senderPublicKey": "GSAhb4fdky75LiCZ4p4DDK4rmWpmsgGBg1ZVdtPfmRES", "proofs": [ "23LQ58Px8DsL2FV6vDyH6KXnS3ZJ3agBSKSBLi8r9k7csQr3docmS4UFvh9dNG3EBvFQbCw2h6S4syuvZHRLSox2" ], "script": "base64:BgImCAISCgoICAgBAQEBAQESAwoBCBIECgIICBIFCgMICAESBAoCCAgPARNrZXlNYW5hZ2VyUHVibGljS2V5AAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBF2NvbGxlY3RXaXRoZHJhd0RlbGF5S2V5AgZhc3NldEEGYXNzZXRCCQC5CQIJAMwIAgIVJXMlcyVzX193aXRoZHJhd0RlbGF5CQDMCAIFBmFzc2V0QQkAzAgCBQZhc3NldEIFA25pbAICX18BHGNvbGxlY3REZXBvc2l0RmVlUGVybWlsbGVLZXkCBmFzc2V0QQZhc3NldEIJALkJAgkAzAgCAholcyVzJXNfX2RlcG9zaXRGZWVQZXJtaWxsZQkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCBQNuaWwCAl9fAR1jb2xsZWN0V2l0aGRyYXdGZWVQZXJtaWxsZUtleQIGYXNzZXRBBmFzc2V0QgkAuQkCCQDMCAICGyVzJXMlc19fd2l0aGRyYXdGZWVQZXJtaWxsZQkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCBQNuaWwCAl9fARpjb2xsZWN0TWluQW1vdW50RGVwb3NpdEtleQIGYXNzZXRBBmFzc2V0QgkAuQkCCQDMCAICGCVzJXMlc19fbWluQW1vdW50RGVwb3NpdAkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCBQNuaWwCAl9fARpjb2xsZWN0QXNzZXRzUGFpclN0YXR1c0tleQIGYXNzZXRBBmFzc2V0QgkAuQkCCQDMCAICGCVzJXMlc19fYXNzZXRzUGFpclN0YXR1cwkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCBQNuaWwCAl9fARtjb2xsZWN0TWluQW1vdW50V2l0aGRyYXdLZXkCBmFzc2V0QQZhc3NldEIJALkJAgkAzAgCAhklcyVzJXNfX21pbkFtb3VudFdpdGhkcmF3CQDMCAIFBmFzc2V0QQkAzAgCBQZhc3NldEIFA25pbAICX18BEWNvbGxlY3RCYWxhbmNlS2V5AwZhc3NldEEGYXNzZXRCC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIRJXMlcyVzJXNfX2JhbGFuY2UJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgJfXwEqY29sbGVjdFRvdGFsQ29tbWlzc2lvbnNDb2xsZWN0ZWREZXBvc2l0S2V5AgZhc3NldEEGYXNzZXRCCQC5CQIJAMwIAgIsJXMlcyVzJXNfX3RvdGFsQ29tbWlzc2lvbnNDb2xsZWN0ZWRfX2RlcG9zaXQJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgUDbmlsAgJfXwErY29sbGVjdFRvdGFsQ29tbWlzc2lvbnNDb2xsZWN0ZWRXaXRoZHJhd0tleQIGYXNzZXRBBmFzc2V0QgkAuQkCCQDMCAICLSVzJXMlcyVzX190b3RhbENvbW1pc3Npb25zQ29sbGVjdGVkX193aXRoZHJhdwkAzAgCBQZhc3NldEEJAMwIAgUGYXNzZXRCBQNuaWwCAl9fARdjb2xsZWN0QXNzZXRMb2NrVGltZUtleQMGYXNzZXRBBmFzc2V0Qgt1c2VyQWRkcmVzcwkAuQkCCQDMCAICFyVzJXMlcyVzX19hc3NldExvY2tUaW1lCQDMCAIFBmFzc2V0QQkAzAgCBQZhc3NldEIJAMwIAgULdXNlckFkZHJlc3MFA25pbAICX18BG2NvbGxlY3RQcm9jZXNzSW5Qcm9ncmVzc0tleQQLdXNlckFkZHJlc3MGYXNzZXRBBmFzc2V0QgtoZWlnaHRJbktleQkAuQkCCQDMCAICJSVzJXMlcyVzX193aXRoZHJhd1Byb2Nlc3NfX2luUHJvZ3Jlc3MJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUGYXNzZXRBCQDMCAIFBmFzc2V0QgkAzAgCCQCkAwEFC2hlaWdodEluS2V5BQNuaWwCAl9fARVjb2xsZWN0UHJvY2Vzc0RvbmVLZXkEC3VzZXJBZGRyZXNzBmFzc2V0QQZhc3NldEILaGVpZ2h0SW5LZXkJALkJAgkAzAgCAh8lcyVzJXMlc19fd2l0aGRyYXdQcm9jZXNzX19kb25lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFBmFzc2V0QQkAzAgCBQZhc3NldEIJAMwIAgkApAMBBQtoZWlnaHRJbktleQUDbmlsAgJfXwEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkEAnBkCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yBQFpAQ1yZWdpc3RlckFzc2V0CAZhc3NldEEGYXNzZXRCDXdpdGhkcmF3RGVsYXkKZGVwb3NpdEZlZQt3aXRoZHJhd0ZlZRBtaW5BbW91bnREZXBvc2l0EW1pbkFtb3VudFdpdGhkcmF3CnBhaXJTdGF0dXMEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQQd2l0aGRyYXdEZWxheUtleQkBF2NvbGxlY3RXaXRoZHJhd0RlbGF5S2V5AgUGYXNzZXRBBQZhc3NldEIEFWRlcG9zaXRGZWVQZXJtaWxsZUtleQkBHGNvbGxlY3REZXBvc2l0RmVlUGVybWlsbGVLZXkCBQZhc3NldEEFBmFzc2V0QgQWd2l0aGRyYXdGZWVQZXJtaWxsZUtleQkBHWNvbGxlY3RXaXRoZHJhd0ZlZVBlcm1pbGxlS2V5AgUGYXNzZXRBBQZhc3NldEIEE21pbkFtb3VudERlcG9zaXRLZXkJARpjb2xsZWN0TWluQW1vdW50RGVwb3NpdEtleQIFBmFzc2V0QQUGYXNzZXRCBBRtaW5BbW91bnRXaXRoZHJhd0tleQkBG2NvbGxlY3RNaW5BbW91bnRXaXRoZHJhd0tleQIFBmFzc2V0QQUGYXNzZXRCBA1wYWlyU3RhdHVzS2V5CQEaY29sbGVjdEFzc2V0c1BhaXJTdGF0dXNLZXkCBQZhc3NldEEFBmFzc2V0QgkAzAgCCQEMSW50ZWdlckVudHJ5AgUQd2l0aGRyYXdEZWxheUtleQUNd2l0aGRyYXdEZWxheQkAzAgCCQEMSW50ZWdlckVudHJ5AgUVZGVwb3NpdEZlZVBlcm1pbGxlS2V5BQpkZXBvc2l0RmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZ3aXRoZHJhd0ZlZVBlcm1pbGxlS2V5BQt3aXRoZHJhd0ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUTbWluQW1vdW50RGVwb3NpdEtleQUQbWluQW1vdW50RGVwb3NpdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUbWluQW1vdW50V2l0aGRyYXdLZXkFEW1pbkFtb3VudFdpdGhkcmF3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1wYWlyU3RhdHVzS2V5BQpwYWlyU3RhdHVzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOc3dhcEFzc2V0c0FUb0IBBmFzc2V0QgQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAZhc3NldEEJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBBBtaW5BbW91bnREZXBvc2l0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBGmNvbGxlY3RNaW5BbW91bnREZXBvc2l0S2V5AgUGYXNzZXRBBQZhc3NldEICH1RoaXMgYXNzZXQgcGFpciBkb2VzIG5vdCBleGlzdC4ECXRvRGVwb3NpdAgFB3BheW1lbnQGYW1vdW50BBVkZXBvc2l0RmVlUGVybWlsbGVLZXkJARxjb2xsZWN0RGVwb3NpdEZlZVBlcm1pbGxlS2V5AgUGYXNzZXRBBQZhc3NldEIECmRlcG9zaXRGZWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVZGVwb3NpdEZlZVBlcm1pbGxlS2V5AAAEA2ZlZQkAaAIJAGkCBQl0b0RlcG9zaXQA6AcFCmRlcG9zaXRGZWUEEmN1cnJlbnRVc2VyQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQERY29sbGVjdEJhbGFuY2VLZXkDBQZhc3NldEEFBmFzc2V0QgULdXNlckFkZHJlc3MAAAQQdG90YWxDb21taXNzaW9ucwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEqY29sbGVjdFRvdGFsQ29tbWlzc2lvbnNDb2xsZWN0ZWREZXBvc2l0S2V5AgUGYXNzZXRBBQZhc3NldEIAAAQFYXNzZXQJANkEAQkBBXZhbHVlAQUGYXNzZXRCAwkBAiE9AgkBBXZhbHVlAQkAnwgBCQEaY29sbGVjdEFzc2V0c1BhaXJTdGF0dXNLZXkCBQZhc3NldEEFBmFzc2V0QgAACQACAQIgVGhlIGNvdXBsZSdzIGRlcG9zaXQgaXMgYmxvY2tlZC4DCQBmAgUQbWluQW1vdW50RGVwb3NpdAgFB3BheW1lbnQGYW1vdW50CQACAQIlU3dhcCBhbW91bnQgZmFpbCwgYW1vdW50IGlzIHRvIHNtYWxsLgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWNvbGxlY3RCYWxhbmNlS2V5AwUGYXNzZXRBBQZhc3NldEIFC3VzZXJBZGRyZXNzCQBlAgkAZAIFEmN1cnJlbnRVc2VyQmFsYW5jZQgFB3BheW1lbnQGYW1vdW50BQNmZWUJAMwIAgkBDEludGVnZXJFbnRyeQIJASpjb2xsZWN0VG90YWxDb21taXNzaW9uc0NvbGxlY3RlZERlcG9zaXRLZXkCBQZhc3NldEEFBmFzc2V0QgkAZAIFEHRvdGFsQ29tbWlzc2lvbnMFA2ZlZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCXRvRGVwb3NpdAUFYXNzZXQFA25pbAFpARxpbml0aWFsaXphdGlvblN3YXBBc3NldHNCVG9BAgZhc3NldEEGYXNzZXRCBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAgFB3BheW1lbnQGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEEG1pbkFtb3VudERlcG9zaXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQEbY29sbGVjdE1pbkFtb3VudFdpdGhkcmF3S2V5AgUGYXNzZXRBBQZhc3NldEICH1RoaXMgYXNzZXQgcGFpciBkb2VzIG5vdCBleGlzdC4ED2Fzc2V0TG9ja0hlaWdodAkAZAIFBmhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEXY29sbGVjdFdpdGhkcmF3RGVsYXlLZXkCBQZhc3NldEEFBmFzc2V0QgAABBJjdXJyZW50VXNlckJhbGFuY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQERY29sbGVjdEJhbGFuY2VLZXkDBQZhc3NldEEFBmFzc2V0QgULdXNlckFkZHJlc3MCIVRoaXMgdXNlciBiYWxhbmNlIGRvZXMgbm90IGV4aXN0LgQQdG90YWxDb21taXNzaW9ucwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEqY29sbGVjdFRvdGFsQ29tbWlzc2lvbnNDb2xsZWN0ZWREZXBvc2l0S2V5AgUGYXNzZXRBBQZhc3NldEIAAAQWd2l0aGRyYXdGZWVQZXJtaWxsZUtleQkBHWNvbGxlY3RXaXRoZHJhd0ZlZVBlcm1pbGxlS2V5AgUGYXNzZXRBBQZhc3NldEIEC3dpdGhkcmF3RmVlCQELdmFsdWVPckVsc2UCCQCfCAEFFndpdGhkcmF3RmVlUGVybWlsbGVLZXkAAAQDZmVlCQBoAgkAaQIFBmFtb3VudADoBwULd2l0aGRyYXdGZWUJAMwIAgkBDEludGVnZXJFbnRyeQIJARdjb2xsZWN0QXNzZXRMb2NrVGltZUtleQMFBmFzc2V0QQUGYXNzZXRCBQt1c2VyQWRkcmVzcwUPYXNzZXRMb2NrSGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERY29sbGVjdEJhbGFuY2VLZXkDBQZhc3NldEEFBmFzc2V0QgULdXNlckFkZHJlc3MJAGUCCQBlAgUSY3VycmVudFVzZXJCYWxhbmNlBQZhbW91bnQFA2ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBG2NvbGxlY3RQcm9jZXNzSW5Qcm9ncmVzc0tleQQFC3VzZXJBZGRyZXNzBQZhc3NldEEFBmFzc2V0QgUPYXNzZXRMb2NrSGVpZ2h0CQBlAgUGYW1vdW50BQNmZWUJAMwIAgkBDEludGVnZXJFbnRyeQIJAStjb2xsZWN0VG90YWxDb21taXNzaW9uc0NvbGxlY3RlZFdpdGhkcmF3S2V5AgUGYXNzZXRBBQZhc3NldEIJAGQCBRB0b3RhbENvbW1pc3Npb25zBQNmZWUFA25pbAFpAQ13aXRoZHJhd0Fzc2V0AwZhc3NldEEGYXNzZXRCC2hlaWdodEluS2V5BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDWFzc2V0TG9ja1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBF2NvbGxlY3RBc3NldExvY2tUaW1lS2V5AwUGYXNzZXRBBQZhc3NldEIFC3VzZXJBZGRyZXNzAAAECnRvV2l0aGRyYXcJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBG2NvbGxlY3RQcm9jZXNzSW5Qcm9ncmVzc0tleQQFC3VzZXJBZGRyZXNzBQZhc3NldEEFBmFzc2V0QgULaGVpZ2h0SW5LZXkAAAQFYXNzZXQJANkEAQkBBXZhbHVlAQUGYXNzZXRBAwkAZgIFBmhlaWdodAUNYXNzZXRMb2NrVGltZQkAAgEJAKwCAgkArAICAh1XaXRoZHJhd2FsIGlzIHBvc3NpYmxlIGFmdGVyIAkApAMBBQtoZWlnaHRJbktleQImIGhlaWdodCBvciB5b3UgaGF2ZSBhbHJlYWR5IHdpdGhkcmF3bi4JAMwIAgkBC0RlbGV0ZUVudHJ5AQkBG2NvbGxlY3RQcm9jZXNzSW5Qcm9ncmVzc0tleQQFC3VzZXJBZGRyZXNzBQZhc3NldEEFBmFzc2V0QgULaGVpZ2h0SW5LZXkJAMwIAgkBDEludGVnZXJFbnRyeQIJARVjb2xsZWN0UHJvY2Vzc0RvbmVLZXkEBQt1c2VyQWRkcmVzcwUGYXNzZXRBBQZhc3NldEIFC2hlaWdodEluS2V5BQp0b1dpdGhkcmF3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERY29sbGVjdEJhbGFuY2VLZXkDBQZhc3NldEEFBmFzc2V0QgULdXNlckFkZHJlc3MFCnRvV2l0aGRyYXcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQp0b1dpdGhkcmF3BQVhc3NldAUDbmlsAWkBC3dpdGhkcmF3RmVlAgZhc3NldEEGYXNzZXRCBAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3RvV2l0aGRyYXdBCQELdmFsdWVPckVsc2UCCQCfCAEJASpjb2xsZWN0VG90YWxDb21taXNzaW9uc0NvbGxlY3RlZERlcG9zaXRLZXkCBQZhc3NldEEFBmFzc2V0QgAABA53aXRoZHJhd0Fzc2V0QQkA2QQBCQEFdmFsdWUBBQZhc3NldEEEC3RvV2l0aGRyYXdCCQELdmFsdWVPckVsc2UCCQCfCAEJAStjb2xsZWN0VG90YWxDb21taXNzaW9uc0NvbGxlY3RlZFdpdGhkcmF3S2V5AgUGYXNzZXRBBQZhc3NldEIAAAQOd2l0aGRyYXdBc3NldEIJANkEAQkBBXZhbHVlAQUGYXNzZXRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEqY29sbGVjdFRvdGFsQ29tbWlzc2lvbnNDb2xsZWN0ZWREZXBvc2l0S2V5AgUGYXNzZXRBBQZhc3NldEIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC3RvV2l0aGRyYXdBBQ53aXRoZHJhd0Fzc2V0QQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBK2NvbGxlY3RUb3RhbENvbW1pc3Npb25zQ29sbGVjdGVkV2l0aGRyYXdLZXkCBQZhc3NldEEFBmFzc2V0QgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULdG9XaXRoZHJhd0IFDndpdGhkcmF3QXNzZXRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXn8weC8", "chainId": 84, "height": 2226003, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: zW2PW8MLZuACT52u9w7FsurykWxCiXKPVPGd8EJSTnC Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | func keyManagerPublicKey () = "%s__managerPublicKey" | |
5 | + | ||
6 | + | ||
7 | + | func collectWithdrawDelayKey (assetA,assetB) = makeString(["%s%s%s__withdrawDelay", assetA, assetB], "__") | |
8 | + | ||
9 | + | ||
10 | + | func collectDepositFeePermilleKey (assetA,assetB) = makeString(["%s%s%s__depositFeePermille", assetA, assetB], "__") | |
11 | + | ||
12 | + | ||
13 | + | func collectWithdrawFeePermilleKey (assetA,assetB) = makeString(["%s%s%s__withdrawFeePermille", assetA, assetB], "__") | |
14 | + | ||
15 | + | ||
16 | + | func collectMinAmountDepositKey (assetA,assetB) = makeString(["%s%s%s__minAmountDeposit", assetA, assetB], "__") | |
17 | + | ||
18 | + | ||
19 | + | func collectAssetsPairStatusKey (assetA,assetB) = makeString(["%s%s%s__assetsPairStatus", assetA, assetB], "__") | |
20 | + | ||
21 | + | ||
22 | + | func collectMinAmountWithdrawKey (assetA,assetB) = makeString(["%s%s%s__minAmountWithdraw", assetA, assetB], "__") | |
23 | + | ||
24 | + | ||
25 | + | func collectBalanceKey (assetA,assetB,userAddress) = makeString(["%s%s%s%s__balance", assetA, assetB, userAddress], "__") | |
26 | + | ||
27 | + | ||
28 | + | func collectTotalCommissionsCollectedDepositKey (assetA,assetB) = makeString(["%s%s%s%s__totalCommissionsCollected__deposit", assetA, assetB], "__") | |
29 | + | ||
30 | + | ||
31 | + | func collectTotalCommissionsCollectedWithdrawKey (assetA,assetB) = makeString(["%s%s%s%s__totalCommissionsCollected__withdraw", assetA, assetB], "__") | |
32 | + | ||
33 | + | ||
34 | + | func collectAssetLockTimeKey (assetA,assetB,userAddress) = makeString(["%s%s%s%s__assetLockTime", assetA, assetB, userAddress], "__") | |
35 | + | ||
36 | + | ||
37 | + | func collectProcessInProgressKey (userAddress,assetA,assetB,heightInKey) = makeString(["%s%s%s%s__withdrawProcess__inProgress", userAddress, assetA, assetB, toString(heightInKey)], "__") | |
38 | + | ||
39 | + | ||
40 | + | func collectProcessDoneKey (userAddress,assetA,assetB,heightInKey) = makeString(["%s%s%s%s__withdrawProcess__done", userAddress, assetA, assetB, toString(heightInKey)], "__") | |
41 | + | ||
42 | + | ||
43 | + | func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) { | |
44 | + | case s: String => | |
45 | + | fromBase58String(s) | |
46 | + | case _: Unit => | |
47 | + | unit | |
48 | + | case _ => | |
49 | + | throw("Match error") | |
50 | + | } | |
51 | + | ||
52 | + | ||
53 | + | func mustManager (i) = { | |
54 | + | let pd = throw("Permission denied") | |
55 | + | match managerPublicKeyOrUnit() { | |
56 | + | case pk: ByteVector => | |
57 | + | if ((i.callerPublicKey == pk)) | |
58 | + | then true | |
59 | + | else pd | |
60 | + | case _: Unit => | |
61 | + | if ((i.caller == this)) | |
62 | + | then true | |
63 | + | else pd | |
64 | + | case _ => | |
65 | + | throw("Match error") | |
66 | + | } | |
67 | + | } | |
68 | + | ||
69 | + | ||
70 | + | @Callable(i) | |
71 | + | func registerAsset (assetA,assetB,withdrawDelay,depositFee,withdrawFee,minAmountDeposit,minAmountWithdraw,pairStatus) = { | |
72 | + | let checkCaller = mustManager(i) | |
73 | + | if ((checkCaller == checkCaller)) | |
74 | + | then { | |
75 | + | let withdrawDelayKey = collectWithdrawDelayKey(assetA, assetB) | |
76 | + | let depositFeePermilleKey = collectDepositFeePermilleKey(assetA, assetB) | |
77 | + | let withdrawFeePermilleKey = collectWithdrawFeePermilleKey(assetA, assetB) | |
78 | + | let minAmountDepositKey = collectMinAmountDepositKey(assetA, assetB) | |
79 | + | let minAmountWithdrawKey = collectMinAmountWithdrawKey(assetA, assetB) | |
80 | + | let pairStatusKey = collectAssetsPairStatusKey(assetA, assetB) | |
81 | + | [IntegerEntry(withdrawDelayKey, withdrawDelay), IntegerEntry(depositFeePermilleKey, depositFee), IntegerEntry(withdrawFeePermilleKey, withdrawFee), IntegerEntry(minAmountDepositKey, minAmountDeposit), IntegerEntry(minAmountWithdrawKey, minAmountWithdraw), IntegerEntry(pairStatusKey, pairStatus)] | |
82 | + | } | |
83 | + | else throw("Strict value is not equal to itself.") | |
84 | + | } | |
85 | + | ||
86 | + | ||
87 | + | ||
88 | + | @Callable(i) | |
89 | + | func swapAssetsAToB (assetB) = { | |
90 | + | let payment = value(i.payments[0]) | |
91 | + | let assetA = toBase58String(value(payment.assetId)) | |
92 | + | let userAddress = toString(i.caller) | |
93 | + | let minAmountDeposit = valueOrErrorMessage(getInteger(collectMinAmountDepositKey(assetA, assetB)), "This asset pair does not exist.") | |
94 | + | let toDeposit = payment.amount | |
95 | + | let depositFeePermilleKey = collectDepositFeePermilleKey(assetA, assetB) | |
96 | + | let depositFee = valueOrElse(getInteger(this, depositFeePermilleKey), 0) | |
97 | + | let fee = ((toDeposit / 1000) * depositFee) | |
98 | + | let currentUserBalance = valueOrElse(getInteger(collectBalanceKey(assetA, assetB, userAddress)), 0) | |
99 | + | let totalCommissions = valueOrElse(getInteger(collectTotalCommissionsCollectedDepositKey(assetA, assetB)), 0) | |
100 | + | let asset = fromBase58String(value(assetB)) | |
101 | + | if ((value(getInteger(collectAssetsPairStatusKey(assetA, assetB))) != 0)) | |
102 | + | then throw("The couple's deposit is blocked.") | |
103 | + | else if ((minAmountDeposit > payment.amount)) | |
104 | + | then throw("Swap amount fail, amount is to small.") | |
105 | + | else [IntegerEntry(collectBalanceKey(assetA, assetB, userAddress), ((currentUserBalance + payment.amount) - fee)), IntegerEntry(collectTotalCommissionsCollectedDepositKey(assetA, assetB), (totalCommissions + fee)), ScriptTransfer(i.caller, toDeposit, asset)] | |
106 | + | } | |
107 | + | ||
108 | + | ||
109 | + | ||
110 | + | @Callable(i) | |
111 | + | func initializationSwapAssetsBToA (assetA,assetB) = { | |
112 | + | let payment = value(i.payments[0]) | |
113 | + | let amount = payment.amount | |
114 | + | let userAddress = toString(i.caller) | |
115 | + | let minAmountDeposit = valueOrErrorMessage(getInteger(collectMinAmountWithdrawKey(assetA, assetB)), "This asset pair does not exist.") | |
116 | + | let assetLockHeight = (height + valueOrElse(getInteger(collectWithdrawDelayKey(assetA, assetB)), 0)) | |
117 | + | let currentUserBalance = valueOrErrorMessage(getInteger(collectBalanceKey(assetA, assetB, userAddress)), "This user balance does not exist.") | |
118 | + | let totalCommissions = valueOrElse(getInteger(collectTotalCommissionsCollectedDepositKey(assetA, assetB)), 0) | |
119 | + | let withdrawFeePermilleKey = collectWithdrawFeePermilleKey(assetA, assetB) | |
120 | + | let withdrawFee = valueOrElse(getInteger(withdrawFeePermilleKey), 0) | |
121 | + | let fee = ((amount / 1000) * withdrawFee) | |
122 | + | [IntegerEntry(collectAssetLockTimeKey(assetA, assetB, userAddress), assetLockHeight), IntegerEntry(collectBalanceKey(assetA, assetB, userAddress), ((currentUserBalance - amount) - fee)), IntegerEntry(collectProcessInProgressKey(userAddress, assetA, assetB, assetLockHeight), (amount - fee)), IntegerEntry(collectTotalCommissionsCollectedWithdrawKey(assetA, assetB), (totalCommissions + fee))] | |
123 | + | } | |
124 | + | ||
125 | + | ||
126 | + | ||
127 | + | @Callable(i) | |
128 | + | func withdrawAsset (assetA,assetB,heightInKey) = { | |
129 | + | let userAddress = toString(i.caller) | |
130 | + | let assetLockTime = valueOrElse(getInteger(collectAssetLockTimeKey(assetA, assetB, userAddress)), 0) | |
131 | + | let toWithdraw = valueOrElse(getInteger(collectProcessInProgressKey(userAddress, assetA, assetB, heightInKey)), 0) | |
132 | + | let asset = fromBase58String(value(assetA)) | |
133 | + | if ((height > assetLockTime)) | |
134 | + | then throw((("Withdrawal is possible after " + toString(heightInKey)) + " height or you have already withdrawn.")) | |
135 | + | else [DeleteEntry(collectProcessInProgressKey(userAddress, assetA, assetB, heightInKey)), IntegerEntry(collectProcessDoneKey(userAddress, assetA, assetB, heightInKey), toWithdraw), IntegerEntry(collectBalanceKey(assetA, assetB, userAddress), toWithdraw), ScriptTransfer(i.caller, toWithdraw, asset)] | |
136 | + | } | |
137 | + | ||
138 | + | ||
139 | + | ||
140 | + | @Callable(i) | |
141 | + | func withdrawFee (assetA,assetB) = { | |
142 | + | let checkCaller = mustManager(i) | |
143 | + | if ((checkCaller == checkCaller)) | |
144 | + | then { | |
145 | + | let toWithdrawA = valueOrElse(getInteger(collectTotalCommissionsCollectedDepositKey(assetA, assetB)), 0) | |
146 | + | let withdrawAssetA = fromBase58String(value(assetA)) | |
147 | + | let toWithdrawB = valueOrElse(getInteger(collectTotalCommissionsCollectedWithdrawKey(assetA, assetB)), 0) | |
148 | + | let withdrawAssetB = fromBase58String(value(assetB)) | |
149 | + | [IntegerEntry(collectTotalCommissionsCollectedDepositKey(assetA, assetB), 0), ScriptTransfer(i.caller, toWithdrawA, withdrawAssetA), IntegerEntry(collectTotalCommissionsCollectedWithdrawKey(assetA, assetB), 0), ScriptTransfer(i.caller, toWithdrawB, withdrawAssetB)] | |
150 | + | } | |
151 | + | else throw("Strict value is not equal to itself.") | |
152 | + | } | |
153 | + | ||
154 | + | ||
155 | + | @Verifier(tx) | |
156 | + | func verify () = { | |
157 | + | let targetPublicKey = match managerPublicKeyOrUnit() { | |
158 | + | case pk: ByteVector => | |
159 | + | pk | |
160 | + | case _: Unit => | |
161 | + | tx.senderPublicKey | |
162 | + | case _ => | |
163 | + | throw("Match error") | |
164 | + | } | |
165 | + | sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey) | |
166 | + | } | |
167 | + |
github/deemru/w8io/169f3d6 40.46 ms ◑