tx · GiVAXqKK9S95Kuu9jMqqdBeXcL1WCRBLc3Xk6yq5HFuL

3N5Z4dAWzfkEp4kNJZKQk6zf3uTVFFz5MFF:  -0.01500000 Waves

2024.04.02 11:36 [3044919] smart account 3N5Z4dAWzfkEp4kNJZKQk6zf3uTVFFz5MFF > SELF 0.00000000 Waves

{ "type": 13, "id": "GiVAXqKK9S95Kuu9jMqqdBeXcL1WCRBLc3Xk6yq5HFuL", "fee": 1500000, "feeAssetId": null, "timestamp": 1712046921623, "version": 2, "chainId": 84, "sender": "3N5Z4dAWzfkEp4kNJZKQk6zf3uTVFFz5MFF", "senderPublicKey": "8Vp8fmB3ZGVRre7Cw5j9z6qXo3yD8ohPQ6agZ9mtVY5E", "proofs": [ "3gQDJa6ZxM2icg38of9H7DfiMKfJWRBJoZmfX285Dohm9CNZzcLfAMV9sVFaDcbqrAfLfkMU22N6kp6x7bArzUU7" ], "script": "base64:BwIyCAISBgoEAQgICBIAEgMKAQgSBQoDAQgBEgMKAQESBQoDCAgIEgASABIDCgEIEgMKAQg3AAlTRVBBUkFUT1ICAl9fAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAApLRVlfU1RBVFVTAgZTVEFUVVMACEtFWV9JTklUAgRJTklUAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgAJS0VZX0NIQUlOAgVDSEFJTgAUS0VZX0dBVEVXQVlfQ09OVFJBQ1QCEEdBVEVXQVlfQ09OVFJBQ1QAE0tFWV9TV0FWRVNfQ09OVFJBQ1QCD1NXQVZFU19DT05UUkFDVAAQS0VZX1NXQVZFU19BU1NFVAIFQVNTRVQADEtFWV9SRVNFUlZFUwIIUkVTRVJWRVMADEZVTkNfREVQT1NJVAIHZGVwb3NpdAAXRlVOQ19SRVFVRVNUX1dJVEhEUkFXQUwCEXJlcXVlc3RXaXRoZHJhd2FsABdGVU5DX0VYRUNVVEVfV0lUSERSQVdBTAIRZXhlY3V0ZVdpdGhkcmF3YWwADUZVTkNfR0VUX1JBVEUCB2dldFJhdGUADUZVTkNfV0lUSERSQVcCCHdpdGhkcmF3AAVXQVZFUwIFV0FWRVMADldBVkVTX0RFQ0lNQUxTAAgADERFWF9ERUNJTUFMUwAIAAdNQVhfSU5UAP//////////fwASU1dBVkVTX1JBVEVfRkFDVE9SCQC2AgEAgKCUpY0dARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ9fdmFsaWRhdGVTdHJpbmcCBHZhbF8EZXJyXwMDCQBnAgAACQCxAgEFBHZhbF8GCQEIY29udGFpbnMCBQR2YWxfBQlTRVBBUkFUT1IJAAIBBQRlcnJfBgEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwlwYXltZW50c18HdGFyZ2V0XwRlcnJfAwkBAiE9AgkAkAMBBQlwYXltZW50c18FB3RhcmdldF8JAAIBBQRlcnJfBgELX2Fzc2V0VG9TdHIBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQUFV0FWRVMBC19zdHJUb0Fzc2V0AQZhc3NldF8DCQAAAgUGYXNzZXRfBQVXQVZFUwUEdW5pdAkA2QQBBQZhc3NldF8BDF9nZXREZWNpbWFscwEIYXNzZXRJZF8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBQ5XQVZFU19ERUNJTUFMUwQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwCAUBYQhkZWNpbWFscwkAAgEJAKwCAgIXX2dldERlY2ltYWxzOiBubyBhc3NldD0FCGFzc2V0SWRfARJfbm9ybWFsaXplRGVjaW1hbHMDB2Ftb3VudF8Pc291cmNlRGVjaW1hbHNfD3RhcmdldERlY2ltYWxzXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAaQIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3NvdXJjZURlY2ltYWxzXwUPdGFyZ2V0RGVjaW1hbHNfAAAAAAUERE9XTgkAaAIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3RhcmdldERlY2ltYWxzXwUPc291cmNlRGVjaW1hbHNfAAAAAAUERE9XTgEJX2xvYWRJbml0AAQHJG1hdGNoMAkAoAgBBQhLRVlfSU5JVAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEJX3NhdmVJbml0AQdpc0luaXRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQhLRVlfSU5JVAUHaXNJbml0XwUDbmlsAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDF9sb2FkQ2hhaW5JZAAEByRtYXRjaDAJAJ8IAQUJS0VZX0NIQUlOAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQxfc2F2ZUNoYWluSWQBCGNoYWluSWRfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlLRVlfQ0hBSU4FCGNoYWluSWRfBQNuaWwBFF9sb2FkR2F0ZXdheUNvbnRyYWN0AAQHJG1hdGNoMAkAoggBBRRLRVlfR0FURVdBWV9DT05UUkFDVAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARRfc2F2ZUdhdGV3YXlDb250cmFjdAEQZ2F0ZXdheUNvbnRyYWN0XwkAzAgCCQELU3RyaW5nRW50cnkCBRRLRVlfR0FURVdBWV9DT05UUkFDVAkApQgBBRBnYXRld2F5Q29udHJhY3RfBQNuaWwBE19sb2FkU1dhdmVzQ29udHJhY3QABAckbWF0Y2gwCQCiCAEFE0tFWV9TV0FWRVNfQ09OVFJBQ1QDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAETX3NhdmVTV2F2ZXNDb250cmFjdAEPc1dhdmVzQ29udHJhY3RfCQDMCAIJAQtTdHJpbmdFbnRyeQIFE0tFWV9TV0FWRVNfQ09OVFJBQ1QJAKUIAQUPc1dhdmVzQ29udHJhY3RfBQNuaWwBEF9sb2FkU1dhdmVzQXNzZXQBCWNvbnRyYWN0XwQHJG1hdGNoMAkAnQgCBQljb250cmFjdF8FEEtFWV9TV0FWRVNfQVNTRVQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQDZBAEFAWEJAAIBAhhfbG9hZFNXYXZlc0Fzc2V0OiByZXZlcnQBDV9sb2FkUmVzZXJ2ZXMBBmFzc2V0XwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUMS0VZX1JFU0VSVkVTCQDMCAIFBmFzc2V0XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABDV9zYXZlUmVzZXJ2ZXMCBmFzc2V0XwlyZXNlcnZlc18JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBQxLRVlfUkVTRVJWRVMJAMwIAgUGYXNzZXRfBQNuaWwFCVNFUEFSQVRPUgUJcmVzZXJ2ZXNfBQNuaWwBEV9vbmx5VGhpc0NvbnRyYWN0AQdjYWxsZXJfAwkBAiE9AgUHY2FsbGVyXwUEdGhpcwkAAgECGV9vbmx5VGhpc0NvbnRyYWN0OiByZXZlcnQGARBfd2hlbk11bHRpc2lnU2V0AAMJAAACCQENX2xvYWRNdWx0aXNpZwAJAQdBZGRyZXNzAQEACQACAQIYX3doZW5NdWx0aXNpZ1NldDogcmV2ZXJ0BgETX3doZW5Ob3RJbml0aWFsaXplZAADCQEJX2xvYWRJbml0AAkAAgECG193aGVuTm90SW5pdGlhbGl6ZWQ6IHJldmVydAYBEF93aGVuSW5pdGlhbGl6ZWQAAwkBASEBCQEJX2xvYWRJbml0AAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEQX3ZhbGlkYXRlR2F0ZXdheQIGY2FsbGVyBGVycl8DCQECIT0CCQEUX2xvYWRHYXRld2F5Q29udHJhY3QABQZjYWxsZXIJAAIBBQRlcnJfBgoBaQEEaW5pdAQIY2hhaW5JZF8HcGF1c2VyXxBnYXRld2F5Q29udHJhY3RfD3NXYXZlc0NvbnRyYWN0XwQDZXJyAwMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARNfd2hlbk5vdEluaXRpYWxpemVkAAcJARBfd2hlbk11bHRpc2lnU2V0AAcJAQxfdmFsaWRhdGVJbnQEBQhjaGFpbklkXwAABQdNQVhfSU5UAhVpbml0OiBpbnZhbGlkIGNoYWluSWQHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CFGluaXQ6IGludmFsaWQgcGF1c2VyBwkBEF92YWxpZGF0ZUFkZHJlc3MCBRBnYXRld2F5Q29udHJhY3RfAh1pbml0OiBpbnZhbGlkIGdhdGV3YXlDb250cmFjdAcJARBfdmFsaWRhdGVBZGRyZXNzAgUPc1dhdmVzQ29udHJhY3RfAhxpbml0OiBpbnZhbGlkIHNXYXZlc0NvbnRyYWN0BwMJAAACBQNlcnIFA2VycgkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAQlfc2F2ZUluaXQBBgkBDF9zYXZlQ2hhaW5JZAEFCGNoYWluSWRfCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfCQEUX3NhdmVHYXRld2F5Q29udHJhY3QBCQERQGV4dHJOYXRpdmUoMTA2MikBBRBnYXRld2F5Q29udHJhY3RfCQETX3NhdmVTV2F2ZXNDb250cmFjdAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFD3NXYXZlc0NvbnRyYWN0XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdkZXBvc2l0AAQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwgFAWkIcGF5bWVudHMAAQITZGVwb3NpdDogbm8gcGF5bWVudAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAhlkZXBvc2l0OiBuZWdhdGl2ZSBwYXltZW50BwMJAAACBQNlcnIFA2VycgQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgQFYXNzZXQJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFBWFzc2V0BAZhbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMDCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUMREVYX0RFQ0lNQUxTBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUGYW1vdW50AAEFB01BWF9JTlQCH2RlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhbW91bnQDCQAAAgUEZXJyMQUEZXJyMQQRZ2F0ZXdheUludm9jYXRpb24JAPwHBAkBFF9sb2FkR2F0ZXdheUNvbnRyYWN0AAUMRlVOQ19ERVBPU0lUCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQZjYWxsZXIJAMwIAgUGY2FsbGVyCQDMCAIJAKQDAQkBDF9sb2FkQ2hhaW5JZAAJAMwIAgUFYXNzZXQJAMwIAgkApAMBBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFEWdhdGV3YXlJbnZvY2F0aW9uBRFnYXRld2F5SW52b2NhdGlvbgQRc3Rha2luZ0ludm9jYXRpb24DCQAAAgUFYXNzZXQFBVdBVkVTCQD8BwQJARNfbG9hZFNXYXZlc0NvbnRyYWN0AAUMRlVOQ19ERVBPU0lUBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQNuaWwFBHVuaXQDCQAAAgURc3Rha2luZ0ludm9jYXRpb24FEXN0YWtpbmdJbnZvY2F0aW9uCQCUCgIJAQ1fc2F2ZVJlc2VydmVzAgUFYXNzZXQJAGQCCQENX2xvYWRSZXNlcnZlcwEFBWFzc2V0BQZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJZGVwb3NpdFRvAQN0b18EA2VycgMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARVfdmFsaWRhdGVQYXltZW50c1NpemUDCAUBaQhwYXltZW50cwABAhVkZXBvc2l0VG86IG5vIHBheW1lbnQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAUHTUFYX0lOVAIbZGVwb3NpdFRvOiBuZWdhdGl2ZSBwYXltZW50BwkBD192YWxpZGF0ZVN0cmluZwIFA3RvXwIVZGVwb3NpdFRvOiBpbnZhbGlkIHRvBwMJAAACBQNlcnIFA2VycgQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgQFYXNzZXQJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFBWFzc2V0BAZhbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMDCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUMREVYX0RFQ0lNQUxTBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUGYW1vdW50AAEFB01BWF9JTlQCIWRlcG9zaXRUbzogaW52YWxpZCBwYXltZW50IGFtb3VudAMJAAACBQRlcnIxBQRlcnIxBBFnYXRld2F5SW52b2NhdGlvbgkA/AcECQEUX2xvYWRHYXRld2F5Q29udHJhY3QABQxGVU5DX0RFUE9TSVQJAMwIAgkApQgBBQR0aGlzCQDMCAIFBmNhbGxlcgkAzAgCBQN0b18JAMwIAgkApAMBCQEMX2xvYWRDaGFpbklkAAkAzAgCBQVhc3NldAkAzAgCCQCkAwEFBmFtb3VudAUDbmlsBQNuaWwDCQAAAgURZ2F0ZXdheUludm9jYXRpb24FEWdhdGV3YXlJbnZvY2F0aW9uBBFzdGFraW5nSW52b2NhdGlvbgMJAAACBQVhc3NldAUFV0FWRVMJAPwHBAkBE19sb2FkU1dhdmVzQ29udHJhY3QABQxGVU5DX0RFUE9TSVQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFA25pbAUEdW5pdAMJAAACBRFzdGFraW5nSW52b2NhdGlvbgURc3Rha2luZ0ludm9jYXRpb24JAJQKAgkBDV9zYXZlUmVzZXJ2ZXMCBQVhc3NldAkAZAIJAQ1fbG9hZFJlc2VydmVzAQUFYXNzZXQFBmFtb3VudAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFyZXF1ZXN0V2l0aGRyYXdhbAMKdG9DaGFpbklkXwZhc3NldF8HYW1vdW50XwQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQxfdmFsaWRhdGVJbnQEBQp0b0NoYWluSWRfAAAFB01BWF9JTlQCJHJlcXVlc3RXaXRoZHJhd2FsOiBpbnZhbGlkIHRvQ2hhaW5JZAcJAQ9fdmFsaWRhdGVTdHJpbmcCBQZhc3NldF8CIHJlcXVlc3RXaXRoZHJhd2FsOiBpbnZhbGlkIGFzc2V0BwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAQUHTUFYX0lOVAIicmVxdWVzdFdpdGhkcmF3YWw6IG5lZ2F0aXZlIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIEE3JlcXVlc3RXaXRoZHJhd2FsSWQEByRtYXRjaDAJAPwHBAkBFF9sb2FkR2F0ZXdheUNvbnRyYWN0AAUXRlVOQ19SRVFVRVNUX1dJVEhEUkFXQUwJAMwIAgkApQgBBQR0aGlzCQDMCAIFBmNhbGxlcgkAzAgCBQZjYWxsZXIJAMwIAgkApAMBCQEMX2xvYWRDaGFpbklkAAkAzAgCCQCkAwEFCnRvQ2hhaW5JZF8JAMwIAgUGYXNzZXRfCQDMCAIJAKQDAQUHYW1vdW50XwUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhCQACAQIocmVxdWVzdFdpdGhkcmF3YWw6IGNhbGwgcmV2ZXJ0ZWQgZnJvbSBndwMJAAACBRNyZXF1ZXN0V2l0aGRyYXdhbElkBRNyZXF1ZXN0V2l0aGRyYXdhbElkCQCUCgIFA25pbAUTcmVxdWVzdFdpdGhkcmF3YWxJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFleGVjdXRlV2l0aGRyYXdhbAEUcmVxdWVzdFdpdGhkcmF3YWxJZF8EA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDF92YWxpZGF0ZUludAQFFHJlcXVlc3RXaXRoZHJhd2FsSWRfAAAFB01BWF9JTlQCJGV4ZWN1dGVXaXRoZHJhd2FsOiBpbnZhbGlkIHJlcXVlc3RJZAcDCQAAAgUDZXJyBQNlcnIEEWdhdGV3YXlJbnZvY2F0aW9uCQD9BwQJARRfbG9hZEdhdGV3YXlDb250cmFjdAAFF0ZVTkNfRVhFQ1VURV9XSVRIRFJBV0FMCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQCkAwEJAQxfbG9hZENoYWluSWQACQDMCAIJAKQDAQUUcmVxdWVzdFdpdGhkcmF3YWxJZF8FA25pbAUDbmlsAwkAAAIFEWdhdGV3YXlJbnZvY2F0aW9uBRFnYXRld2F5SW52b2NhdGlvbgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcDA3RvXwZhc3NldF8HYW1vdW50XwQGYW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUHYW1vdW50XwIYd2l0aGRyYXc6IGFtb3VudCBub3QgaW50BANlcnIDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJARBfdmFsaWRhdGVHYXRld2F5AggFAWkGY2FsbGVyAhl3aXRoZHJhdzogaW52YWxpZCBnYXRld2F5BwkBEF92YWxpZGF0ZUFkZHJlc3MCBQN0b18CGXdpdGhkcmF3OiBpbnZhbGlkIGFkZHJlc3MHCQEOX3ZhbGlkYXRlQXNzZXQCBQZhc3NldF8CF3dpdGhkcmF3OiBpbnZhbGlkIGFzc2V0BwkBDF92YWxpZGF0ZUludAQFBmFtb3VudAAABQdNQVhfSU5UAhl3aXRoZHJhdzogbmVnYXRpdmUgYW1vdW50BwMJAAACBQNlcnIFA2VycgQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFBmFzc2V0XwQQYW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwMFBmFtb3VudAUMREVYX0RFQ0lNQUxTBQ1hc3NldERlY2ltYWxzBAtuZXdSZXNlcnZlcwkAZQIJAQ1fbG9hZFJlc2VydmVzAQUGYXNzZXRfBQZhbW91bnQEBGVycjEDCQEMX3ZhbGlkYXRlSW50BAUQYW1vdW50Tm9ybWFsaXplZAABBQdNQVhfSU5UAhh3aXRoZHJhdzogaW52YWxpZCBhbW91bnQJAQxfdmFsaWRhdGVJbnQEBQtuZXdSZXNlcnZlcwAABQdNQVhfSU5UAh53aXRoZHJhdzogbmVnYXRpdmUgbmV3UmVzZXJ2ZXMHAwkAAAIFBGVycjEFBGVycjEEE3Vuc3Rha2luZ0ludm9jYXRpb24DCQAAAgUGYXNzZXRfBQVXQVZFUwQOc1dhdmVzQ29udHJhY3QJARNfbG9hZFNXYXZlc0NvbnRyYWN0AAQLc1dhdmVzQXNzZXQJARBfbG9hZFNXYXZlc0Fzc2V0AQUOc1dhdmVzQ29udHJhY3QECmludm9jYXRpb24JAPwHBAUOc1dhdmVzQ29udHJhY3QFDUZVTkNfR0VUX1JBVEUFA25pbAUDbmlsBARyYXRlBAckbWF0Y2gwBQppbnZvY2F0aW9uAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhCQACAQIhd2l0aGRyYXc6IHNXYXZlcyBnZXRSYXRlKCkgcmV2ZXJ0BBBzV2F2ZXNUb1dpdGhkcmF3CQCgAwEJAL0CBAkAtgIBBRBhbW91bnROb3JtYWxpemVkBRJTV0FWRVNfUkFURV9GQUNUT1IFBHJhdGUFB0NFSUxJTkcJAPwHBAUOc1dhdmVzQ29udHJhY3QFDUZVTkNfV0lUSERSQVcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULc1dhdmVzQXNzZXQFEHNXYXZlc1RvV2l0aGRyYXcFA25pbAUEdW5pdAMJAAACBRN1bnN0YWtpbmdJbnZvY2F0aW9uBRN1bnN0YWtpbmdJbnZvY2F0aW9uCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQN0b18FEGFtb3VudE5vcm1hbGl6ZWQJAQtfc3RyVG9Bc3NldAEFBmFzc2V0XwUDbmlsCQENX3NhdmVSZXNlcnZlcwIFBmFzc2V0XwULbmV3UmVzZXJ2ZXMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEGBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VucGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQELX3doZW5QYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEHBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVBhdXNlcgEHcGF1c2VyXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhx1cGRhdGVQYXVzZXI6IGludmFsaWQgcGF1c2VyBwMJAAACBQNlcnIFA2VycgkAlAoCCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF92YWxpZGF0ZUFkZHJlc3MCBQltdWx0aXNpZ18CHXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQlTRVBBUkFUT1IHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5JMA49A==", "height": 3044919, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8ZpwoXb6QNkssXRBiiiQA75wQC6cdwbpRagafWLKgM5e Next: EzydaTK6rzUmknGewLy9YWPQxjW3yL3SAZFYnmsB9YE9 Diff:
OldNewDifferences
343343
344344
345345 @Callable(i)
346-func requestWithdrawal (asset_,amount_) = {
347- let err = if (if (_whenInitialized())
348- then _validateAsset(asset_, "requestWithdrawal: invalid asset")
346+func requestWithdrawal (toChainId_,asset_,amount_) = {
347+ let err = if (if (if (_whenInitialized())
348+ then _validateInt(toChainId_, 0, MAX_INT, "requestWithdrawal: invalid toChainId")
349349 else false)
350- then _validateInt(amount_, 0, MAX_INT, "requestWithdrawal: negative amount")
350+ then _validateString(asset_, "requestWithdrawal: invalid asset")
351+ else false)
352+ then _validateInt(amount_, 1, MAX_INT, "requestWithdrawal: negative amount")
351353 else false
352354 if ((err == err))
353355 then {
354356 let caller = toString(i.caller)
355- let assetDecimals = _getDecimals(asset_)
356- let amount = _normalizeDecimals(amount_, assetDecimals, DEX_DECIMALS)
357- let err1 = _validateInt(amount, 1, MAX_INT, "requestWithdrawal: invalid amount")
358- if ((err1 == err1))
359- then {
360- let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), asset_, toString(amount)], nil) {
361- case a: Int =>
362- a
363- case _ =>
364- throw("requestWithdrawal: call reverted from gw")
365- }
366- if ((requestWithdrawalId == requestWithdrawalId))
367- then $Tuple2(nil, requestWithdrawalId)
368- else throw("Strict value is not equal to itself.")
369- }
357+ let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), toString(toChainId_), asset_, toString(amount_)], nil) {
358+ case a: Int =>
359+ a
360+ case _ =>
361+ throw("requestWithdrawal: call reverted from gw")
362+ }
363+ if ((requestWithdrawalId == requestWithdrawalId))
364+ then $Tuple2(nil, requestWithdrawalId)
370365 else throw("Strict value is not equal to itself.")
371366 }
372367 else throw("Strict value is not equal to itself.")
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
4444 let SWAVES_RATE_FACTOR = toBigInt(1000000000000)
4545
4646 func _validateAddress (address_,err_) = match addressFromString(address_) {
4747 case a: Address =>
4848 true
4949 case _ =>
5050 throw(err_)
5151 }
5252
5353
5454 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
5555 then true
5656 else match assetInfo(fromBase58String(assetId_)) {
5757 case a: Asset =>
5858 true
5959 case _ =>
6060 throw(err_)
6161 }
6262
6363
6464 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
6565 then true
6666 else (val_ > upperBoundary_))
6767 then throw(err_)
6868 else true
6969
7070
7171 func _validateString (val_,err_) = if (if ((0 >= size(val_)))
7272 then true
7373 else contains(val_, SEPARATOR))
7474 then throw(err_)
7575 else true
7676
7777
7878 func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
7979 then throw(err_)
8080 else true
8181
8282
8383 func _assetToStr (asset_) = match asset_ {
8484 case a: ByteVector =>
8585 toBase58String(a)
8686 case _ =>
8787 WAVES
8888 }
8989
9090
9191 func _strToAsset (asset_) = if ((asset_ == WAVES))
9292 then unit
9393 else fromBase58String(asset_)
9494
9595
9696 func _getDecimals (assetId_) = if ((assetId_ == WAVES))
9797 then WAVES_DECIMALS
9898 else match assetInfo(fromBase58String(assetId_)) {
9999 case a: Asset =>
100100 a.decimals
101101 case _ =>
102102 throw(("_getDecimals: no asset=" + assetId_))
103103 }
104104
105105
106106 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_) = if ((sourceDecimals_ >= targetDecimals_))
107107 then (amount_ / pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN))
108108 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
109109
110110
111111 func _loadInit () = match getBoolean(KEY_INIT) {
112112 case a: Boolean =>
113113 a
114114 case _ =>
115115 false
116116 }
117117
118118
119119 func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
120120
121121
122122 func _loadPause () = match getBoolean(KEY_PAUSED) {
123123 case a: Boolean =>
124124 a
125125 case _ =>
126126 false
127127 }
128128
129129
130130 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
131131
132132
133133 func _loadPauser () = match getString(KEY_PAUSER) {
134134 case a: String =>
135135 addressFromStringValue(a)
136136 case _ =>
137137 Address(base58'')
138138 }
139139
140140
141141 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
142142
143143
144144 func _loadMultisig () = match getString(KEY_MULTISIG) {
145145 case a: String =>
146146 addressFromStringValue(a)
147147 case _ =>
148148 Address(base58'')
149149 }
150150
151151
152152 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
153153
154154
155155 func _loadChainId () = match getInteger(KEY_CHAIN) {
156156 case a: Int =>
157157 a
158158 case _ =>
159159 0
160160 }
161161
162162
163163 func _saveChainId (chainId_) = [IntegerEntry(KEY_CHAIN, chainId_)]
164164
165165
166166 func _loadGatewayContract () = match getString(KEY_GATEWAY_CONTRACT) {
167167 case a: String =>
168168 addressFromStringValue(a)
169169 case _ =>
170170 Address(base58'')
171171 }
172172
173173
174174 func _saveGatewayContract (gatewayContract_) = [StringEntry(KEY_GATEWAY_CONTRACT, toString(gatewayContract_))]
175175
176176
177177 func _loadSWavesContract () = match getString(KEY_SWAVES_CONTRACT) {
178178 case a: String =>
179179 addressFromStringValue(a)
180180 case _ =>
181181 Address(base58'')
182182 }
183183
184184
185185 func _saveSWavesContract (sWavesContract_) = [StringEntry(KEY_SWAVES_CONTRACT, toString(sWavesContract_))]
186186
187187
188188 func _loadSWavesAsset (contract_) = match getString(contract_, KEY_SWAVES_ASSET) {
189189 case a: String =>
190190 fromBase58String(a)
191191 case _ =>
192192 throw("_loadSWavesAsset: revert")
193193 }
194194
195195
196196 func _loadReserves (asset_) = match getInteger(makeString([KEY_RESERVES, asset_], SEPARATOR)) {
197197 case a: Int =>
198198 a
199199 case _ =>
200200 0
201201 }
202202
203203
204204 func _saveReserves (asset_,reserves_) = [IntegerEntry(makeString([KEY_RESERVES, asset_], SEPARATOR), reserves_)]
205205
206206
207207 func _onlyThisContract (caller_) = if ((caller_ != this))
208208 then throw("_onlyThisContract: revert")
209209 else true
210210
211211
212212 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
213213 then throw("_whenMultisigSet: revert")
214214 else true
215215
216216
217217 func _whenNotInitialized () = if (_loadInit())
218218 then throw("_whenNotInitialized: revert")
219219 else true
220220
221221
222222 func _whenInitialized () = if (!(_loadInit()))
223223 then throw("_whenInitialized: revert")
224224 else true
225225
226226
227227 func _whenNotPaused () = if (_loadPause())
228228 then throw("_whenNotPaused: revert")
229229 else true
230230
231231
232232 func _whenPaused () = if (!(_loadPause()))
233233 then throw("_whenPaused: revert")
234234 else true
235235
236236
237237 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
238238 then throw("_onlyPauser: revert")
239239 else true
240240
241241
242242 func _validateGateway (caller,err_) = if ((_loadGatewayContract() != caller))
243243 then throw(err_)
244244 else true
245245
246246
247247 @Callable(i)
248248 func init (chainId_,pauser_,gatewayContract_,sWavesContract_) = {
249249 let err = if (if (if (if (if (if (_onlyThisContract(i.caller))
250250 then _whenNotInitialized()
251251 else false)
252252 then _whenMultisigSet()
253253 else false)
254254 then _validateInt(chainId_, 0, MAX_INT, "init: invalid chainId")
255255 else false)
256256 then _validateAddress(pauser_, "init: invalid pauser")
257257 else false)
258258 then _validateAddress(gatewayContract_, "init: invalid gatewayContract")
259259 else false)
260260 then _validateAddress(sWavesContract_, "init: invalid sWavesContract")
261261 else false
262262 if ((err == err))
263263 then $Tuple2(((((_saveInit(true) ++ _saveChainId(chainId_)) ++ _savePauser(addressFromStringValue(pauser_))) ++ _saveGatewayContract(addressFromStringValue(gatewayContract_))) ++ _saveSWavesContract(addressFromStringValue(sWavesContract_))), unit)
264264 else throw("Strict value is not equal to itself.")
265265 }
266266
267267
268268
269269 @Callable(i)
270270 func deposit () = {
271271 let err = if (if (if (_whenInitialized())
272272 then _whenNotPaused()
273273 else false)
274274 then _validatePaymentsSize(i.payments, 1, "deposit: no payment")
275275 else false)
276276 then _validateInt(i.payments[0].amount, 0, MAX_INT, "deposit: negative payment")
277277 else false
278278 if ((err == err))
279279 then {
280280 let caller = toString(i.caller)
281281 let asset = _assetToStr(i.payments[0].assetId)
282282 let assetDecimals = _getDecimals(asset)
283283 let amount = _normalizeDecimals(i.payments[0].amount, assetDecimals, DEX_DECIMALS)
284284 let err1 = _validateInt(amount, 1, MAX_INT, "deposit: invalid payment amount")
285285 if ((err1 == err1))
286286 then {
287287 let gatewayInvocation = invoke(_loadGatewayContract(), FUNC_DEPOSIT, [toString(this), caller, caller, toString(_loadChainId()), asset, toString(amount)], nil)
288288 if ((gatewayInvocation == gatewayInvocation))
289289 then {
290290 let stakingInvocation = if ((asset == WAVES))
291291 then invoke(_loadSWavesContract(), FUNC_DEPOSIT, nil, [AttachedPayment(unit, i.payments[0].amount)])
292292 else unit
293293 if ((stakingInvocation == stakingInvocation))
294294 then $Tuple2(_saveReserves(asset, (_loadReserves(asset) + amount)), unit)
295295 else throw("Strict value is not equal to itself.")
296296 }
297297 else throw("Strict value is not equal to itself.")
298298 }
299299 else throw("Strict value is not equal to itself.")
300300 }
301301 else throw("Strict value is not equal to itself.")
302302 }
303303
304304
305305
306306 @Callable(i)
307307 func depositTo (to_) = {
308308 let err = if (if (if (if (_whenInitialized())
309309 then _whenNotPaused()
310310 else false)
311311 then _validatePaymentsSize(i.payments, 1, "depositTo: no payment")
312312 else false)
313313 then _validateInt(i.payments[0].amount, 0, MAX_INT, "depositTo: negative payment")
314314 else false)
315315 then _validateString(to_, "depositTo: invalid to")
316316 else false
317317 if ((err == err))
318318 then {
319319 let caller = toString(i.caller)
320320 let asset = _assetToStr(i.payments[0].assetId)
321321 let assetDecimals = _getDecimals(asset)
322322 let amount = _normalizeDecimals(i.payments[0].amount, assetDecimals, DEX_DECIMALS)
323323 let err1 = _validateInt(amount, 1, MAX_INT, "depositTo: invalid payment amount")
324324 if ((err1 == err1))
325325 then {
326326 let gatewayInvocation = invoke(_loadGatewayContract(), FUNC_DEPOSIT, [toString(this), caller, to_, toString(_loadChainId()), asset, toString(amount)], nil)
327327 if ((gatewayInvocation == gatewayInvocation))
328328 then {
329329 let stakingInvocation = if ((asset == WAVES))
330330 then invoke(_loadSWavesContract(), FUNC_DEPOSIT, nil, [AttachedPayment(unit, i.payments[0].amount)])
331331 else unit
332332 if ((stakingInvocation == stakingInvocation))
333333 then $Tuple2(_saveReserves(asset, (_loadReserves(asset) + amount)), unit)
334334 else throw("Strict value is not equal to itself.")
335335 }
336336 else throw("Strict value is not equal to itself.")
337337 }
338338 else throw("Strict value is not equal to itself.")
339339 }
340340 else throw("Strict value is not equal to itself.")
341341 }
342342
343343
344344
345345 @Callable(i)
346-func requestWithdrawal (asset_,amount_) = {
347- let err = if (if (_whenInitialized())
348- then _validateAsset(asset_, "requestWithdrawal: invalid asset")
346+func requestWithdrawal (toChainId_,asset_,amount_) = {
347+ let err = if (if (if (_whenInitialized())
348+ then _validateInt(toChainId_, 0, MAX_INT, "requestWithdrawal: invalid toChainId")
349349 else false)
350- then _validateInt(amount_, 0, MAX_INT, "requestWithdrawal: negative amount")
350+ then _validateString(asset_, "requestWithdrawal: invalid asset")
351+ else false)
352+ then _validateInt(amount_, 1, MAX_INT, "requestWithdrawal: negative amount")
351353 else false
352354 if ((err == err))
353355 then {
354356 let caller = toString(i.caller)
355- let assetDecimals = _getDecimals(asset_)
356- let amount = _normalizeDecimals(amount_, assetDecimals, DEX_DECIMALS)
357- let err1 = _validateInt(amount, 1, MAX_INT, "requestWithdrawal: invalid amount")
358- if ((err1 == err1))
359- then {
360- let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), asset_, toString(amount)], nil) {
361- case a: Int =>
362- a
363- case _ =>
364- throw("requestWithdrawal: call reverted from gw")
365- }
366- if ((requestWithdrawalId == requestWithdrawalId))
367- then $Tuple2(nil, requestWithdrawalId)
368- else throw("Strict value is not equal to itself.")
369- }
357+ let requestWithdrawalId = match invoke(_loadGatewayContract(), FUNC_REQUEST_WITHDRAWAL, [toString(this), caller, caller, toString(_loadChainId()), toString(toChainId_), asset_, toString(amount_)], nil) {
358+ case a: Int =>
359+ a
360+ case _ =>
361+ throw("requestWithdrawal: call reverted from gw")
362+ }
363+ if ((requestWithdrawalId == requestWithdrawalId))
364+ then $Tuple2(nil, requestWithdrawalId)
370365 else throw("Strict value is not equal to itself.")
371366 }
372367 else throw("Strict value is not equal to itself.")
373368 }
374369
375370
376371
377372 @Callable(i)
378373 func executeWithdrawal (requestWithdrawalId_) = {
379374 let err = if (_whenInitialized())
380375 then _validateInt(requestWithdrawalId_, 0, MAX_INT, "executeWithdrawal: invalid requestId")
381376 else false
382377 if ((err == err))
383378 then {
384379 let gatewayInvocation = reentrantInvoke(_loadGatewayContract(), FUNC_EXECUTE_WITHDRAWAL, [toString(this), toString(_loadChainId()), toString(requestWithdrawalId_)], nil)
385380 if ((gatewayInvocation == gatewayInvocation))
386381 then $Tuple2(nil, unit)
387382 else throw("Strict value is not equal to itself.")
388383 }
389384 else throw("Strict value is not equal to itself.")
390385 }
391386
392387
393388
394389 @Callable(i)
395390 func withdraw (to_,asset_,amount_) = {
396391 let amount = valueOrErrorMessage(parseInt(amount_), "withdraw: amount not int")
397392 let err = if (if (if (if (_whenInitialized())
398393 then _validateGateway(i.caller, "withdraw: invalid gateway")
399394 else false)
400395 then _validateAddress(to_, "withdraw: invalid address")
401396 else false)
402397 then _validateAsset(asset_, "withdraw: invalid asset")
403398 else false)
404399 then _validateInt(amount, 0, MAX_INT, "withdraw: negative amount")
405400 else false
406401 if ((err == err))
407402 then {
408403 let assetDecimals = _getDecimals(asset_)
409404 let amountNormalized = _normalizeDecimals(amount, DEX_DECIMALS, assetDecimals)
410405 let newReserves = (_loadReserves(asset_) - amount)
411406 let err1 = if (_validateInt(amountNormalized, 1, MAX_INT, "withdraw: invalid amount"))
412407 then _validateInt(newReserves, 0, MAX_INT, "withdraw: negative newReserves")
413408 else false
414409 if ((err1 == err1))
415410 then {
416411 let unstakingInvocation = if ((asset_ == WAVES))
417412 then {
418413 let sWavesContract = _loadSWavesContract()
419414 let sWavesAsset = _loadSWavesAsset(sWavesContract)
420415 let invocation = invoke(sWavesContract, FUNC_GET_RATE, nil, nil)
421416 let rate = match invocation {
422417 case a: String =>
423418 parseBigIntValue(a)
424419 case _ =>
425420 throw("withdraw: sWaves getRate() revert")
426421 }
427422 let sWavesToWithdraw = toInt(fraction(toBigInt(amountNormalized), SWAVES_RATE_FACTOR, rate, CEILING))
428423 invoke(sWavesContract, FUNC_WITHDRAW, nil, [AttachedPayment(sWavesAsset, sWavesToWithdraw)])
429424 }
430425 else unit
431426 if ((unstakingInvocation == unstakingInvocation))
432427 then $Tuple2(([ScriptTransfer(addressFromStringValue(to_), amountNormalized, _strToAsset(asset_))] ++ _saveReserves(asset_, newReserves)), unit)
433428 else throw("Strict value is not equal to itself.")
434429 }
435430 else throw("Strict value is not equal to itself.")
436431 }
437432 else throw("Strict value is not equal to itself.")
438433 }
439434
440435
441436
442437 @Callable(i)
443438 func pause () = {
444439 let err = if (if (_onlyPauser(i.caller))
445440 then _whenInitialized()
446441 else false)
447442 then _whenNotPaused()
448443 else false
449444 if ((err == err))
450445 then $Tuple2(_savePause(true), unit)
451446 else throw("Strict value is not equal to itself.")
452447 }
453448
454449
455450
456451 @Callable(i)
457452 func unpause () = {
458453 let err = if (if (_onlyPauser(i.caller))
459454 then _whenInitialized()
460455 else false)
461456 then _whenPaused()
462457 else false
463458 if ((err == err))
464459 then $Tuple2(_savePause(false), unit)
465460 else throw("Strict value is not equal to itself.")
466461 }
467462
468463
469464
470465 @Callable(i)
471466 func updatePauser (pauser_) = {
472467 let err = if (if (_onlyThisContract(i.caller))
473468 then _whenInitialized()
474469 else false)
475470 then _validateAddress(pauser_, "updatePauser: invalid pauser")
476471 else false
477472 if ((err == err))
478473 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
479474 else throw("Strict value is not equal to itself.")
480475 }
481476
482477
483478
484479 @Callable(i)
485480 func setMultisig (multisig_) = {
486481 let err = if (_onlyThisContract(i.caller))
487482 then _validateAddress(multisig_, "setMultisig: invalid multisig")
488483 else false
489484 if ((err == err))
490485 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
491486 else throw("Strict value is not equal to itself.")
492487 }
493488
494489
495490 @Verifier(tx)
496491 func verify () = match getString(KEY_MULTISIG) {
497492 case multisig: String =>
498493 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
499494 case _ =>
500495 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
501496 }
502497

github/deemru/w8io/3ef1775 
61.30 ms