tx · EzydaTK6rzUmknGewLy9YWPQxjW3yL3SAZFYnmsB9YE9

3N5Z4dAWzfkEp4kNJZKQk6zf3uTVFFz5MFF:  -0.01500000 Waves

2024.04.02 12:03 [3044945] smart account 3N5Z4dAWzfkEp4kNJZKQk6zf3uTVFFz5MFF > SELF 0.00000000 Waves

{ "type": 13, "id": "EzydaTK6rzUmknGewLy9YWPQxjW3yL3SAZFYnmsB9YE9", "fee": 1500000, "feeAssetId": null, "timestamp": 1712048536447, "version": 2, "chainId": 84, "sender": "3N5Z4dAWzfkEp4kNJZKQk6zf3uTVFFz5MFF", "senderPublicKey": "8Vp8fmB3ZGVRre7Cw5j9z6qXo3yD8ohPQ6agZ9mtVY5E", "proofs": [ "23ZeF4BqFofjRPpg7wjt7m5SmfvbUMTiNZ2Rn8fSYpDuJJJBsSy4kRuhNrTD674Z4WtRfrJWoz3wfPyF7rQTXGNs" ], "script": "base64:BwIyCAISBgoEAQgICBIAEgMKAQgSBQoDAQgIEgMKAQESBQoDCAgIEgASABIDCgEIEgMKAQg6AAlTRVBBUkFUT1ICAl9fAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAApLRVlfU1RBVFVTAgZTVEFUVVMACEtFWV9JTklUAgRJTklUAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgAJS0VZX0NIQUlOAgVDSEFJTgAUS0VZX0dBVEVXQVlfQ09OVFJBQ1QCEEdBVEVXQVlfQ09OVFJBQ1QAE0tFWV9TV0FWRVNfQ09OVFJBQ1QCD1NXQVZFU19DT05UUkFDVAAQS0VZX1NXQVZFU19BU1NFVAIFQVNTRVQADEtFWV9SRVNFUlZFUwIIUkVTRVJWRVMADEZVTkNfREVQT1NJVAIHZGVwb3NpdAAXRlVOQ19SRVFVRVNUX1dJVEhEUkFXQUwCEXJlcXVlc3RXaXRoZHJhd2FsABdGVU5DX0VYRUNVVEVfV0lUSERSQVdBTAIRZXhlY3V0ZVdpdGhkcmF3YWwADUZVTkNfR0VUX1JBVEUCB2dldFJhdGUADUZVTkNfV0lUSERSQVcCCHdpdGhkcmF3AAVXQVZFUwIFV0FWRVMADldBVkVTX0RFQ0lNQUxTAAgADERFWF9ERUNJTUFMUwAIAAdNQVhfSU5UAP//////////fwALWkVST19CSUdJTlQJALYCAQAAAApPTkVfQklHSU5UCQC2AgEAAQASU1dBVkVTX1JBVEVfRkFDVE9SCQC2AgEAgKCUpY0dARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ9fdmFsaWRhdGVCaWdJbnQDBHZhbF8ObG93ZXJCb3VuZGFyeV8EZXJyXwMJAL8CAgUObG93ZXJCb3VuZGFyeV8FBHZhbF8JAAIBBQRlcnJfBgEPX3ZhbGlkYXRlU3RyaW5nAgR2YWxfBGVycl8DAwkAZwIAAAkAsQIBBQR2YWxfBgkBCGNvbnRhaW5zAgUEdmFsXwUJU0VQQVJBVE9SCQACAQUEZXJyXwYBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMJcGF5bWVudHNfB3RhcmdldF8EZXJyXwMJAQIhPQIJAJADAQUJcGF5bWVudHNfBQd0YXJnZXRfCQACAQUEZXJyXwYBC19hc3NldFRvU3RyAQZhc3NldF8EByRtYXRjaDAFBmFzc2V0XwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwCQDYBAEFAWEFBVdBVkVTAQtfc3RyVG9Bc3NldAEGYXNzZXRfAwkAAAIFBmFzc2V0XwUFV0FWRVMFBHVuaXQJANkEAQUGYXNzZXRfAQxfZ2V0RGVjaW1hbHMBCGFzc2V0SWRfAwkAAAIFCGFzc2V0SWRfBQVXQVZFUwUOV0FWRVNfREVDSU1BTFMEByRtYXRjaDAJAOwHAQkA2QQBBQhhc3NldElkXwMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAgFAWEIZGVjaW1hbHMJAAIBCQCsAgICF19nZXREZWNpbWFsczogbm8gYXNzZXQ9BQhhc3NldElkXwESX25vcm1hbGl6ZURlY2ltYWxzAwdhbW91bnRfD3NvdXJjZURlY2ltYWxzXw90YXJnZXREZWNpbWFsc18DCQBnAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18JAGkCBQdhbW91bnRfCQBsBgAKAAAJAGUCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwAAAAAFBERPV04JAGgCBQdhbW91bnRfCQBsBgAKAAAJAGUCBQ90YXJnZXREZWNpbWFsc18FD3NvdXJjZURlY2ltYWxzXwAAAAAFBERPV04BCV9sb2FkSW5pdAAEByRtYXRjaDAJAKAIAQUIS0VZX0lOSVQDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYQUHJG1hdGNoMAUBYQcBCV9zYXZlSW5pdAEHaXNJbml0XwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUIS0VZX0lOSVQFB2lzSW5pdF8FA25pbAEKX2xvYWRQYXVzZQAEByRtYXRjaDAJAKAIAQUKS0VZX1BBVVNFRAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEKX3NhdmVQYXVzZQEJaXNQYXVzZWRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQpLRVlfUEFVU0VEBQlpc1BhdXNlZF8FA25pbAELX2xvYWRQYXVzZXIABAckbWF0Y2gwCQCiCAEFCktFWV9QQVVTRVIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAELX3NhdmVQYXVzZXIBB3BhdXNlcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUKS0VZX1BBVVNFUgkApQgBBQdwYXVzZXJfBQNuaWwBDV9sb2FkTXVsdGlzaWcABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQ1fc2F2ZU11bHRpc2lnAQltdWx0aXNpZ18JAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX01VTFRJU0lHCQClCAEFCW11bHRpc2lnXwUDbmlsAQxfbG9hZENoYWluSWQABAckbWF0Y2gwCQCfCAEFCUtFWV9DSEFJTgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEMX3NhdmVDaGFpbklkAQhjaGFpbklkXwkAzAgCCQEMSW50ZWdlckVudHJ5AgUJS0VZX0NIQUlOBQhjaGFpbklkXwUDbmlsARRfbG9hZEdhdGV3YXlDb250cmFjdAAEByRtYXRjaDAJAKIIAQUUS0VZX0dBVEVXQVlfQ09OVFJBQ1QDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAEUX3NhdmVHYXRld2F5Q29udHJhY3QBEGdhdGV3YXlDb250cmFjdF8JAMwIAgkBC1N0cmluZ0VudHJ5AgUUS0VZX0dBVEVXQVlfQ09OVFJBQ1QJAKUIAQUQZ2F0ZXdheUNvbnRyYWN0XwUDbmlsARNfbG9hZFNXYXZlc0NvbnRyYWN0AAQHJG1hdGNoMAkAoggBBRNLRVlfU1dBVkVTX0NPTlRSQUNUAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABE19zYXZlU1dhdmVzQ29udHJhY3QBD3NXYXZlc0NvbnRyYWN0XwkAzAgCCQELU3RyaW5nRW50cnkCBRNLRVlfU1dBVkVTX0NPTlRSQUNUCQClCAEFD3NXYXZlc0NvbnRyYWN0XwUDbmlsARBfbG9hZFNXYXZlc0Fzc2V0AQljb250cmFjdF8EByRtYXRjaDAJAJ0IAgUJY29udHJhY3RfBRBLRVlfU1dBVkVTX0FTU0VUAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkA2QQBBQFhCQACAQIYX2xvYWRTV2F2ZXNBc3NldDogcmV2ZXJ0AQ1fbG9hZFJlc2VydmVzAQZhc3NldF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFDEtFWV9SRVNFUlZFUwkAzAgCBQZhc3NldF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQ1fc2F2ZVJlc2VydmVzAgZhc3NldF8JcmVzZXJ2ZXNfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUMS0VZX1JFU0VSVkVTCQDMCAIFBmFzc2V0XwUDbmlsBQlTRVBBUkFUT1IFCXJlc2VydmVzXwUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQAAwkBCV9sb2FkSW5pdAAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAMJAQEhAQkBCV9sb2FkSW5pdAAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGAQ5fd2hlbk5vdFBhdXNlZAADCQEKX2xvYWRQYXVzZQAJAAIBAhZfd2hlbk5vdFBhdXNlZDogcmV2ZXJ0BgELX3doZW5QYXVzZWQAAwkBASEBCQEKX2xvYWRQYXVzZQAJAAIBAhNfd2hlblBhdXNlZDogcmV2ZXJ0BgELX29ubHlQYXVzZXIBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfCQELX2xvYWRQYXVzZXIACQACAQITX29ubHlQYXVzZXI6IHJldmVydAYBEF92YWxpZGF0ZUdhdGV3YXkCBmNhbGxlcgRlcnJfAwkBAiE9AgkBFF9sb2FkR2F0ZXdheUNvbnRyYWN0AAUGY2FsbGVyCQACAQUEZXJyXwYKAWkBBGluaXQECGNoYWluSWRfB3BhdXNlcl8QZ2F0ZXdheUNvbnRyYWN0Xw9zV2F2ZXNDb250cmFjdF8EA2VycgMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQETX3doZW5Ob3RJbml0aWFsaXplZAAHCQEQX3doZW5NdWx0aXNpZ1NldAAHCQEMX3ZhbGlkYXRlSW50BAUIY2hhaW5JZF8AAAUHTUFYX0lOVAIVaW5pdDogaW52YWxpZCBjaGFpbklkBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhRpbml0OiBpbnZhbGlkIHBhdXNlcgcJARBfdmFsaWRhdGVBZGRyZXNzAgUQZ2F0ZXdheUNvbnRyYWN0XwIdaW5pdDogaW52YWxpZCBnYXRld2F5Q29udHJhY3QHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFD3NXYXZlc0NvbnRyYWN0XwIcaW5pdDogaW52YWxpZCBzV2F2ZXNDb250cmFjdAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQEJX3NhdmVJbml0AQYJAQxfc2F2ZUNoYWluSWQBBQhjaGFpbklkXwkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwkBFF9zYXZlR2F0ZXdheUNvbnRyYWN0AQkBEUBleHRyTmF0aXZlKDEwNjIpAQUQZ2F0ZXdheUNvbnRyYWN0XwkBE19zYXZlU1dhdmVzQ29udHJhY3QBCQERQGV4dHJOYXRpdmUoMTA2MikBBQ9zV2F2ZXNDb250cmFjdF8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAAEA2VycgMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMIBQFpCHBheW1lbnRzAAECE2RlcG9zaXQ6IG5vIHBheW1lbnQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAUHTUFYX0lOVAIZZGVwb3NpdDogbmVnYXRpdmUgcGF5bWVudAcDCQAAAgUDZXJyBQNlcnIEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEDWFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQVhc3NldAQGYW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzAwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFDWFzc2V0RGVjaW1hbHMFDERFWF9ERUNJTUFMUwQEZXJyMQkBDF92YWxpZGF0ZUludAQFBmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEEWdhdGV3YXlJbnZvY2F0aW9uCQD8BwQJARRfbG9hZEdhdGV3YXlDb250cmFjdAAFDEZVTkNfREVQT1NJVAkAzAgCCQClCAEFBHRoaXMJAMwIAgUGY2FsbGVyCQDMCAIFBmNhbGxlcgkAzAgCCQCkAwEJAQxfbG9hZENoYWluSWQACQDMCAIFBWFzc2V0CQDMCAIJAKQDAQUGYW1vdW50BQNuaWwFA25pbAMJAAACBRFnYXRld2F5SW52b2NhdGlvbgURZ2F0ZXdheUludm9jYXRpb24EEXN0YWtpbmdJbnZvY2F0aW9uAwkAAAIFBWFzc2V0BQVXQVZFUwkA/AcECQETX2xvYWRTV2F2ZXNDb250cmFjdAAFDEZVTkNfREVQT1NJVAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUDbmlsBQR1bml0AwkAAAIFEXN0YWtpbmdJbnZvY2F0aW9uBRFzdGFraW5nSW52b2NhdGlvbgkAlAoCCQENX3NhdmVSZXNlcnZlcwIFBWFzc2V0CQBkAgkBDV9sb2FkUmVzZXJ2ZXMBBQVhc3NldAUGYW1vdW50BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWRlcG9zaXRUbwEDdG9fBANlcnIDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwgFAWkIcGF5bWVudHMAAQIVZGVwb3NpdFRvOiBubyBwYXltZW50BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCG2RlcG9zaXRUbzogbmVnYXRpdmUgcGF5bWVudAcJAQ9fdmFsaWRhdGVTdHJpbmcCBQN0b18CFWRlcG9zaXRUbzogaW52YWxpZCB0bwcDCQAAAgUDZXJyBQNlcnIEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEDWFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQVhc3NldAQGYW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzAwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFDWFzc2V0RGVjaW1hbHMFDERFWF9ERUNJTUFMUwQEZXJyMQkBDF92YWxpZGF0ZUludAQFBmFtb3VudAABBQdNQVhfSU5UAiFkZXBvc2l0VG86IGludmFsaWQgcGF5bWVudCBhbW91bnQDCQAAAgUEZXJyMQUEZXJyMQQRZ2F0ZXdheUludm9jYXRpb24JAPwHBAkBFF9sb2FkR2F0ZXdheUNvbnRyYWN0AAUMRlVOQ19ERVBPU0lUCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQZjYWxsZXIJAMwIAgUDdG9fCQDMCAIJAKQDAQkBDF9sb2FkQ2hhaW5JZAAJAMwIAgUFYXNzZXQJAMwIAgkApAMBBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFEWdhdGV3YXlJbnZvY2F0aW9uBRFnYXRld2F5SW52b2NhdGlvbgQRc3Rha2luZ0ludm9jYXRpb24DCQAAAgUFYXNzZXQFBVdBVkVTCQD8BwQJARNfbG9hZFNXYXZlc0NvbnRyYWN0AAUMRlVOQ19ERVBPU0lUBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQNuaWwFBHVuaXQDCQAAAgURc3Rha2luZ0ludm9jYXRpb24FEXN0YWtpbmdJbnZvY2F0aW9uCQCUCgIJAQ1fc2F2ZVJlc2VydmVzAgUFYXNzZXQJAGQCCQENX2xvYWRSZXNlcnZlcwEFBWFzc2V0BQZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERcmVxdWVzdFdpdGhkcmF3YWwDCnRvQ2hhaW5JZF8GYXNzZXRfB2Ftb3VudF8EBmFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEFB2Ftb3VudF8CIXJlcXVlc3RXaXRoZHJhd2FsOiBhbW91bnQgbm90IGludAQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQxfdmFsaWRhdGVJbnQEBQp0b0NoYWluSWRfAAAFB01BWF9JTlQCJHJlcXVlc3RXaXRoZHJhd2FsOiBpbnZhbGlkIHRvQ2hhaW5JZAcJAQ9fdmFsaWRhdGVTdHJpbmcCBQZhc3NldF8CIHJlcXVlc3RXaXRoZHJhd2FsOiBpbnZhbGlkIGFzc2V0BwkBD192YWxpZGF0ZUJpZ0ludAMFBmFtb3VudAUKT05FX0JJR0lOVAIicmVxdWVzdFdpdGhkcmF3YWw6IG5lZ2F0aXZlIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIEE3JlcXVlc3RXaXRoZHJhd2FsSWQEByRtYXRjaDAJAPwHBAkBFF9sb2FkR2F0ZXdheUNvbnRyYWN0AAUXRlVOQ19SRVFVRVNUX1dJVEhEUkFXQUwJAMwIAgkApQgBBQR0aGlzCQDMCAIFBmNhbGxlcgkAzAgCBQZjYWxsZXIJAMwIAgkApAMBCQEMX2xvYWRDaGFpbklkAAkAzAgCCQCkAwEFCnRvQ2hhaW5JZF8JAMwIAgUGYXNzZXRfCQDMCAIFB2Ftb3VudF8FA25pbAUDbmlsAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQkAAgECKHJlcXVlc3RXaXRoZHJhd2FsOiBjYWxsIHJldmVydGVkIGZyb20gZ3cDCQAAAgUTcmVxdWVzdFdpdGhkcmF3YWxJZAUTcmVxdWVzdFdpdGhkcmF3YWxJZAkAlAoCBQNuaWwFE3JlcXVlc3RXaXRoZHJhd2FsSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERZXhlY3V0ZVdpdGhkcmF3YWwBFHJlcXVlc3RXaXRoZHJhd2FsSWRfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQxfdmFsaWRhdGVJbnQEBRRyZXF1ZXN0V2l0aGRyYXdhbElkXwAABQdNQVhfSU5UAiRleGVjdXRlV2l0aGRyYXdhbDogaW52YWxpZCByZXF1ZXN0SWQHAwkAAAIFA2VycgUDZXJyBBFnYXRld2F5SW52b2NhdGlvbgkA/QcECQEUX2xvYWRHYXRld2F5Q29udHJhY3QABRdGVU5DX0VYRUNVVEVfV0lUSERSQVdBTAkAzAgCCQClCAEFBHRoaXMJAMwIAgkApAMBCQEMX2xvYWRDaGFpbklkAAkAzAgCCQCkAwEFFHJlcXVlc3RXaXRoZHJhd2FsSWRfBQNuaWwFA25pbAMJAAACBRFnYXRld2F5SW52b2NhdGlvbgURZ2F0ZXdheUludm9jYXRpb24JAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AwN0b18GYXNzZXRfB2Ftb3VudF8EBmFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEFB2Ftb3VudF8CGHdpdGhkcmF3OiBhbW91bnQgbm90IGludAQDZXJyAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEQX3ZhbGlkYXRlR2F0ZXdheQIIBQFpBmNhbGxlcgIZd2l0aGRyYXc6IGludmFsaWQgZ2F0ZXdheQcJARBfdmFsaWRhdGVBZGRyZXNzAgUDdG9fAhl3aXRoZHJhdzogaW52YWxpZCBhZGRyZXNzBwkBDl92YWxpZGF0ZUFzc2V0AgUGYXNzZXRfAhd3aXRoZHJhdzogaW52YWxpZCBhc3NldAcJAQxfdmFsaWRhdGVJbnQEBQZhbW91bnQAAAUHTUFYX0lOVAIZd2l0aGRyYXc6IG5lZ2F0aXZlIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEDWFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQZhc3NldF8EEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMDBQZhbW91bnQFDERFWF9ERUNJTUFMUwUNYXNzZXREZWNpbWFscwQLbmV3UmVzZXJ2ZXMJAGUCCQENX2xvYWRSZXNlcnZlcwEFBmFzc2V0XwUGYW1vdW50BARlcnIxAwkBDF92YWxpZGF0ZUludAQFEGFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIYd2l0aGRyYXc6IGludmFsaWQgYW1vdW50CQEMX3ZhbGlkYXRlSW50BAULbmV3UmVzZXJ2ZXMAAAUHTUFYX0lOVAIed2l0aGRyYXc6IG5lZ2F0aXZlIG5ld1Jlc2VydmVzBwMJAAACBQRlcnIxBQRlcnIxBBN1bnN0YWtpbmdJbnZvY2F0aW9uAwkAAAIFBmFzc2V0XwUFV0FWRVMEDnNXYXZlc0NvbnRyYWN0CQETX2xvYWRTV2F2ZXNDb250cmFjdAAEC3NXYXZlc0Fzc2V0CQEQX2xvYWRTV2F2ZXNBc3NldAEFDnNXYXZlc0NvbnRyYWN0BAppbnZvY2F0aW9uCQD8BwQFDnNXYXZlc0NvbnRyYWN0BQ1GVU5DX0dFVF9SQVRFBQNuaWwFA25pbAQEcmF0ZQQHJG1hdGNoMAUKaW52b2NhdGlvbgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQkAAgECIXdpdGhkcmF3OiBzV2F2ZXMgZ2V0UmF0ZSgpIHJldmVydAQQc1dhdmVzVG9XaXRoZHJhdwkAoAMBCQC9AgQJALYCAQUQYW1vdW50Tm9ybWFsaXplZAUSU1dBVkVTX1JBVEVfRkFDVE9SBQRyYXRlBQdDRUlMSU5HCQD8BwQFDnNXYXZlc0NvbnRyYWN0BQ1GVU5DX1dJVEhEUkFXBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3NXYXZlc0Fzc2V0BRBzV2F2ZXNUb1dpdGhkcmF3BQNuaWwFBHVuaXQDCQAAAgUTdW5zdGFraW5nSW52b2NhdGlvbgUTdW5zdGFraW5nSW52b2NhdGlvbgkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUDdG9fBRBhbW91bnROb3JtYWxpemVkCQELX3N0clRvQXNzZXQBBQZhc3NldF8FA25pbAkBDV9zYXZlUmVzZXJ2ZXMCBQZhc3NldF8FC25ld1Jlc2VydmVzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1bnBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBC193aGVuUGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQx1cGRhdGVQYXVzZXIBB3BhdXNlcl8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIcdXBkYXRlUGF1c2VyOiBpbnZhbGlkIHBhdXNlcgcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzZXRNdWx0aXNpZwEJbXVsdGlzaWdfBANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfdmFsaWRhdGVBZGRyZXNzAgUJbXVsdGlzaWdfAh1zZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZwcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDV9zYXZlTXVsdGlzaWcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQltdWx0aXNpZ18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcECG11bHRpc2lnBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG11bHRpc2lnCQC5CQIJAMwIAgUKS0VZX1NUQVRVUwkAzAgCCQClCAEFBHRoaXMJAMwIAgkA2AQBCAUCdHgCaWQFA25pbAUJU0VQQVJBVE9SBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleSRtRiI=", "height": 3044945, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GiVAXqKK9S95Kuu9jMqqdBeXcL1WCRBLc3Xk6yq5HFuL Next: none Diff:
OldNewDifferences
4141
4242 let MAX_INT = 9223372036854775807
4343
44+let ZERO_BIGINT = toBigInt(0)
45+
46+let ONE_BIGINT = toBigInt(1)
47+
4448 let SWAVES_RATE_FACTOR = toBigInt(1000000000000)
4549
4650 func _validateAddress (address_,err_) = match addressFromString(address_) {
6468 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
6569 then true
6670 else (val_ > upperBoundary_))
71+ then throw(err_)
72+ else true
73+
74+
75+func _validateBigInt (val_,lowerBoundary_,err_) = if ((lowerBoundary_ > val_))
6776 then throw(err_)
6877 else true
6978
344353
345354 @Callable(i)
346355 func requestWithdrawal (toChainId_,asset_,amount_) = {
356+ let amount = valueOrErrorMessage(parseBigInt(amount_), "requestWithdrawal: amount not int")
347357 let err = if (if (if (_whenInitialized())
348358 then _validateInt(toChainId_, 0, MAX_INT, "requestWithdrawal: invalid toChainId")
349359 else false)
350360 then _validateString(asset_, "requestWithdrawal: invalid asset")
351361 else false)
352- then _validateInt(amount_, 1, MAX_INT, "requestWithdrawal: negative amount")
362+ then _validateBigInt(amount, ONE_BIGINT, "requestWithdrawal: negative amount")
353363 else false
354364 if ((err == err))
355365 then {
356366 let caller = toString(i.caller)
357- let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), toString(toChainId_), asset_, toString(amount_)], nil) {
367+ let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), toString(toChainId_), asset_, amount_], nil) {
358368 case a: Int =>
359369 a
360370 case _ =>
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEPARATOR = "__"
55
66 let KEY_MULTISIG = "MULTISIG"
77
88 let KEY_STATUS = "STATUS"
99
1010 let KEY_INIT = "INIT"
1111
1212 let KEY_PAUSED = "PAUSED"
1313
1414 let KEY_PAUSER = "PAUSER"
1515
1616 let KEY_CHAIN = "CHAIN"
1717
1818 let KEY_GATEWAY_CONTRACT = "GATEWAY_CONTRACT"
1919
2020 let KEY_SWAVES_CONTRACT = "SWAVES_CONTRACT"
2121
2222 let KEY_SWAVES_ASSET = "ASSET"
2323
2424 let KEY_RESERVES = "RESERVES"
2525
2626 let FUNC_DEPOSIT = "deposit"
2727
2828 let FUNC_REQUEST_WITHDRAWAL = "requestWithdrawal"
2929
3030 let FUNC_EXECUTE_WITHDRAWAL = "executeWithdrawal"
3131
3232 let FUNC_GET_RATE = "getRate"
3333
3434 let FUNC_WITHDRAW = "withdraw"
3535
3636 let WAVES = "WAVES"
3737
3838 let WAVES_DECIMALS = 8
3939
4040 let DEX_DECIMALS = 8
4141
4242 let MAX_INT = 9223372036854775807
4343
44+let ZERO_BIGINT = toBigInt(0)
45+
46+let ONE_BIGINT = toBigInt(1)
47+
4448 let SWAVES_RATE_FACTOR = toBigInt(1000000000000)
4549
4650 func _validateAddress (address_,err_) = match addressFromString(address_) {
4751 case a: Address =>
4852 true
4953 case _ =>
5054 throw(err_)
5155 }
5256
5357
5458 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
5559 then true
5660 else match assetInfo(fromBase58String(assetId_)) {
5761 case a: Asset =>
5862 true
5963 case _ =>
6064 throw(err_)
6165 }
6266
6367
6468 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
6569 then true
6670 else (val_ > upperBoundary_))
71+ then throw(err_)
72+ else true
73+
74+
75+func _validateBigInt (val_,lowerBoundary_,err_) = if ((lowerBoundary_ > val_))
6776 then throw(err_)
6877 else true
6978
7079
7180 func _validateString (val_,err_) = if (if ((0 >= size(val_)))
7281 then true
7382 else contains(val_, SEPARATOR))
7483 then throw(err_)
7584 else true
7685
7786
7887 func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
7988 then throw(err_)
8089 else true
8190
8291
8392 func _assetToStr (asset_) = match asset_ {
8493 case a: ByteVector =>
8594 toBase58String(a)
8695 case _ =>
8796 WAVES
8897 }
8998
9099
91100 func _strToAsset (asset_) = if ((asset_ == WAVES))
92101 then unit
93102 else fromBase58String(asset_)
94103
95104
96105 func _getDecimals (assetId_) = if ((assetId_ == WAVES))
97106 then WAVES_DECIMALS
98107 else match assetInfo(fromBase58String(assetId_)) {
99108 case a: Asset =>
100109 a.decimals
101110 case _ =>
102111 throw(("_getDecimals: no asset=" + assetId_))
103112 }
104113
105114
106115 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_) = if ((sourceDecimals_ >= targetDecimals_))
107116 then (amount_ / pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN))
108117 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
109118
110119
111120 func _loadInit () = match getBoolean(KEY_INIT) {
112121 case a: Boolean =>
113122 a
114123 case _ =>
115124 false
116125 }
117126
118127
119128 func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
120129
121130
122131 func _loadPause () = match getBoolean(KEY_PAUSED) {
123132 case a: Boolean =>
124133 a
125134 case _ =>
126135 false
127136 }
128137
129138
130139 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
131140
132141
133142 func _loadPauser () = match getString(KEY_PAUSER) {
134143 case a: String =>
135144 addressFromStringValue(a)
136145 case _ =>
137146 Address(base58'')
138147 }
139148
140149
141150 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
142151
143152
144153 func _loadMultisig () = match getString(KEY_MULTISIG) {
145154 case a: String =>
146155 addressFromStringValue(a)
147156 case _ =>
148157 Address(base58'')
149158 }
150159
151160
152161 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
153162
154163
155164 func _loadChainId () = match getInteger(KEY_CHAIN) {
156165 case a: Int =>
157166 a
158167 case _ =>
159168 0
160169 }
161170
162171
163172 func _saveChainId (chainId_) = [IntegerEntry(KEY_CHAIN, chainId_)]
164173
165174
166175 func _loadGatewayContract () = match getString(KEY_GATEWAY_CONTRACT) {
167176 case a: String =>
168177 addressFromStringValue(a)
169178 case _ =>
170179 Address(base58'')
171180 }
172181
173182
174183 func _saveGatewayContract (gatewayContract_) = [StringEntry(KEY_GATEWAY_CONTRACT, toString(gatewayContract_))]
175184
176185
177186 func _loadSWavesContract () = match getString(KEY_SWAVES_CONTRACT) {
178187 case a: String =>
179188 addressFromStringValue(a)
180189 case _ =>
181190 Address(base58'')
182191 }
183192
184193
185194 func _saveSWavesContract (sWavesContract_) = [StringEntry(KEY_SWAVES_CONTRACT, toString(sWavesContract_))]
186195
187196
188197 func _loadSWavesAsset (contract_) = match getString(contract_, KEY_SWAVES_ASSET) {
189198 case a: String =>
190199 fromBase58String(a)
191200 case _ =>
192201 throw("_loadSWavesAsset: revert")
193202 }
194203
195204
196205 func _loadReserves (asset_) = match getInteger(makeString([KEY_RESERVES, asset_], SEPARATOR)) {
197206 case a: Int =>
198207 a
199208 case _ =>
200209 0
201210 }
202211
203212
204213 func _saveReserves (asset_,reserves_) = [IntegerEntry(makeString([KEY_RESERVES, asset_], SEPARATOR), reserves_)]
205214
206215
207216 func _onlyThisContract (caller_) = if ((caller_ != this))
208217 then throw("_onlyThisContract: revert")
209218 else true
210219
211220
212221 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
213222 then throw("_whenMultisigSet: revert")
214223 else true
215224
216225
217226 func _whenNotInitialized () = if (_loadInit())
218227 then throw("_whenNotInitialized: revert")
219228 else true
220229
221230
222231 func _whenInitialized () = if (!(_loadInit()))
223232 then throw("_whenInitialized: revert")
224233 else true
225234
226235
227236 func _whenNotPaused () = if (_loadPause())
228237 then throw("_whenNotPaused: revert")
229238 else true
230239
231240
232241 func _whenPaused () = if (!(_loadPause()))
233242 then throw("_whenPaused: revert")
234243 else true
235244
236245
237246 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
238247 then throw("_onlyPauser: revert")
239248 else true
240249
241250
242251 func _validateGateway (caller,err_) = if ((_loadGatewayContract() != caller))
243252 then throw(err_)
244253 else true
245254
246255
247256 @Callable(i)
248257 func init (chainId_,pauser_,gatewayContract_,sWavesContract_) = {
249258 let err = if (if (if (if (if (if (_onlyThisContract(i.caller))
250259 then _whenNotInitialized()
251260 else false)
252261 then _whenMultisigSet()
253262 else false)
254263 then _validateInt(chainId_, 0, MAX_INT, "init: invalid chainId")
255264 else false)
256265 then _validateAddress(pauser_, "init: invalid pauser")
257266 else false)
258267 then _validateAddress(gatewayContract_, "init: invalid gatewayContract")
259268 else false)
260269 then _validateAddress(sWavesContract_, "init: invalid sWavesContract")
261270 else false
262271 if ((err == err))
263272 then $Tuple2(((((_saveInit(true) ++ _saveChainId(chainId_)) ++ _savePauser(addressFromStringValue(pauser_))) ++ _saveGatewayContract(addressFromStringValue(gatewayContract_))) ++ _saveSWavesContract(addressFromStringValue(sWavesContract_))), unit)
264273 else throw("Strict value is not equal to itself.")
265274 }
266275
267276
268277
269278 @Callable(i)
270279 func deposit () = {
271280 let err = if (if (if (_whenInitialized())
272281 then _whenNotPaused()
273282 else false)
274283 then _validatePaymentsSize(i.payments, 1, "deposit: no payment")
275284 else false)
276285 then _validateInt(i.payments[0].amount, 0, MAX_INT, "deposit: negative payment")
277286 else false
278287 if ((err == err))
279288 then {
280289 let caller = toString(i.caller)
281290 let asset = _assetToStr(i.payments[0].assetId)
282291 let assetDecimals = _getDecimals(asset)
283292 let amount = _normalizeDecimals(i.payments[0].amount, assetDecimals, DEX_DECIMALS)
284293 let err1 = _validateInt(amount, 1, MAX_INT, "deposit: invalid payment amount")
285294 if ((err1 == err1))
286295 then {
287296 let gatewayInvocation = invoke(_loadGatewayContract(), FUNC_DEPOSIT, [toString(this), caller, caller, toString(_loadChainId()), asset, toString(amount)], nil)
288297 if ((gatewayInvocation == gatewayInvocation))
289298 then {
290299 let stakingInvocation = if ((asset == WAVES))
291300 then invoke(_loadSWavesContract(), FUNC_DEPOSIT, nil, [AttachedPayment(unit, i.payments[0].amount)])
292301 else unit
293302 if ((stakingInvocation == stakingInvocation))
294303 then $Tuple2(_saveReserves(asset, (_loadReserves(asset) + amount)), unit)
295304 else throw("Strict value is not equal to itself.")
296305 }
297306 else throw("Strict value is not equal to itself.")
298307 }
299308 else throw("Strict value is not equal to itself.")
300309 }
301310 else throw("Strict value is not equal to itself.")
302311 }
303312
304313
305314
306315 @Callable(i)
307316 func depositTo (to_) = {
308317 let err = if (if (if (if (_whenInitialized())
309318 then _whenNotPaused()
310319 else false)
311320 then _validatePaymentsSize(i.payments, 1, "depositTo: no payment")
312321 else false)
313322 then _validateInt(i.payments[0].amount, 0, MAX_INT, "depositTo: negative payment")
314323 else false)
315324 then _validateString(to_, "depositTo: invalid to")
316325 else false
317326 if ((err == err))
318327 then {
319328 let caller = toString(i.caller)
320329 let asset = _assetToStr(i.payments[0].assetId)
321330 let assetDecimals = _getDecimals(asset)
322331 let amount = _normalizeDecimals(i.payments[0].amount, assetDecimals, DEX_DECIMALS)
323332 let err1 = _validateInt(amount, 1, MAX_INT, "depositTo: invalid payment amount")
324333 if ((err1 == err1))
325334 then {
326335 let gatewayInvocation = invoke(_loadGatewayContract(), FUNC_DEPOSIT, [toString(this), caller, to_, toString(_loadChainId()), asset, toString(amount)], nil)
327336 if ((gatewayInvocation == gatewayInvocation))
328337 then {
329338 let stakingInvocation = if ((asset == WAVES))
330339 then invoke(_loadSWavesContract(), FUNC_DEPOSIT, nil, [AttachedPayment(unit, i.payments[0].amount)])
331340 else unit
332341 if ((stakingInvocation == stakingInvocation))
333342 then $Tuple2(_saveReserves(asset, (_loadReserves(asset) + amount)), unit)
334343 else throw("Strict value is not equal to itself.")
335344 }
336345 else throw("Strict value is not equal to itself.")
337346 }
338347 else throw("Strict value is not equal to itself.")
339348 }
340349 else throw("Strict value is not equal to itself.")
341350 }
342351
343352
344353
345354 @Callable(i)
346355 func requestWithdrawal (toChainId_,asset_,amount_) = {
356+ let amount = valueOrErrorMessage(parseBigInt(amount_), "requestWithdrawal: amount not int")
347357 let err = if (if (if (_whenInitialized())
348358 then _validateInt(toChainId_, 0, MAX_INT, "requestWithdrawal: invalid toChainId")
349359 else false)
350360 then _validateString(asset_, "requestWithdrawal: invalid asset")
351361 else false)
352- then _validateInt(amount_, 1, MAX_INT, "requestWithdrawal: negative amount")
362+ then _validateBigInt(amount, ONE_BIGINT, "requestWithdrawal: negative amount")
353363 else false
354364 if ((err == err))
355365 then {
356366 let caller = toString(i.caller)
357- let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), toString(toChainId_), asset_, toString(amount_)], nil) {
367+ let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), toString(toChainId_), asset_, amount_], nil) {
358368 case a: Int =>
359369 a
360370 case _ =>
361371 throw("requestWithdrawal: call reverted from gw")
362372 }
363373 if ((requestWithdrawalId == requestWithdrawalId))
364374 then $Tuple2(nil, requestWithdrawalId)
365375 else throw("Strict value is not equal to itself.")
366376 }
367377 else throw("Strict value is not equal to itself.")
368378 }
369379
370380
371381
372382 @Callable(i)
373383 func executeWithdrawal (requestWithdrawalId_) = {
374384 let err = if (_whenInitialized())
375385 then _validateInt(requestWithdrawalId_, 0, MAX_INT, "executeWithdrawal: invalid requestId")
376386 else false
377387 if ((err == err))
378388 then {
379389 let gatewayInvocation = reentrantInvoke(_loadGatewayContract(), FUNC_EXECUTE_WITHDRAWAL, [toString(this), toString(_loadChainId()), toString(requestWithdrawalId_)], nil)
380390 if ((gatewayInvocation == gatewayInvocation))
381391 then $Tuple2(nil, unit)
382392 else throw("Strict value is not equal to itself.")
383393 }
384394 else throw("Strict value is not equal to itself.")
385395 }
386396
387397
388398
389399 @Callable(i)
390400 func withdraw (to_,asset_,amount_) = {
391401 let amount = valueOrErrorMessage(parseInt(amount_), "withdraw: amount not int")
392402 let err = if (if (if (if (_whenInitialized())
393403 then _validateGateway(i.caller, "withdraw: invalid gateway")
394404 else false)
395405 then _validateAddress(to_, "withdraw: invalid address")
396406 else false)
397407 then _validateAsset(asset_, "withdraw: invalid asset")
398408 else false)
399409 then _validateInt(amount, 0, MAX_INT, "withdraw: negative amount")
400410 else false
401411 if ((err == err))
402412 then {
403413 let assetDecimals = _getDecimals(asset_)
404414 let amountNormalized = _normalizeDecimals(amount, DEX_DECIMALS, assetDecimals)
405415 let newReserves = (_loadReserves(asset_) - amount)
406416 let err1 = if (_validateInt(amountNormalized, 1, MAX_INT, "withdraw: invalid amount"))
407417 then _validateInt(newReserves, 0, MAX_INT, "withdraw: negative newReserves")
408418 else false
409419 if ((err1 == err1))
410420 then {
411421 let unstakingInvocation = if ((asset_ == WAVES))
412422 then {
413423 let sWavesContract = _loadSWavesContract()
414424 let sWavesAsset = _loadSWavesAsset(sWavesContract)
415425 let invocation = invoke(sWavesContract, FUNC_GET_RATE, nil, nil)
416426 let rate = match invocation {
417427 case a: String =>
418428 parseBigIntValue(a)
419429 case _ =>
420430 throw("withdraw: sWaves getRate() revert")
421431 }
422432 let sWavesToWithdraw = toInt(fraction(toBigInt(amountNormalized), SWAVES_RATE_FACTOR, rate, CEILING))
423433 invoke(sWavesContract, FUNC_WITHDRAW, nil, [AttachedPayment(sWavesAsset, sWavesToWithdraw)])
424434 }
425435 else unit
426436 if ((unstakingInvocation == unstakingInvocation))
427437 then $Tuple2(([ScriptTransfer(addressFromStringValue(to_), amountNormalized, _strToAsset(asset_))] ++ _saveReserves(asset_, newReserves)), unit)
428438 else throw("Strict value is not equal to itself.")
429439 }
430440 else throw("Strict value is not equal to itself.")
431441 }
432442 else throw("Strict value is not equal to itself.")
433443 }
434444
435445
436446
437447 @Callable(i)
438448 func pause () = {
439449 let err = if (if (_onlyPauser(i.caller))
440450 then _whenInitialized()
441451 else false)
442452 then _whenNotPaused()
443453 else false
444454 if ((err == err))
445455 then $Tuple2(_savePause(true), unit)
446456 else throw("Strict value is not equal to itself.")
447457 }
448458
449459
450460
451461 @Callable(i)
452462 func unpause () = {
453463 let err = if (if (_onlyPauser(i.caller))
454464 then _whenInitialized()
455465 else false)
456466 then _whenPaused()
457467 else false
458468 if ((err == err))
459469 then $Tuple2(_savePause(false), unit)
460470 else throw("Strict value is not equal to itself.")
461471 }
462472
463473
464474
465475 @Callable(i)
466476 func updatePauser (pauser_) = {
467477 let err = if (if (_onlyThisContract(i.caller))
468478 then _whenInitialized()
469479 else false)
470480 then _validateAddress(pauser_, "updatePauser: invalid pauser")
471481 else false
472482 if ((err == err))
473483 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
474484 else throw("Strict value is not equal to itself.")
475485 }
476486
477487
478488
479489 @Callable(i)
480490 func setMultisig (multisig_) = {
481491 let err = if (_onlyThisContract(i.caller))
482492 then _validateAddress(multisig_, "setMultisig: invalid multisig")
483493 else false
484494 if ((err == err))
485495 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
486496 else throw("Strict value is not equal to itself.")
487497 }
488498
489499
490500 @Verifier(tx)
491501 func verify () = match getString(KEY_MULTISIG) {
492502 case multisig: String =>
493503 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
494504 case _ =>
495505 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
496506 }
497507

github/deemru/w8io/3ef1775 
66.77 ms