tx · GnP1mnZhHuB4famGD2RfhVUHoyRK1mq2a8h7jTReEaw2 3P5wA45whe3XB4ECK6UYofNM3uFHFxE4KTn: -0.04000000 Waves 2023.05.09 12:55 [3635653] smart account 3P5wA45whe3XB4ECK6UYofNM3uFHFxE4KTn > SELF 0.00000000 Waves
{ "type": 13, "id": "GnP1mnZhHuB4famGD2RfhVUHoyRK1mq2a8h7jTReEaw2", "fee": 4000000, "feeAssetId": null, "timestamp": 1683626209670, "version": 2, "chainId": 87, "sender": "3P5wA45whe3XB4ECK6UYofNM3uFHFxE4KTn", "senderPublicKey": "77PTtvVsSSK5NDQN4NdKYYvRFDV34gUPe5hMXgrCQg1B", "proofs": [ "5fFbciLhtULHQmRkdbHccLqgaTZ4VCpe8mTMDBTYwhcryWHrv4NNqvto7WTguTVSdtLzyBPY5ZULi9fWmQ1T3GKf" ], "script": "base64:BgJ5CAISABIAEgMKAQESABIDCgEBEgYKBAEICAgSBAoCCAESBAoCCAESBAoCCAESBAoCCAESBAoCCAESBAoCCAESBAoCCAESBAoCCAESCAoGCAgICAgBEggKBggICAgIARIICgYICAgICAESCAoGCAgICAgBEgMKAQgSAHoABVRPS0VOASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QAJZmVlX3NjYWxlAMCEPQACdzEEByRtYXRjaDAJAJ0IAgUEdGhpcwICdzEDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFyBQckbWF0Y2gwBQFyAgAAAncyBAckbWF0Y2gwCQCdCAIFBHRoaXMCAncyAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcgUHJG1hdGNoMAUBcgIAAA1VU0ROX0FTU0VUX0lEASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QAMV1hfU1dBUF9EQVBQCQEHQWRkcmVzcwEBGgFXLio1NbENt/F5PuG3RtCedFJNezHQg64GAAlhc3NldHNfaW4JAMwIAgIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAFA25pbAEIZ2V0QmFzZTEBBGRhdGEEBnBfZGF0YQkAvAkCBQRkYXRhAgFfBAFhCQCRAwIFBnBfZGF0YQAABAJhMgkAkQMCBQZwX2RhdGEAAQQHYXNzZXRJbgkAkQMCBQlhc3NldHNfaW4JAQV2YWx1ZQEJALYJAQkAkQMCBQZwX2RhdGEAAgQIYW1vdW50SW4JAJEDAgUGcF9kYXRhAAMJAJYKBAUBYQUCYTIFB2Fzc2V0SW4FCGFtb3VudEluAQhnZXRCYXNlMgEEZGF0YQQGcF9kYXRhCQC1CQIFBGRhdGECAV8EAnAxCQCRAwIFBnBfZGF0YQAABAF0CQCRAwIFBnBfZGF0YQABCQCUCgIFAnAxBQF0AQ1nZXRBc3NldEJ5dGVzAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBB3N3YXBfd3gEAXAFYXNzZXQGYW1vdW50AWEEBGNhbGwJAPwHBAUMV1hfU1dBUF9EQVBQAgRzd2FwCQDMCAIAAQkAzAgCBQFhCQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0QXNzZXRCeXRlcwEFBWFzc2V0BQZhbW91bnQFA25pbAMJAAACBQRjYWxsBQRjYWxsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCXN3YXBfc3dvcAMBcAVhc3NldAZhbW91bnQEBHN3YXAJAPwHBAkBB0FkZHJlc3MBCQDZBAEFAXACCGV4Y2hhbmdlCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0QXNzZXRCeXRlcwEFBWFzc2V0BQZhbW91bnQFA25pbAMJAAACBQRzd2FwBQRzd2FwBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BC3N3YXBfcHV6emxlBAFwBWFzc2V0BmFtb3VudAhhc3NldE91dAQEc3dhcAkA/AcECQEHQWRkcmVzcwEJANkEAQUBcAIEc3dhcAkAzAgCBQhhc3NldE91dAkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEFzc2V0Qnl0ZXMBBQVhc3NldAUGYW1vdW50BQNuaWwDCQAAAgUEc3dhcAUEc3dhcAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQZ1Y2hlY2sBAmlkBAckbWF0Y2gwCQDpBwEFAmlkAwkAAQIFByRtYXRjaDACA0ludAQBaAUHJG1hdGNoMAUBaAAAAAZTY2FsZTYAwIQ9AAxTY2FsZTZCaWdJbnQJALYCAQUGU2NhbGU2AAZTY2FsZTgAgMLXLwAMU2NhbGU4QmlnSW50CQC2AgEFBlNjYWxlOAAKWmVyb0JpZ0ludAkAtgIBAAAAA1NFUAICX18AB0luU2NhbGUAgMLXLwAKSW5EZWNpbWFscwAIAA1JblNjYWxlQmlnSW50CQC2AgEFB0luU2NhbGUAB0luQXNzZXQFBHVuaXQACkluQXNzZXRTdHICBVdBVkVTAA13eFN3YXBBZGRyZXNzCQEHQWRkcmVzcwEBGgFXLio1NbENt/F5PuG3RtCedFJNezHQg64GAA50aGlzQWRkcmVzc1N0cgkApQgBBQR0aGlzAQxnZXRJbnRPclplcm8BA2tleQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQNrZXkAAAEKZ2V0QmFsYW5jZQEFYXNzZXQDCQAAAgUFYXNzZXQFBHVuaXQICQDvBwEFBHRoaXMHcmVndWxhcgkA8AcCBQR0aGlzCQEFdmFsdWUBBQVhc3NldAEPZ2V0QXNzZXRPcldhdmVzAQhhc3NldFN0cgMJAAACBQhhc3NldFN0cgIFV0FWRVMFBHVuaXQJANkEAQUIYXNzZXRTdHIACWluQmFsYW5jZQkBCmdldEJhbGFuY2UBBQdJbkFzc2V0AA9pbkJhbGFuY2VCaWdJbnQJALYCAQUJaW5CYWxhbmNlAQtnZXRTd29wUG9vbAEEcG9vbAQLYXNzZXRJZEFTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCCkFfYXNzZXRfaWQEC2Fzc2V0SWRCU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sAgpCX2Fzc2V0X2lkBAhhc3NldElkQQkBD2dldEFzc2V0T3JXYXZlcwEFC2Fzc2V0SWRBU3RyBAhhc3NldElkQgkBD2dldEFzc2V0T3JXYXZlcwEFC2Fzc2V0SWRCU3RyBAhiYWxhbmNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAIPQV9hc3NldF9iYWxhbmNlBAhiYWxhbmNlQgkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAIPQl9hc3NldF9iYWxhbmNlBAZvdXRGZWUJALgCAgUMU2NhbGU2QmlnSW50CQC2AgEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHBvb2wCCmNvbW1pc3Npb24JAJsKCQkAtgIBBQhiYWxhbmNlQQkAtgIBBQhiYWxhbmNlQgUIYXNzZXRJZEEFCGFzc2V0SWRCBQthc3NldElkQVN0cgULYXNzZXRJZEJTdHIFDFNjYWxlNkJpZ0ludAUGb3V0RmVlBQRwb29sARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgINc3Rha2VkQmFsYW5jZQkAzAgCBQdhc3NldElkBQNuaWwFA1NFUAEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIRc2hhcmVBc3NldEJhbGFuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAgRwb29sB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEcG9vbAkBFGtleUFkZGl0aW9uYWxCYWxhbmNlAQUHYXNzZXRJZAAAARxnZXRTdGFraW5nQXNzZXRCYWxhbmNlT3JaZXJvAgRwb29sB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEcG9vbAkBFmtleVN0YWtpbmdBc3NldEJhbGFuY2UBBQdhc3NldElkAAABE2dldFd4QWNjb3VudEJhbGFuY2UCBHBvb2wHYXNzZXRJZAQNYmFsYW5jZU9uUG9vbAMJAAACBQdhc3NldElkAgVXQVZFUwgJAO8HAQUEcG9vbAlhdmFpbGFibGUJAPAHAgUEcG9vbAkA2QQBBQdhc3NldElkBAx0b3RhbEJhbGFuY2UJAGUCCQBkAgUNYmFsYW5jZU9uUG9vbAkBGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAgUEcG9vbAUHYXNzZXRJZAkBHGdldFN0YWtpbmdBc3NldEJhbGFuY2VPclplcm8CBQRwb29sBQdhc3NldElkCQCWAwEJAMwIAgAACQDMCAIFDHRvdGFsQmFsYW5jZQUDbmlsAQlnZXRXeFBvb2wBBHBvb2wEC2Fzc2V0SWRBU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sAg8lc19fYW1vdW50QXNzZXQEC2Fzc2V0SWRCU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sAg4lc19fcHJpY2VBc3NldAQIYXNzZXRJZEEJAQ9nZXRBc3NldE9yV2F2ZXMBBQthc3NldElkQVN0cgQIYXNzZXRJZEIJAQ9nZXRBc3NldE9yV2F2ZXMBBQthc3NldElkQlN0cgQIYmFsYW5jZUEJARNnZXRXeEFjY291bnRCYWxhbmNlAgUEcG9vbAULYXNzZXRJZEFTdHIECGJhbGFuY2VCCQETZ2V0V3hBY2NvdW50QmFsYW5jZQIFBHBvb2wFC2Fzc2V0SWRCU3RyBAtwcm90b2NvbEZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUNd3hTd2FwQWRkcmVzcwIPJXNfX3Byb3RvY29sRmVlBAdwb29sRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ13eFN3YXBBZGRyZXNzAgslc19fcG9vbEZlZQQFaW5GZWUJALgCAgUMU2NhbGU2QmlnSW50CQC8AgMJALYCAQkAZAIFC3Byb3RvY29sRmVlBQdwb29sRmVlBQxTY2FsZTZCaWdJbnQFDFNjYWxlOEJpZ0ludAkAmwoJCQC2AgEFCGJhbGFuY2VBCQC2AgEFCGJhbGFuY2VCBQhhc3NldElkQQUIYXNzZXRJZEIFC2Fzc2V0SWRBU3RyBQthc3NldElkQlN0cgUFaW5GZWUFDFNjYWxlNkJpZ0ludAUNd3hTd2FwQWRkcmVzcwEIY2FsY1N3YXAFCXBtdEFtb3VudAl0b2tlbkZyb20HdG9rZW5UbwVpbkZlZQZvdXRGZWUEC2NsZWFuQW1vdW50CQC8AgMFCXBtdEFtb3VudAUFaW5GZWUFDFNjYWxlNkJpZ0ludAQQYW1vdW50V2l0aG91dEZlZQkAvAIDBQd0b2tlblRvBQtjbGVhbkFtb3VudAkAtwICBQtjbGVhbkFtb3VudAUJdG9rZW5Gcm9tBA1hbW91bnRXaXRoRmVlCQC8AgMFEGFtb3VudFdpdGhvdXRGZWUFBm91dEZlZQUMU2NhbGU2QmlnSW50BQ1hbW91bnRXaXRoRmVlAQxlc3RpbWF0ZVN3YXADCHBvb2xJbmZvB2luQXNzZXQIaW5BbW91bnQECXJvdXRlQXJncwMJAAACBQdpbkFzc2V0CAUIcG9vbEluZm8CXzMJAJUKAwgFCHBvb2xJbmZvAl80CAUIcG9vbEluZm8CXzYJAQhjYWxjU3dhcAUFCGluQW1vdW50CAUIcG9vbEluZm8CXzEIBQhwb29sSW5mbwJfMggFCHBvb2xJbmZvAl83CAUIcG9vbEluZm8CXzgJAJUKAwgFCHBvb2xJbmZvAl8zCAUIcG9vbEluZm8CXzUJAQhjYWxjU3dhcAUFCGluQW1vdW50CAUIcG9vbEluZm8CXzIIBQhwb29sSW5mbwJfMQgFCHBvb2xJbmZvAl83CAUIcG9vbEluZm8CXzgECGRhcHBBcmdzAwkAAAIIBQhwb29sSW5mbwJfOQUNd3hTd2FwQWRkcmVzcwkAlAoCAgRzd2FwCQDMCAIAAAkAzAgCCAUJcm91dGVBcmdzAl8yCQDMCAIFDnRoaXNBZGRyZXNzU3RyBQNuaWwJAJQKAgIIZXhjaGFuZ2UJAMwIAgABBQNuaWwJAJYKBAgFCXJvdXRlQXJncwJfMQgFCXJvdXRlQXJncwJfMwgFCGRhcHBBcmdzAl8xCAUIZGFwcEFyZ3MCXzIBDWVzdGltYXRlUm91dGUGBXBvb2wxBXBvb2wyBXBvb2wzDHBvb2wxUmV2ZXJzZQxwb29sMlJldmVyc2UMcG9vbDNSZXZlcnNlBANhMTIDBQxwb29sMVJldmVyc2UIBQVwb29sMQJfMggFBXBvb2wxAl8xBANhMjEDBQxwb29sMVJldmVyc2UIBQVwb29sMQJfMQgFBXBvb2wxAl8yBANhMjMDBQxwb29sMlJldmVyc2UIBQVwb29sMgJfMggFBXBvb2wyAl8xBANhMzIDBQxwb29sMlJldmVyc2UIBQVwb29sMgJfMQgFBXBvb2wyAl8yBANhMzEDBQxwb29sM1JldmVyc2UIBQVwb29sMwJfMggFBXBvb2wzAl8xBANhMTMDBQxwb29sM1JldmVyc2UIBQVwb29sMwJfMQgFBXBvb2wzAl8yBA1hYURlbm9taW5hdG9yCQC3AgIFA2EyMwkAvAIDCQC8AgMFA2EyMQgFBXBvb2wxAl84BQxTY2FsZTZCaWdJbnQIBQVwb29sMgJfNwUMU2NhbGU2QmlnSW50BARhYTEzCQC8AgMFA2ExMgUDYTIzBQ1hYURlbm9taW5hdG9yBARhYTMxCQC8AgMJALwCAwkAvAIDBQNhMjEFA2EzMgUNYWFEZW5vbWluYXRvcggFBXBvb2wyAl83BQxTY2FsZTZCaWdJbnQIBQVwb29sMgJfOAUMU2NhbGU2QmlnSW50BAxhRGVub21pbmF0b3IJALcCAgUDYTMxCQC8AgMJALwCAwUEYWEzMQgFBXBvb2wxAl83BQxTY2FsZTZCaWdJbnQIBQVwb29sMQJfOAUMU2NhbGU2QmlnSW50BAFhCQC8AgMFBGFhMTMFA2EzMQUMYURlbm9taW5hdG9yBAJhYQkAvAIDCQC8AgMJALwCAwUEYWEzMQUDYTEzBQxhRGVub21pbmF0b3IIBQVwb29sMwJfNwUMU2NhbGU2QmlnSW50CAUFcG9vbDMCXzgFDFNjYWxlNkJpZ0ludAQFZGVsdGEJALwCAwkAuAICCQEKc3FydEJpZ0ludAQJALwCAwkAvAIDCQC8AgMFAmFhBQFhBQ1JblNjYWxlQmlnSW50CAUFcG9vbDECXzcFDFNjYWxlNkJpZ0ludAgFBXBvb2wxAl84BQxTY2FsZTZCaWdJbnQFCkluRGVjaW1hbHMFCkluRGVjaW1hbHMFB0NFSUxJTkcFAWEFDFNjYWxlNkJpZ0ludAgFBXBvb2wxAl83AwkAwAICBQpaZXJvQmlnSW50BQVkZWx0YQkAlAoCAAAFA25pbAQFaW5wdXQDCQC/AgIFBWRlbHRhBQ9pbkJhbGFuY2VCaWdJbnQFD2luQmFsYW5jZUJpZ0ludAUFZGVsdGEEBXN3YXAxCQEMZXN0aW1hdGVTd2FwAwUFcG9vbDEFB0luQXNzZXQFBWlucHV0BAVzd2FwMgkBDGVzdGltYXRlU3dhcAMFBXBvb2wyCAUFc3dhcDECXzEIBQVzd2FwMQJfMgQFc3dhcDMJAQxlc3RpbWF0ZVN3YXADBQVwb29sMwgFBXN3YXAyAl8xCAUFc3dhcDICXzIJAJQKAgkAoAMBCQC4AgIIBQVzd2FwMwJfMgUFaW5wdXQJAMwIAgkAlwoFCAUFcG9vbDECXzkIBQVzd2FwMQJfMwgFBXN3YXAxAl80BQdJbkFzc2V0CQCgAwEFBWlucHV0CQDMCAIJAJcKBQgFBXBvb2wyAl85CAUFc3dhcDICXzMIBQVzd2FwMgJfNAgFBXN3YXAxAl8xCQCgAwEIBQVzd2FwMQJfMgkAzAgCCQCXCgUIBQVwb29sMwJfOQgFBXN3YXAzAl8zCAUFc3dhcDMCXzQIBQVzd2FwMgJfMQkAoAMBCAUFc3dhcDICXzIFA25pbAEKaW52b2tlU3dhcAEEYXJncwQOY3VycmVudEJhbGFuY2UJAQpnZXRCYWxhbmNlAQgFBGFyZ3MCXzQEDXRyaW1tZWRBbW91bnQDCQBmAggFBGFyZ3MCXzUFDmN1cnJlbnRCYWxhbmNlBQ5jdXJyZW50QmFsYW5jZQgFBGFyZ3MCXzUEDHJlc3VsdEFtb3VudAMJAAACCAUEYXJncwJfNAUHSW5Bc3NldAUNdHJpbW1lZEFtb3VudAMJAGYCBQ5jdXJyZW50QmFsYW5jZQgFBGFy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eF93eF94dG4JAQlnZXRXeFBvb2wBCQEHQWRkcmVzcwEBGgFXcP/GLmZEDfQ7+dCMZc3p0TNjnM9yD+GcAAZyb3V0ZXMJAMwIAgkAmAoGBQx3eF93YXZlc194dG4FCXd4X3d4X3h0bgULd3hfd3hfd2F2ZXMHBgcJAMwIAgkAmAoGBQt3eF93eF93YXZlcwUJd3hfd3hfeHRuBQx3eF93YXZlc194dG4GBwYJAMwIAgkAmAoGBQx3eF93YXZlc194dG4FDXd4X2J0Y3d4Z194dG4FD3d4X3dhdmVzX2J0Y3d4ZwcGBgkAzAgCCQCYCgYFD3d4X3dhdmVzX2J0Y3d4ZwUNd3hfYnRjd3hnX3h0bgUMd3hfd2F2ZXNfeHRuBwcGCQDMCAIJAJgKBgUMd3hfd2F2ZXNfeHRuBQ13eF9ldGh3eGdfeHRuBQ93eF9ldGh3eGdfd2F2ZXMHBgcJAMwIAgkAmAoGBQ93eF9ldGh3eGdfd2F2ZXMFDXd4X2V0aHd4Z194dG4FDHd4X3dhdmVzX3h0bgYHBgkAzAgCCQCYCgYFDHd4X3dhdmVzX3h0bgUMc3dvcF9wd3JfeHRuBQx3eF9wd3Jfd2F2ZXMHBgcJAMwIAgkAmAoGBQx3eF9wd3Jfd2F2ZXMFDHN3b3BfcHdyX3h0bgUMd3hfd2F2ZXNfeHRuBgcGCQDMCAIJAJgKBgUNd3hfc3VyZl93YXZlcwUPd3hfc3VyZl91c2R0d3hnBRB3eF93YXZlc191c2R0d3hnBgcGCQDMCAIJAJgKBgUQd3hfd2F2ZXNfdXNkdHd4ZwUPd3hfc3VyZl91c2R0d3hnBQ13eF9zdXJmX3dhdmVzBwYHCQDMCAIJAJgKBgUNd3hfc3VyZl93YXZlcwUPd3hfc3VyZl91c2Rjd3hnBRB3eF93YXZlc191c2Rjd3hnBgcGCQDMCAIJAJgKBgUQd3hfd2F2ZXNfdXNkY3d4ZwUPd3hfc3VyZl91c2Rjd3hnBQ13eF9zdXJmX3dhdmVzBwYHCQDMCAIJAJgKBgULd3hfd3hfd2F2ZXMFDXd4X3d4X3VzZHR3eGcFEHd4X3dhdmVzX3VzZHR3eGcGBwYJAMwIAgkAmAoGBRB3eF93YXZlc191c2R0d3hnBQ13eF93eF91c2R0d3hnBQt3eF93eF93YXZlcwcGBwkAzAgCCQCYCgYFDHd4X3dhdmVzX3h0bgULd3hfbnNidF94dG4FDXd4X25zYnRfd2F2ZXMHBgcJAMwIAgkAmAoGBQ13eF9uc2J0X3dhdmVzBQt3eF9uc2J0X3h0bgUMd3hfd2F2ZXNfeHRuBgcGCQDMCAIJAJgKBgUMd3hfd2F2ZXNfeHRuBQ13eF9zd2F2ZXNfeHRuBQ93eF9zd2F2ZXNfd2F2ZXMHBgcJAMwIAgkAmAoGBQ93eF9zd2F2ZXNfd2F2ZXMFDXd4X3N3YXZlc194dG4FDHd4X3dhdmVzX3h0bgYHBgkAzAgCCQCYCgYFDHd4X3dhdmVzX3h0bgUMd3hfdmlyZXNfeHRuBQ53eF92aXJlc193YXZlcwcGBwkAzAgCCQCYCgYFDnd4X3ZpcmVzX3dhdmVzBQx3eF92aXJlc194dG4FDHd4X3dhdmVzX3h0bgYHBgkAzAgCCQCYCgYFDHd4X3dhdmVzX3h0bgUOd3hfdXNkdHBwdF94dG4FEHd4X3dhdmVzX3VzZHRwcHQHBgYJAMwIAgkAmAoGBRB3eF93YXZlc191c2R0cHB0BQ53eF91c2R0cHB0X3h0bgUMd3hfd2F2ZXNfeHRuBwcGCQDMCAIJAJgKBgUQd3hfd2F2ZXNfdXNkdHBwdAURd3hfZXRocHB0X3VzZHRwcHQFD3d4X2V0aHBwdF93YXZlcwcGBwkAzAgCCQCYCgYFD3d4X2V0aHBwdF93YXZlcwURd3hfZXRocHB0X3VzZHRwcHQFEHd4X3dhdmVzX3VzZHRwcHQGBwYFA25pbBQBaQEBcwADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgRzZWxmCQDMCAIJAQtTdHJpbmdFbnRyeQICB2N1cnJlbnQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsAWkBAWUAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIEc2VsZgkAzAgCCQELRGVsZXRlRW50cnkBAgdjdXJyZW50BQNuaWwBaQECc2YBA2ZlZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECBHNlbGYJAMwIAgkBDEludGVnZXJFbnRyeQICA2ZlZQUDZmVlBQNuaWwBaQEBZAADCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQC8CQIFAncxAgF8CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJAAIBAgJ3bAQHY3VycmVudAQHJG1hdGNoMAkAnQgCBQR0aGlzAgdjdXJyZW50AwkAAQIFByRtYXRjaDACBlN0cmluZwQDcmV0BQckbWF0Y2gwCQACAQIHY3VycmVudAIABANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAhIxIHBheW1lbnQgZXhwZWN0ZWQDCQECIT0CCAUDcG10B2Fzc2V0SWQFBVRPS0VOCQACAQILd3JvbmcgdG9rZW4EBmNhbGxlcgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBA1jdXJyZW50QW1vdW50BAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgIIZGVwb3NpdF8FBmNhbGxlcgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQMdG90YWxEZXBvc2l0BAckbWF0Y2gwCQCaCAIFBHRoaXMCDXRvdGFsX2RlcG9zaXQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAECW5ld0Ftb3VudAkAZAIFDWN1cnJlbnRBbW91bnQIBQNwbXQGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICCGRlcG9zaXRfBQZjYWxsZXIFCW5ld0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgINdG90YWxfZGVwb3NpdAkAZAIFDHRvdGFsRGVwb3NpdAgFA3BtdAZhbW91bnQFA25pbAFpAQF3AQRhbW50AwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQICd2wEB2N1cnJlbnQEByRtYXRjaDAJAJ0IAgUEdGhpcwIHY3VycmVudAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA3JldAUHJG1hdGNoMAkAAgECB2N1cnJlbnQCAAQGY2FsbGVyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEDWN1cnJlbnRBbW91bnQEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICAghkZXBvc2l0XwUGY2FsbGVyAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAwkAZgIFBGFtbnQFDWN1cnJlbnRBbW91bnQJAAIBAgV3ID4gZAQJbmV3QW1vdW50CQBlAgUNY3VycmVudEFtb3VudAUEYW1udAMJAGYCAAAFCW5ld0Ftb3VudAkAAgECCXVuZGVyZmxvdwQMdG90YWxEZXBvc2l0BAckbWF0Y2gwCQCaCAIFBHRoaXMCDXRvdGFsX2RlcG9zaXQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIIZGVwb3NpdF8FBmNhbGxlcgUJbmV3QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCAg10b3RhbF9kZXBvc2l0CQBlAgUMdG90YWxEZXBvc2l0BQRhbW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUEYW1udAUFVE9LRU4FA25pbAFpAQF4BARhbW50AWEBZgRkYXRhAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQICd2wEAnN0CQDwBwIFBHRoaXMFBVRPS0VOAwkAAAIFAnN0BQJzdAQCaWkJAP0HBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQUBZgkAzAgCBQRkYXRhBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBVRPS0VOBQRhbW50BQNuaWwDCQAAAgUCaWkFAmlpBAJldAkA8AcCBQR0aGlzBQVUT0tFTgMJAAACBQJldAUCZXQEBWZlZV9yBAckbWF0Y2gwCQCaCAIFBHRoaXMCA2ZlZQMJAAECBQckbWF0Y2gwAgNJbnQEA3JldAUHJG1hdGNoMAUDcmV0AAAEA2ZlZQkAbgQFAnN0BQVmZWVfcgUJZmVlX3NjYWxlBQRET1dOAwkAZgIJAGQCBQJzdAUDZmVlBQJldAkAAgEJAKwCAgICISAJAKQDAQkAZAIFAnN0BQNmZWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhhcmJXYXZlcwIEcGF0aAZhbW91bnQEC3Bvb2xBZGRyZXNzAiMzUFBaV2dGTlJLSEx2TTUxcHdTOTM0QzhWWjdkMkY0WjU4ZwQEcG9vbAkBEUBleHRyTmF0aXZlKDEwNjIpAQULcG9vbEFkZHJlc3MEC3VzZG5Bc3NldElkASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QQRdXNkbkFzc2V0SWRTdHJpbmcCLERHMnhGa1BkRHdLVW9Ca3pHQWhRdExwU0d6ZlhMaUNZUEV6ZUtIMkFkMjRwBBd1c2RuV2F2ZXNMUFRva2VuQXNzZXRJZAEgXedtbkamxzmxtK4hQ1NqaJeqmQ+fWxX6vGpRDRxJGSAEEXB1enpsZVBvb2xBZGRyZXNzAiMzUEdGSHpWR1Q0TlRpZ3dDS1AxTmN3b1hrb2RWWnd2QnV1VQQKcHV6emxlUG9vbAkBEUBleHRyTmF0aXZlKDEwNjIpAQURcHV6emxlUG9vbEFkZHJlc3MDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAht5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIGFyYiEEE2luaXRpYWxXYXZlc0JhbGFuY2UICQDvBwEFBHRoaXMJYXZhaWxhYmxlAwkAAAIFE2luaXRpYWxXYXZlc0JhbGFuY2UFE2luaXRpYWxXYXZlc0JhbGFuY2UEDWluaXRpYWxBbW91bnQJAPAHAgUEdGhpcwULdXNkbkFzc2V0SWQDCQAAAgUNaW5pdGlhbEFtb3VudAUNaW5pdGlhbEFtb3VudAQLYnV5T25QdXp6bGUJAPwHBAUKcHV6emxlUG9vbAIEc3dhcAkAzAgCBQRwYXRoCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt1c2RuQXNzZXRJZAkAaAIFBmFtb3VudADAhD0FA25pbAMJAAACBQtidXlPblB1enpsZQULYnV5T25QdXp6bGUEEXdhdmVzVG9rZW5CYWxhbmNlCQBlAggJAO8HAQUEdGhpcwlhdmFpbGFibGUFE2luaXRpYWxXYXZlc0JhbGFuY2UDCQAAAgURd2F2ZXNUb2tlbkJhbGFuY2UFEXdhdmVzVG9rZW5CYWxhbmNlBBRwdXRUaGVUb2tlbkluVGhlUG9vbAkA/AcEBQRwb29sAglwdXRPbmVUa24JAMwIAgABCQDMCAIHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFEXdhdmVzVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUUcHV0VGhlVG9rZW5JblRoZVBvb2wFFHB1dFRoZVRva2VuSW5UaGVQb29sBA5scFRva2VuQmFsYW5jZQkA8AcCBQR0aGlzBRd1c2RuV2F2ZXNMUFRva2VuQXNzZXRJZAMJAAACBQ5scFRva2VuQmFsYW5jZQUObHBUb2tlbkJhbGFuY2UEDXNlbGxQb29sVG9rZW4JAPwHBAUEcG9vbAIJZ2V0T25lVGtuCQDMCAIFEXVzZG5Bc3NldElkU3RyaW5nCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBRd1c2RuV2F2ZXNMUFRva2VuQXNzZXRJZAUObHBUb2tlbkJhbGFuY2UFA25pbAMJAAACBQ1zZWxsUG9vbFRva2VuBQ1zZWxsUG9vbFRva2VuBAtmaW5hbEFtb3VudAkA8AcCBQR0aGlzBQt1c2RuQXNzZXRJZAMJAAACBQtmaW5hbEFtb3VudAULZmluYWxBbW91bnQDCQBnAgUNaW5pdGlhbEFtb3VudAULZmluYWxBbW91bnQJAAIBAhNhcmIgbm90IHN1Y2Nlc3NmdWwhBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJYXJiV2F2ZXMyAgRwYXRoBmFtb3VudAQLcG9vbEFkZHJlc3MCIzNQUFpXZ0ZOUktITHZNNTFwd1M5MzRDOFZaN2QyRjRaNThnBARwb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBQtwb29sQWRkcmVzcwQLdXNkbkFzc2V0SWQBILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRBBF1c2RuQXNzZXRJZFN0cmluZwIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAEF3VzZG5XYXZlc0xQVG9rZW5Bc3NldElkASBd521uRqbHObG0riFDU2pol6qZD59bFfq8alENHEkZIAQRcHV6emxlUG9vbEFkZHJlc3MCIzNQR0ZIelZHVDROVGlnd0NLUDFOY3dvWGtvZFZad3ZCdXVVBApwdXp6bGVQb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBRFwdXp6bGVQb29sQWRkcmVzcwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECG3lvdSBhcmUgbm90IGFsbG93ZWQgdG8gYXJiIQQTaW5pdGlhbFdhdmVzQmFsYW5jZQgJAO8HAQUEdGhpcwlhdmFpbGFibGUDCQAAAgUTaW5pdGlhbFdhdmVzQmFsYW5jZQUTaW5pdGlhbFdhdmVzQmFsYW5jZQQNaW5pdGlhbEFtb3VudAkA8AcCBQR0aGlzBQt1c2RuQXNzZXRJZAMJAAACBQ1pbml0aWFsQW1vdW50BQ1pbml0aWFsQW1vdW50BBRwdXRUaGVUb2tlbkluVGhlUG9vbAkA/AcEBQRwb29sAglwdXRPbmVUa24JAMwIAgABCQDMCAIHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3VzZG5Bc3NldElkCQBoAgUGYW1vdW50AMCEPQUDbmlsAwkAAAIFFHB1dFRoZVRva2VuSW5UaGVQb29sBRRwdXRUaGVUb2tlbkluVGhlUG9vbAQObHBUb2tlbkJhbGFuY2UJAPAHAgUEdGhpcwUXdXNkbldhdmVzTFBUb2tlbkFzc2V0SWQDCQAAAgUObHBUb2tlbkJhbGFuY2UFDmxwVG9rZW5CYWxhbmNlBA1zZWxsUG9vbFRva2VuCQD8BwQFBHBvb2wCCWdldE9uZVRrbgkAzAgCAgVXQVZFUwkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUXdXNkbldhdmVzTFBUb2tlbkFzc2V0SWQFDmxwVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUNc2VsbFBvb2xUb2tlbgUNc2VsbFBvb2xUb2tlbgQRd2F2ZXNUb2tlbkJhbGFuY2UJAGUCCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQUTaW5pdGlhbFdhdmVzQmFsYW5jZQMJAAACBRF3YXZlc1Rva2VuQmFsYW5jZQURd2F2ZXNUb2tlbkJhbGFuY2UEDHNlbGxPblB1enpsZQkA/AcEBQpwdXp6bGVQb29sAgRzd2FwCQDMCAIFBHBhdGgJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFEXdhdmVzVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUMc2VsbE9uUHV6emxlBQxzZWxsT25QdXp6bGUEC2ZpbmFsQW1vdW50CQDwBwIFBHRoaXMFC3VzZG5Bc3NldElkAwkAAAIFC2ZpbmFsQW1vdW50BQtmaW5hbEFtb3VudAMJAGcCBQ1pbml0aWFsQW1vdW50BQtmaW5hbEFtb3VudAkAAgECE2FyYiBub3Qgc3VjY2Vzc2Z1bCEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdhcmJVU0RDAgRwYXRoBmFtb3VudAQLcG9vbEFkZHJlc3MCIzNQQzNIdHVwQnhCbXk0V3RaZjFUeW0xdnJ4ZzlNd2JaUksxBARwb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBQtwb29sQWRkcmVzcwQLdXNkbkFzc2V0SWQBILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRBBF1c2RuQXNzZXRJZFN0cmluZwIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAEEXVzZGNBc3NldElkU3RyaW5nAiw2WHRIanBYYnM5UlJKUDJTcjlHVXlWcXpBQ2NieTlUa1RoSFhualZDNUNESgQLdXNkY0Fzc2V0SWQBIFIz2eGXiCbl4h/C/eqINLiHdqOMsYPvyGAcfgoSVCYlBBZ1c2RuVXNkY0xQVG9rZW5Bc3NldElkASADaQH8GwqYCojNj/4RWYWFJpEys1qS/CbpSF3Tn95cdgQRcHV6emxlUG9vbEFkZHJlc3MCIzNQR0ZIelZHVDROVGlnd0NLUDFOY3dvWGtvZFZad3ZCdXVVBApwdXp6bGVQb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBRFwdXp6bGVQb29sQWRkcmVzcwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECG3lvdSBhcmUgbm90IGFsbG93ZWQgdG8gYXJiIQQNaW5pdGlhbEFtb3VudAkA8AcCBQR0aGlzBQt1c2RuQXNzZXRJZAMJAAACBQ1pbml0aWFsQW1vdW50BQ1pbml0aWFsQW1vdW50BBFpbml0aWFsQW1vdW50VVNEQwkA8AcCBQR0aGlzBQt1c2RjQXNzZXRJZAMJAAACBRFpbml0aWFsQW1vdW50VVNEQwURaW5pdGlhbEFtb3VudFVTREMEC2J1eU9uUHV6emxlCQD8BwQFCnB1enpsZVBvb2wCBHN3YXAJAMwIAgUEcGF0aAkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULdXNkbkFzc2V0SWQJAGgCBQZhbW91bnQAwIQ9BQNuaWwDCQAAAgULYnV5T25QdXp6bGUFC2J1eU9uUHV6emxlBBB1c2RjVG9rZW5CYWxhbmNlCQBlAgkA8AcCBQR0aGlzBQt1c2RjQXNzZXRJZAURaW5pdGlhbEFtb3VudFVTREMDCQAAAgUQdXNkY1Rva2VuQmFsYW5jZQUQdXNkY1Rva2VuQmFsYW5jZQQUcHV0VGhlVG9rZW5JblRoZVBvb2wJAPwHBAUEcG9vbAILcHV0T25lVGtuVjIJAMwIAgABCQDMCAIHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3VzZGNBc3NldElkBRB1c2RjVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUUcHV0VGhlVG9rZW5JblRoZVBvb2wFFHB1dFRoZVRva2VuSW5UaGVQb29sBA5scFRva2VuQmFsYW5jZQkA8AcCBQR0aGlzBRZ1c2RuVXNkY0xQVG9rZW5Bc3NldElkAwkAAAIFDmxwVG9rZW5CYWxhbmNlBQ5scFRva2VuQmFsYW5jZQQNc2VsbFBvb2xUb2tlbgkA/AcEBQRwb29sAgtnZXRPbmVUa25WMgkAzAgCBRF1c2RuQXNzZXRJZFN0cmluZwkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUWdXNkblVzZGNMUFRva2VuQXNzZXRJZAUObHBUb2tlbkJhbGFuY2UFA25pbAMJAAACBQ1zZWxsUG9vbFRva2VuBQ1zZWxsUG9vbFRva2VuBAtmaW5hbEFtb3VudAkA8AcCBQR0aGlzBQt1c2RuQXNzZXRJZAMJAAACBQtmaW5hbEFtb3VudAULZmluYWxBbW91bnQDCQBnAgUNaW5pdGlhbEFtb3VudAULZmluYWxBbW91bnQJAAIBAhNhcmIgbm90IHN1Y2Nlc3NmdWwhBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIYXJiVVNEQzICBHBhdGgGYW1vdW50BAtwb29sQWRkcmVzcwIjM1BDM0h0dXBCeEJteTRXdFpmMVR5bTF2cnhnOU13YlpSSzEEBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3Bvb2xBZGRyZXNzBAt1c2RuQXNzZXRJZAEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEEEXVzZG5Bc3NldElkU3RyaW5nAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAQRdXNkY0Fzc2V0SWRTdHJpbmcCLDZYdEhqcFhiczlSUkpQMlNyOUdVeVZxekFDY2J5OVRrVGhIWG5qVkM1Q0RKBAt1c2RjQXNzZXRJZAEgUjPZ4ZeIJuXiH8L96og0uId2o4yxg+/IYBx+ChJUJiUEFnVzZG5Vc2RjTFBUb2tlbkFzc2V0SWQBIANpAfwbCpgKiM2P/hFZhYUmkTKzWpL8JulIXdOf3lx2BBFwdXp6bGVQb29sQWRkcmVzcwIjM1BHRkh6VkdUNE5UaWd3Q0tQMU5jd29Ya29kVlp3dkJ1dVUECnB1enpsZVBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEXB1enpsZVBvb2xBZGRyZXNzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIbeW91IGFyZSBub3QgYWxsb3dlZCB0byBhcmIhBA1pbml0aWFsQW1vdW50CQDwBwIFBHRoaXMFC3VzZG5Bc3NldElkAwkAAAIFDWluaXRpYWxBbW91bnQFDWluaXRpYWxBbW91bnQEEWluaXRpYWxBbW91bnRVU0RDCQDwBwIFBHRoaXMFC3VzZGNBc3NldElkAwkAAAIFEWluaXRpYWxBbW91bnRVU0RDBRFpbml0aWFsQW1vdW50VVNEQwQUcHV0VGhlVG9rZW5JblRoZVBvb2wJAPwHBAUEcG9vbAILcHV0T25lVGtuVjIJAMwIAgABCQDMCAIHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3VzZG5Bc3NldElkCQBoAgUGYW1vdW50AMCEPQUDbmlsAwkAAAIFFHB1dFRoZVRva2VuSW5UaGVQb29sBRRwdXRUaGVUb2tlbkluVGhlUG9vbAQObHBUb2tlbkJhbGFuY2UJAPAHAgUEdGhpcwUWdXNkblVzZGNMUFRva2VuQXNzZXRJZAMJAAACBQ5scFRva2VuQmFsYW5jZQUObHBUb2tlbkJhbGFuY2UEDXNlbGxQb29sVG9rZW4JAPwHBAUEcG9vbAILZ2V0T25lVGtuVjIJAMwIAgURdXNkY0Fzc2V0SWRTdHJpbmcJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFFnVzZG5Vc2RjTFBUb2tlbkFzc2V0SWQFDmxwVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUNc2VsbFBvb2xUb2tlbgUNc2VsbFBvb2xUb2tlbgQQdXNkY1Rva2VuQmFsYW5jZQkAZQIJAPAHAgUEdGhpcwULdXNkY0Fzc2V0SWQFEWluaXRpYWxBbW91bnRVU0RDAwkAAAIFEHVzZGNUb2tlbkJhbGFuY2UFEHVzZGNUb2tlbkJhbGFuY2UEDHNlbGxPblB1enpsZQkA/AcEBQpwdXp6bGVQb29sAgRzd2FwCQDMCAIFBHBhdGgJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3VzZGNBc3NldElkBRB1c2RjVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUMc2VsbE9uUHV6emxlBQxzZWxsT25QdXp6bGUEC2ZpbmFsQW1vdW50CQDwBwIFBHRoaXMFC3VzZG5Bc3NldElkAwkAAAIFC2ZpbmFsQW1vdW50BQtmaW5hbEFtb3VudAMJAGcCBQ1pbml0aWFsQW1vdW50BQtmaW5hbEFtb3VudAkAAgECE2FyYiBub3Qgc3VjY2Vzc2Z1bCEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdhcmJVU0RUAgRwYXRoBmFtb3VudAQLcG9vbEFkZHJlc3MCIzNQOEtNeUFKQ1BXTmN5ZWRxcm15bXhhZVdvbnZta2hHYXV6BARwb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBQtwb29sQWRkcmVzcwQLdXNkbkFzc2V0SWQBILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRBBF1c2RuQXNzZXRJZFN0cmluZwIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAEEXVzZHRBc3NldElkU3RyaW5nAiwzNE45WWNFRVRMV245M3FZUTY0RXNQMXg4OXRTcnVKVTQ0UnJFTVNYWEVQSgQLdXNkdEFzc2V0SWQBIB6UBxNSdqEllf3IYaiCXxB/3zpPKbv8mkY/Wv02T5+RBBZ1c2RuVXNkdExQVG9rZW5Bc3NldElkASB4p79M5F037ZUh19Z+VbL+rgR/6BH9WtYv/UMYL5a3wAQRcHV6emxlUG9vbEFkZHJlc3MCIzNQR0ZIelZHVDROVGlnd0NLUDFOY3dvWGtvZFZad3ZCdXVVBApwdXp6bGVQb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBRFwdXp6bGVQb29sQWRkcmVzcwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECG3lvdSBhcmUgbm90IGFsbG93ZWQgdG8gYXJiIQQNaW5pdGlhbEFtb3VudAkA8AcCBQR0aGlzBQt1c2RuQXNzZXRJZAMJAAACBQ1pbml0aWFsQW1vdW50BQ1pbml0aWFsQW1vdW50BBFpbml0aWFsQW1vdW50VVNEVAkA8AcCBQR0aGlzBQt1c2R0QXNzZXRJZAMJAAACBRFpbml0aWFsQW1vdW50VVNEVAURaW5pdGlhbEFtb3VudFVTRFQEC2J1eU9uUHV6emxlCQD8BwQFCnB1enpsZVBvb2wCBHN3YXAJAMwIAgUEcGF0aAkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULdXNkbkFzc2V0SWQJAGgCBQZhbW91bnQAwIQ9BQNuaWwDCQAAAgULYnV5T25QdXp6bGUFC2J1eU9uUHV6emxlBBB1c2R0VG9rZW5CYWxhbmNlCQBlAgkA8AcCBQR0aGlzBQt1c2R0QXNzZXRJZAURaW5pdGlhbEFtb3VudFVTRFQDCQAAAgUQdXNkdFRva2VuQmFsYW5jZQUQdXNkdFRva2VuQmFsYW5jZQQUcHV0VGhlVG9rZW5JblRoZVBvb2wJAPwHBAUEcG9vbAILcHV0T25lVGtuVjIJAMwIAgABCQDMCAIHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3VzZHRBc3NldElkBRB1c2R0VG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUUcHV0VGhlVG9rZW5JblRoZVBvb2wFFHB1dFRoZVRva2VuSW5UaGVQb29sBA5scFRva2VuQmFsYW5jZQkA8AcCBQR0aGlzBRZ1c2RuVXNkdExQVG9rZW5Bc3NldElkAwkAAAIFDmxwVG9rZW5CYWxhbmNlBQ5scFRva2VuQmFsYW5jZQQNc2VsbFBvb2xUb2tlbgkA/AcEBQRwb29sAgtnZXRPbmVUa25WMgkAzAgCBRF1c2RuQXNzZXRJZFN0cmluZwkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUWdXNkblVzZHRMUFRva2VuQXNzZXRJZAUObHBUb2tlbkJhbGFuY2UFA25pbAMJAAACBQ1zZWxsUG9vbFRva2VuBQ1zZWxsUG9vbFRva2VuBAtmaW5hbEFtb3VudAkA8AcCBQR0aGlzBQt1c2RuQXNzZXRJZAMJAAACBQtmaW5hbEFtb3VudAULZmluYWxBbW91bnQDCQBnAgUNaW5pdGlhbEFtb3VudAULZmluYWxBbW91bnQJAAIBAhNhcmIgbm90IHN1Y2Nlc3NmdWwhBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIYXJiVVNEVDICBHBhdGgGYW1vdW50BAtwb29sQWRkcmVzcwIjM1A4S015QUpDUFdOY3llZHFybXlteGFlV29udm1raEdhdXoEBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3Bvb2xBZGRyZXNzBAt1c2RuQXNzZXRJZAEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEEEXVzZG5Bc3NldElkU3RyaW5nAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAQRdXNkdEFzc2V0SWRTdHJpbmcCLDM0TjlZY0VFVExXbjkzcVlRNjRFc1AxeDg5dFNydUpVNDRSckVNU1hYRVBKBAt1c2R0QXNzZXRJZAEgHpQHE1J2oSWV/chhqIJfEH/fOk8pu/yaRj9a/TZPn5EEFnVzZG5Vc2R0TFBUb2tlbkFzc2V0SWQBIHinv0zkXTftlSHX1n5Vsv6uBH/oEf1a1i/9QxgvlrfABBFwdXp6bGVQb29sQWRkcmVzcwIjM1BHRkh6VkdUNE5UaWd3Q0tQMU5jd29Ya29kVlp3dkJ1dVUECnB1enpsZVBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEXB1enpsZVBvb2xBZGRyZXNzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIbeW91IGFyZSBub3QgYWxsb3dlZCB0byBhcmIhBA1pbml0aWFsQW1vdW50CQDwBwIFBHRoaXMFC3VzZG5Bc3NldElkAwkAAAIFDWluaXRpYWxBbW91bnQFDWluaXRpYWxBbW91bnQEEWluaXRpYWxBbW91bnRVU0RUCQDwBwIFBHRoaXMFC3VzZHRBc3NldElkAwkAAAIFEWluaXRpYWxBbW91bnRVU0RUBRFpbml0aWFsQW1vdW50VVNEVAQUcHV0VGhlVG9rZW5JblRoZVBvb2wJAPwHBAUEcG9vbAILcHV0T25lVGtuVjIJAMwIAgABCQDMCAIHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3VzZG5Bc3NldElkCQBoAgUGYW1vdW50AMCEPQUDbmlsAwkAAAIFFHB1dFRoZVRva2VuSW5UaGVQb29sBRRwdXRUaGVUb2tlbkluVGhlUG9vbAQObHBUb2tlbkJhbGFuY2UJAPAHAgUEdGhpcwUWdXNkblVzZHRMUFRva2VuQXNzZXRJZAMJAAACBQ5scFRva2VuQmFsYW5jZQUObHBUb2tlbkJhbGFuY2UEDXNlbGxQb29sVG9rZW4JAPwHBAUEcG9vbAILZ2V0T25lVGtuVjIJAMwIAgURdXNkdEFzc2V0SWRTdHJpbmcJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFFnVzZG5Vc2R0TFBUb2tlbkFzc2V0SWQFDmxwVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUNc2VsbFBvb2xUb2tlbgUNc2VsbFBvb2xUb2tlbgQQdXNkdFRva2VuQmFsYW5jZQkAZQIJAPAHAgUEdGhpcwULdXNkdEFzc2V0SWQFEWluaXRpYWxBbW91bnRVU0RUAwkAAAIFEHVzZHRUb2tlbkJhbGFuY2UFEHVzZHRUb2tlbkJhbGFuY2UEDHNlbGxPblB1enpsZQkA/AcEBQpwdXp6bGVQb29sAgRzd2FwCQDMCAIFBHBhdGgJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3VzZHRBc3NldElkBRB1c2R0VG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUMc2VsbE9uUHV6emxlBQxzZWxsT25QdXp6bGUEC2ZpbmFsQW1vdW50CQDwBwIFBHRoaXMFC3VzZG5Bc3NldElkAwkAAAIFC2ZpbmFsQW1vdW50BQtmaW5hbEFtb3VudAMJAGcCBQ1pbml0aWFsQW1vdW50BQtmaW5hbEFtb3VudAkAAgECE2FyYiBub3Qgc3VjY2Vzc2Z1bCEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQZhcmJUU04CBHBhdGgGYW1vdW50BAtwb29sQWRkcmVzcwIjM1BIODMyZUtudzY3UEZ2SmZVZzlLbno2QkhNODdRdmpNZUwEBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3Bvb2xBZGRyZXNzBAt1c2RuQXNzZXRJZAEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEEEXVzZG5Bc3NldElkU3RyaW5nAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAQKdHNuQXNzZXRJZAEgdRYQOIB2DVVlfknzrrHb5hmcahBoH8lVYfpKRlp3MBwEFXVzZG5Uc25MUFRva2VuQXNzZXRJZAEgyhurEOUFvgG3N7QTzvX+g1ZNxsH0uZ4a0aJ262yiYHIEEXB1enpsZVBvb2xBZGRyZXNzAiMzUEdGSHpWR1Q0TlRpZ3dDS1AxTmN3b1hrb2RWWnd2QnV1VQQKcHV6emxlUG9vbAkBEUBleHRyTmF0aXZlKDEwNjIpAQURcHV6emxlUG9vbEFkZHJlc3MDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAht5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIGFyYiEEDWluaXRpYWxBbW91bnQJAPAHAgUEdGhpcwULdXNkbkFzc2V0SWQDCQAAAgUNaW5pdGlhbEFtb3VudAUNaW5pdGlhbEFtb3VudAQQaW5pdGlhbEFtb3VudFRTTgkA8AcCBQR0aGlzBQp0c25Bc3NldElkAwkAAAIFEGluaXRpYWxBbW91bnRUU04FEGluaXRpYWxBbW91bnRUU04EC2J1eU9uUHV6emxlCQD8BwQFCnB1enpsZVBvb2wCBHN3YXAJAMwIAgUEcGF0aAkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULdXNkbkFzc2V0SWQJAGgCBQZhbW91bnQAwIQ9BQNuaWwDCQAAAgULYnV5T25QdXp6bGUFC2J1eU9uUHV6emxlBA90c25Ub2tlbkJhbGFuY2UJAGUCCQDwBwIFBHRoaXMFCnRzbkFzc2V0SWQFEGluaXRpYWxBbW91bnRUU04DCQAAAgUPdHNuVG9rZW5CYWxhbmNlBQ90c25Ub2tlbkJhbGFuY2UEFHB1dFRoZVRva2VuSW5UaGVQb29sCQD8BwQFBHBvb2wCCXB1dE9uZVRrbgkAzAgCAAEJAMwIAgcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKdHNuQXNzZXRJZAUPdHNuVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUUcHV0VGhlVG9rZW5JblRoZVBvb2wFFHB1dFRoZVRva2VuSW5UaGVQb29sBA5scFRva2VuQmFsYW5jZQkA8AcCBQR0aGlzBRV1c2RuVHNuTFBUb2tlbkFzc2V0SWQDCQAAAgUObHBUb2tlbkJhbGFuY2UFDmxwVG9rZW5CYWxhbmNlBA1zZWxsUG9vbFRva2VuCQD8BwQFBHBvb2wCCWdldE9uZVRrbgkAzAgCBRF1c2RuQXNzZXRJZFN0cmluZwkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUVdXNkblRzbkxQVG9rZW5Bc3NldElkBQ5scFRva2VuQmFsYW5jZQUDbmlsAwkAAAIFDXNlbGxQb29sVG9rZW4FDXNlbGxQb29sVG9rZW4EC2ZpbmFsQW1vdW50CQDwBwIFBHRoaXMFC3VzZG5Bc3NldElkAwkAAAIFC2ZpbmFsQW1vdW50BQtmaW5hbEFtb3VudAMJAGcCBQ1pbml0aWFsQW1vdW50BQtmaW5hbEFtb3VudAkAAgECE2FyYiBub3Qgc3VjY2Vzc2Z1bCEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdhcmJUU04yAgRwYXRoBmFtb3VudAQLcG9vbEFkZHJlc3MCIzNQSDgzMmVLbnc2N1BGdkpmVWc5S256NkJITTg3UXZqTWVMBARwb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBQtwb29sQWRkcmVzcwQLdXNkbkFzc2V0SWQBILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRBBF1c2RuQXNzZXRJZFN0cmluZwIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAECnRzbkFzc2V0SWQBIHUWEDiAdg1VZX5J866x2+YZnGoQaB/JVWH6SkZadzAcBBB0c25Bc3NldElkU3RyaW5nAiw4dDREUFdUd1B6cGF0SEE5QWtUeFdBQjQ3VEhuWXpCc0Rub1k3ZlFxYkc5MQQVdXNkblRzbkxQVG9rZW5Bc3NldElkASDKG6sQ5QW+Abc3tBPO9f6DVk3GwfS5nhrRonbrbKJgcgQRcHV6emxlUG9vbEFkZHJlc3MCIzNQR0ZIelZHVDROVGlnd0NLUDFOY3dvWGtvZFZad3ZCdXVVBApwdXp6bGVQb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBRFwdXp6bGVQb29sQWRkcmVzcwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECG3lvdSBhcmUgbm90IGFsbG93ZWQgdG8gYXJiIQQNaW5pdGlhbEFtb3VudAkA8AcCBQR0aGlzBQt1c2RuQXNzZXRJZAMJAAACBQ1pbml0aWFsQW1vdW50BQ1pbml0aWFsQW1vdW50BBBpbml0aWFsQW1vdW50VFNOCQDwBwIFBHRoaXMFCnRzbkFzc2V0SWQDCQAAAgUQaW5pdGlhbEFtb3VudFRTTgUQaW5pdGlhbEFtb3VudFRTTgQUcHV0VGhlVG9rZW5JblRoZVBvb2wJAPwHBAUEcG9vbAIJcHV0T25lVGtuCQDMCAIAAQkAzAgCBwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt1c2RuQXNzZXRJZAkAaAIFBmFtb3VudADAhD0FA25pbAMJAAACBRRwdXRUaGVUb2tlbkluVGhlUG9vbAUUcHV0VGhlVG9rZW5JblRoZVBvb2wEDmxwVG9rZW5CYWxhbmNlCQDwBwIFBHRoaXMFFXVzZG5Uc25MUFRva2VuQXNzZXRJZAMJAAACBQ5scFRva2VuQmFsYW5jZQUObHBUb2tlbkJhbGFuY2UEDXNlbGxQb29sVG9rZW4JAPwHBAUEcG9vbAIJZ2V0T25lVGtuCQDMCAIFEHRzbkFzc2V0SWRTdHJpbmcJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFFXVzZG5Uc25MUFRva2VuQXNzZXRJZAUObHBUb2tlbkJhbGFuY2UFA25pbAMJAAACBQ1zZWxsUG9vbFRva2VuBQ1zZWxsUG9vbFRva2VuBA90c25Ub2tlbkJhbGFuY2UJAGUCCQDwBwIFBHRoaXMFCnRzbkFzc2V0SWQFEGluaXRpYWxBbW91bnRUU04DCQAAAgUPdHNuVG9rZW5CYWxhbmNlBQ90c25Ub2tlbkJhbGFuY2UEDHNlbGxPblB1enpsZQkA/AcEBQpwdXp6bGVQb29sAgRzd2FwCQDMCAIFBHBhdGgJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnRzbkFzc2V0SWQFD3RzblRva2VuQmFsYW5jZQUDbmlsAwkAAAIFDHNlbGxPblB1enpsZQUMc2VsbE9uUHV6emxlBAtmaW5hbEFtb3VudAkA8AcCBQR0aGlzBQt1c2RuQXNzZXRJZAMJAAACBQtmaW5hbEFtb3VudAULZmluYWxBbW91bnQDCQBnAgUNaW5pdGlhbEFtb3VudAULZmluYWxBbW91bnQJAAIBAhNhcmIgbm90IHN1Y2Nlc3NmdWwhBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHYXJiUG9vbAYKZmlyc3RBc3NldAtzZWNvbmRBc3NldAtwb29sQWRkcmVzcwdscFRva2VuBHBhdGgGYW1vdW50BARwb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBQtwb29sQWRkcmVzcwQMZmlyc3RBc3NldElkCQDZBAEFCmZpcnN0QXNzZXQEDXNlY29uZEFzc2V0SWQJANkEAQULc2Vjb25kQXNzZXQEDmxwVG9rZW5Bc3NldElkCQDZBAEFB2xwVG9rZW4EEXB1enpsZVBvb2xBZGRyZXNzAiMzUEdGSHpWR1Q0TlRpZ3dDS1AxTmN3b1hrb2RWWnd2QnV1VQQKcHV6emxlUG9vbAkBEUBleHRyTmF0aXZlKDEwNjIpAQURcHV6emxlUG9vbEFkZHJlc3MDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAht5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIGFyYiEEDWluaXRpYWxBbW91bnQJAPAHAgUEdGhpcwUMZmlyc3RBc3NldElkAwkAAAIFDWluaXRpYWxBbW91bnQFDWluaXRpYWxBbW91bnQEGGluaXRpYWxBbW91bnRTZWNvbmRBc3NldAkA8AcCBQR0aGlzBQ1zZWNvbmRBc3NldElkAwkAAAIFGGluaXRpYWxBbW91bnRTZWNvbmRBc3NldAUYaW5pdGlhbEFtb3VudFNlY29uZEFzc2V0BAtidXlPblB1enpsZQkA/AcEBQpwdXp6bGVQb29sAgRzd2FwCQDMCAIFBHBhdGgJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDGZpcnN0QXNzZXRJZAkAaAIFBmFtb3VudADAhD0FA25pbAMJAAACBQtidXlPblB1enpsZQULYnV5T25QdXp6bGUEEnNlY29uZFRva2VuQmFsYW5jZQkAZQIJAPAHAgUEdGhpcwUNc2Vjb25kQXNzZXRJZAUYaW5pdGlhbEFtb3VudFNlY29uZEFzc2V0AwkAAAIFEnNlY29uZFRva2VuQmFsYW5jZQUSc2Vjb25kVG9rZW5CYWxhbmNlBBRwdXRUaGVUb2tlbkluVGhlUG9vbAkA/AcEBQRwb29sAglwdXRPbmVUa24JAMwIAgABCQDMCAIHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDXNlY29uZEFzc2V0SWQFEnNlY29uZFRva2VuQmFsYW5jZQUDbmlsAwkAAAIFFHB1dFRoZVRva2VuSW5UaGVQb29sBRRwdXRUaGVUb2tlbkluVGhlUG9vbAQObHBUb2tlbkJhbGFuY2UJAPAHAgUEdGhpcwUObHBUb2tlbkFzc2V0SWQDCQAAAgUObHBUb2tlbkJhbGFuY2UFDmxwVG9rZW5CYWxhbmNlBA1zZWxsUG9vbFRva2VuCQD8BwQFBHBvb2wCCWdldE9uZVRrbgkAzAgCBQpmaXJzdEFzc2V0CQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQ5scFRva2VuQXNzZXRJZAUObHBUb2tlbkJhbGFuY2UFA25pbAMJAAACBQ1zZWxsUG9vbFRva2VuBQ1zZWxsUG9vbFRva2VuBAtmaW5hbEFtb3VudAkA8AcCBQR0aGlzBQxmaXJzdEFzc2V0SWQDCQAAAgULZmluYWxBbW91bnQFC2ZpbmFsQW1vdW50AwkAZwIFDWluaXRpYWxBbW91bnQFC2ZpbmFsQW1vdW50CQACAQITYXJiIG5vdCBzdWNjZXNzZnVsIQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGFyYlBvb2wyBgpmaXJzdEFzc2V0C3NlY29uZEFzc2V0C3Bvb2xBZGRyZXNzB2xwVG9rZW4EcGF0aAZhbW91bnQEBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3Bvb2xBZGRyZXNzBAxmaXJzdEFzc2V0SWQJANkEAQUKZmlyc3RBc3NldAQNc2Vjb25kQXNzZXRJZAkA2QQBBQtzZWNvbmRBc3NldAQObHBUb2tlbkFzc2V0SWQJANkEAQUHbHBUb2tlbgQRcHV6emxlUG9vbEFkZHJlc3MCIzNQR0ZIelZHVDROVGlnd0NLUDFOY3dvWGtvZFZad3ZCdXVVBApwdXp6bGVQb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBRFwdXp6bGVQb29sQWRkcmVzcwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECG3lvdSBhcmUgbm90IGFsbG93ZWQgdG8gYXJiIQQNaW5pdGlhbEFtb3VudAkA8AcCBQR0aGlzBQxmaXJzdEFzc2V0SWQDCQAAAgUNaW5pdGlhbEFtb3VudAUNaW5pdGlhbEFtb3VudAQYaW5pdGlhbEFtb3VudFNlY29uZEFzc2V0CQDwBwIFBHRoaXMFDXNlY29uZEFzc2V0SWQDCQAAAgUYaW5pdGlhbEFtb3VudFNlY29uZEFzc2V0BRhpbml0aWFsQW1vdW50U2Vjb25kQXNzZXQEFHB1dFRoZVRva2VuSW5UaGVQb29sCQD8BwQFBHBvb2wCCXB1dE9uZVRrbgkAzAgCAAEJAMwIAgcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMZmlyc3RBc3NldElkCQBoAgUGYW1vdW50AMCEPQUDbmlsAwkAAAIFFHB1dFRoZVRva2VuSW5UaGVQb29sBRRwdXRUaGVUb2tlbkluVGhlUG9vbAQObHBUb2tlbkJhbGFuY2UJAPAHAgUEdGhpcwUObHBUb2tlbkFzc2V0SWQDCQAAAgUObHBUb2tlbkJhbGFuY2UFDmxwVG9rZW5CYWxhbmNlBA1zZWxsUG9vbFRva2VuCQD8BwQFBHBvb2wCCWdldE9uZVRrbgkAzAgCBQtzZWNvbmRBc3NldAkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUObHBUb2tlbkFzc2V0SWQFDmxwVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUNc2VsbFBvb2xUb2tlbgUNc2VsbFBvb2xUb2tlbgQSc2Vjb25kVG9rZW5CYWxhbmNlCQBlAgkA8AcCBQR0aGlzBQ1zZWNvbmRBc3NldElkBRhpbml0aWFsQW1vdW50U2Vjb25kQXNzZXQDCQAAAgUSc2Vjb25kVG9rZW5CYWxhbmNlBRJzZWNvbmRUb2tlbkJhbGFuY2UEDHNlbGxPblB1enpsZQkA/AcEBQpwdXp6bGVQb29sAgRzd2FwCQDMCAIFBHBhdGgJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDXNlY29uZEFzc2V0SWQFEnNlY29uZFRva2VuQmFsYW5jZQUDbmlsAwkAAAIFDHNlbGxPblB1enpsZQUMc2VsbE9uUHV6emxlBAtmaW5hbEFtb3VudAkA8AcCBQR0aGlzBQxmaXJzdEFzc2V0SWQDCQAAAgULZmluYWxBbW91bnQFC2ZpbmFsQW1vdW50AwkAZwIFDWluaXRpYWxBbW91bnQFC2ZpbmFsQW1vdW50CQACAQITYXJiIG5vdCBzdWNjZXNzZnVsIQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWFyYlBvb2xWMgYKZmlyc3RBc3NldAtzZWNvbmRBc3NldAtwb29sQWRkcmVzcwdscFRva2VuBHBhdGgGYW1vdW50BARwb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBQtwb29sQWRkcmVzcwQMZmlyc3RBc3NldElkCQDZBAEFCmZpcnN0QXNzZXQEDXNlY29uZEFzc2V0SWQJANkEAQULc2Vjb25kQXNzZXQEDmxwVG9rZW5Bc3NldElkCQDZBAEFB2xwVG9rZW4EEXB1enpsZVBvb2xBZGRyZXNzAiMzUEdGSHpWR1Q0TlRpZ3dDS1AxTmN3b1hrb2RWWnd2QnV1VQQKcHV6emxlUG9vbAkBEUBleHRyTmF0aXZlKDEwNjIpAQURcHV6emxlUG9vbEFkZHJlc3MDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAht5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIGFyYiEEDWluaXRpYWxBbW91bnQJAPAHAgUEdGhpcwUMZmlyc3RBc3NldElkAwkAAAIFDWluaXRpYWxBbW91bnQFDWluaXRpYWxBbW91bnQEGGluaXRpYWxBbW91bnRTZWNvbmRBc3NldAkA8AcCBQR0aGlzBQ1zZWNvbmRBc3NldElkAwkAAAIFGGluaXRpYWxBbW91bnRTZWNvbmRBc3NldAUYaW5pdGlhbEFtb3VudFNlY29uZEFzc2V0BAtidXlPblB1enpsZQkA/AcEBQpwdXp6bGVQb29sAgRzd2FwCQDMCAIFBHBhdGgJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDGZpcnN0QXNzZXRJZAkAaAIFBmFtb3VudADAhD0FA25pbAMJAAACBQtidXlPblB1enpsZQULYnV5T25QdXp6bGUEEnNlY29uZFRva2VuQmFsYW5jZQkAZQIJAPAHAgUEdGhpcwUNc2Vjb25kQXNzZXRJZAUYaW5pdGlhbEFtb3VudFNlY29uZEFzc2V0AwkAAAIFEnNlY29uZFRva2VuQmFsYW5jZQUSc2Vjb25kVG9rZW5CYWxhbmNlBBRwdXRUaGVUb2tlbkluVGhlUG9vbAkA/AcEBQRwb29sAgtwdXRPbmVUa25WMgkAzAgCAAEJAMwIAgcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUNc2Vjb25kQXNzZXRJZAUSc2Vjb25kVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUUcHV0VGhlVG9rZW5JblRoZVBvb2wFFHB1dFRoZVRva2VuSW5UaGVQb29sBA5scFRva2VuQmFsYW5jZQkA8AcCBQR0aGlzBQ5scFRva2VuQXNzZXRJZAMJAAACBQ5scFRva2VuQmFsYW5jZQUObHBUb2tlbkJhbGFuY2UEDXNlbGxQb29sVG9rZW4JAPwHBAUEcG9vbAILZ2V0T25lVGtuVjIJAMwIAgUKZmlyc3RBc3NldAkAzAgCAAEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUObHBUb2tlbkFzc2V0SWQFDmxwVG9rZW5CYWxhbmNlBQNuaWwDCQAAAgUNc2VsbFBvb2xUb2tlbgUNc2VsbFBvb2xUb2tlbgQLZmluYWxBbW91bnQJAPAHAgUEdGhpcwUMZmlyc3RBc3NldElkAwkAAAIFC2ZpbmFsQW1vdW50BQtmaW5hbEFtb3VudAMJAGcCBQ1pbml0aWFsQW1vdW50BQtmaW5hbEFtb3VudAkAAgECE2FyYiBub3Qgc3VjY2Vzc2Z1bCEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQphcmJQb29sMlYyBgpmaXJzdEFzc2V0C3NlY29uZEFzc2V0C3Bvb2xBZGRyZXNzB2xwVG9rZW4EcGF0aAZhbW91bnQEBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3Bvb2xBZGRyZXNzBAxmaXJzdEFzc2V0SWQJANkEAQUKZmlyc3RBc3NldAQNc2Vjb25kQXNzZXRJZAkA2QQBBQtzZWNvbmRBc3NldAQObHBUb2tlbkFzc2V0SWQJANkEAQUHbHBUb2tlbgQRcHV6emxlUG9vbEFkZHJlc3MCIzNQR0ZIelZHVDROVGlnd0NLUDFOY3dvWGtvZFZad3ZCdXVVBApwdXp6bGVQb29sCQERQGV4dHJOYXRpdmUoMTA2MikBBRFwdXp6bGVQb29sQWRkcmVzcwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECG3lvdSBhcmUgbm90IGFsbG93ZWQgdG8gYXJiIQQNaW5pdGlhbEFtb3VudAkA8AcCBQR0aGlzBQxmaXJzdEFzc2V0SWQDCQAAAgUNaW5pdGlhbEFtb3VudAUNaW5pdGlhbEFtb3VudAQYaW5pdGlhbEFtb3VudFNlY29uZEFzc2V0CQDwBwIFBHRoaXMFDXNlY29uZEFzc2V0SWQDCQAAAgUYaW5pdGlhbEFtb3VudFNlY29uZEFzc2V0BRhpbml0aWFsQW1vdW50U2Vjb25kQXNzZXQEFHB1dFRoZVRva2VuSW5UaGVQb29sCQD8BwQFBHBvb2wCC3B1dE9uZVRrblYyCQDMCAIAAQkAzAgCBwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxmaXJzdEFzc2V0SWQJAGgCBQZhbW91bnQAwIQ9BQNuaWwDCQAAAgUUcHV0VGhlVG9rZW5JblRoZVBvb2wFFHB1dFRoZVRva2VuSW5UaGVQb29sBA5scFRva2VuQmFsYW5jZQkA8AcCBQR0aGlzBQ5scFRva2VuQXNzZXRJZAMJAAACBQ5scFRva2VuQmFsYW5jZQUObHBUb2tlbkJhbGFuY2UEDXNlbGxQb29sVG9rZW4JAPwHBAUEcG9vbAILZ2V0T25lVGtuVjIJAMwIAgULc2Vjb25kQXNzZXQJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDmxwVG9rZW5Bc3NldElkBQ5scFRva2VuQmFsYW5jZQUDbmlsAwkAAAIFDXNlbGxQb29sVG9rZW4FDXNlbGxQb29sVG9rZW4EEnNlY29uZFRva2VuQmFsYW5jZQkAZQIJAPAHAgUEdGhpcwUNc2Vjb25kQXNzZXRJZAUYaW5pdGlhbEFtb3VudFNlY29uZEFzc2V0AwkAAAIFEnNlY29uZFRva2VuQmFsYW5jZQUSc2Vjb25kVG9rZW5CYWxhbmNlBAxzZWxsT25QdXp6bGUJAPwHBAUKcHV6emxlUG9vbAIEc3dhcAkAzAgCBQRwYXRoCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQ1zZWNvbmRBc3NldElkBRJzZWNvbmRUb2tlbkJhbGFuY2UFA25pbAMJAAACBQxzZWxsT25QdXp6bGUFDHNlbGxPblB1enpsZQQLZmluYWxBbW91bnQJAPAHAgUEdGhpcwUMZmlyc3RBc3NldElkAwkAAAIFC2ZpbmFsQW1vdW50BQtmaW5hbEFtb3VudAMJAGcCBQ1pbml0aWFsQW1vdW50BQtmaW5hbEFtb3VudAkAAgECE2FyYiBub3Qgc3VjY2Vzc2Z1bCEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQF5AQRkYXRhAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIbeW91IGFyZSBub3QgYWxsb3dlZCB0byBhcmIhBApkYXRhX2FycmF5CQC8CQIFBGRhdGECAXwECnQwMzAwODMwNjQJAQhnZXRCYXNlMQEJAJEDAgUKZGF0YV9hcnJheQAABAFhCAUKdDAzMDA4MzA2NAJfMQQCYTIIBQp0MDMwMDgzMDY0Al8yBAdhc3NldEluCAUKdDAzMDA4MzA2NAJfMwQIYW1vdW50SW4IBQp0MDMwMDgzMDY0Al80BAp0MDMwNjkzMTA3CQEIZ2V0QmFzZTIBCQCRAwIFCmRhdGFfYXJyYXkAAQQCcDEIBQp0MDMwNjkzMTA3Al8xBAJ0MQgFCnQwMzA2OTMxMDcCXzIECnQwMzExMjMxNTAJAQhnZXRCYXNlMgEJAJEDAgUKZGF0YV9hcnJheQACBAJwMggFCnQwMzExMjMxNTACXzEEAnQyCAUKdDAzMTEyMzE1MAJfMgQKdDAzMTU1MzE5MwkBCGdldEJhc2UyAQkAkQMCBQpkYXRhX2FycmF5AAMEAnAzCAUKdDAzMTU1MzE5MwJfMQQCdDMIBQp0MDMxNTUzMTkzAl8yBANpZHUDCQBmAgkAsQIBCQCRAwIFCmRhdGFfYXJyYXkABAABCQC8CQIJAJEDAgUKZGF0YV9hcnJheQAEAgEtBQNuaWwDAwMJAGYCCQCQAwEFA2lkdQAACQBmAgkBBnVjaGVjawEJANkEAQkAkQMCBQNpZHUAAAAABwYJAGcCAAEJALECAQkAkQMCBQpkYXRhX2FycmF5AAQEEmFtb3VudF9iZWZfYXNzZXRJbgkBCmdldEJhbGFuY2UBCQENZ2V0QXNzZXRCeXRlcwEFB2Fzc2V0SW4DCQAAAgUSYW1vdW50X2JlZl9hc3NldEluBRJhbW91bnRfYmVmX2Fzc2V0SW4EBnVsaW1pdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAgZ1bGltaXQAZAQKbWF4X2Ftb3VudAMJAGYCCQCQAwEFA2lkdQAACQBrAwUSYW1vdW50X2JlZl9hc3NldEluBQZ1bGltaXQAZAUSYW1vdW50X2JlZl9hc3NldEluBAxuZXdfYW1vdW50SW4DCQBmAgkBBXZhbHVlAQkAtgkBBQhhbW91bnRJbgUKbWF4X2Ftb3VudAUKbWF4X2Ftb3VudAkBBXZhbHVlAQkAtgkBBQhhbW91bnRJbgMJAAACBQxuZXdfYW1vdW50SW4FDG5ld19hbW91bnRJbgQRYW1vdW50X2JlZl9hc3NldDEJAQpnZXRCYWxhbmNlAQkBDWdldEFzc2V0Qnl0ZXMBBQFhAwkAAAIFEWFtb3VudF9iZWZfYXNzZXQxBRFhbW91bnRfYmVmX2Fzc2V0MQQFc3dhcDEDCQAAAgUCdDECAVcJAQdzd2FwX3d4BAUCcDEFB2Fzc2V0SW4FDG5ld19hbW91bnRJbgUBYQMJAAACBQJ0MQIBUwkBCXN3YXBfc3dvcAMFAnAxBQdhc3NldEluBQxuZXdfYW1vdW50SW4JAQtzd2FwX3B1enpsZQQFAnAxBQdhc3NldEluBQxuZXdfYW1vdW50SW4FAWEDCQAAAgUFc3dhcDEFBXN3YXAxBAJuYgkAZQIJAQpnZXRCYWxhbmNlAQkBDWdldEFzc2V0Qnl0ZXMBBQFhBRFhbW91bnRfYmVmX2Fzc2V0MQMJAAACBQJuYgUCbmIEEWFtb3VudF9iZWZfYXNzZXQyCQEKZ2V0QmFsYW5jZQEJAQ1nZXRBc3NldEJ5dGVzAQUCYTIDCQAAAgURYW1vdW50X2JlZl9hc3NldDIFEWFtb3VudF9iZWZfYXNzZXQyBAVzd2FwMgMJAAACBQJ0MgIBVwkBB3N3YXBfd3gEBQJwMgUBYQUCbmIFAmEyAwkAAAIFAnQyAgFTCQEJc3dhcF9zd29wAwUCcDIFAWEFAm5iCQELc3dhcF9wdXp6bGUEBQJwMgUBYQUCbmIFAmEyAwkAAAIFBXN3YXAyBQVzd2FwMgQDbmIyCQBlAgkBCmdldEJhbGFuY2UBCQENZ2V0QXNzZXRCeXRlcwEFAmEyBRFhbW91bnRfYmVmX2Fzc2V0MgMJAAACBQNuYjIFA25iMgQVYW1vdW50X2JlZl9iYXNlX2Fzc2V0CQEKZ2V0QmFsYW5jZQEJAQ1nZXRBc3NldEJ5dGVzAQUHYXNzZXRJbgMJAAACBRVhbW91bnRfYmVmX2Jhc2VfYXNzZXQFFWFtb3VudF9iZWZfYmFzZV9hc3NldAQFc3dhcDMDCQAAAgUCdDMCAVcJAQdzd2FwX3d4BAUCcDMFAmEyBQNuYjIFB2Fzc2V0SW4DCQAAAgUCdDMCAVMJAQlzd2FwX3N3b3ADBQJwMwUCYTIFA25iMgkBC3N3YXBfcHV6emxlBAUCcDMFAmEyBQNuYjIFB2Fzc2V0SW4DCQAAAgUFc3dhcDMFBXN3YXAzBANuYjMJAGUCCQEKZ2V0QmFsYW5jZQEJAQ1nZXRBc3NldEJ5dGVzAQUHYXNzZXRJbgUVYW1vdW50X2JlZl9iYXNlX2Fzc2V0AwkAAAIFA25iMwUDbmIzBAh0cmVzaG9sZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAgh0cmVzaG9sZADwkwkDCQBmAgUDbmIzCQBkAgUMbmV3X2Ftb3VudEluBQh0cmVzaG9sZAUDbmlsCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgISb3JpZ2luIGFtb3VudEluID0gBQhhbW91bnRJbgIRLCBuZXdfYW1vdW50SW4gPSAJAKQDAQUMbmV3X2Ftb3VudEluAgwsIG5ld0JhbF8xOiAJAKQDAQUCbmICDCwgbmV3QmFsXzI6IAkApAMBBQNuYjICDCwgbmV3QmFsXzM6IAkApAMBBQNuYjMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAFpAQdkZWZhdWx0AAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECC05vIHRvdWNoaW5nCgENYWNjdW1GdW5jdGlvbgIFYWNjdW0EbmV4dAQKZXN0aW1hdGlvbgkBDWVzdGltYXRlUm91dGUGCAUEbmV4dAJfMQgFBG5leHQCXzIIBQRuZXh0Al8zCAUEbmV4dAJfNAgFBG5leHQCXzUIBQRuZXh0Al82CQCUCgIJAM0IAggFBWFjY3VtAl8xCAUKZXN0aW1hdGlvbgJfMQkAzQgCCAUFYWNjdW0CXzIIBQplc3RpbWF0aW9uAl8yBARmb2xkCgACJGwFBnJvdXRlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDWFjY3VtRnVuY3Rpb24CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDI0CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYBA1tYXhTd2FwUHJvZml0CQCWAwEIBQRmb2xkAl8xAwkAZwIAAAUNbWF4U3dhcFByb2ZpdAkAAgECDUVzdGltYXRlIGZhaWwED2VzdGltYXRlZFJlc3VsdAkAkQMCCAUEZm9sZAJfMgkBBXZhbHVlAQkAzwgCCAUEZm9sZAJfMQUNbWF4U3dhcFByb2ZpdAQHcmVzdWx0MQkBCmludm9rZVN3YXABCQCRAwIFD2VzdGltYXRlZFJlc3VsdAAAAwkAAAIFB3Jlc3VsdDEFB3Jlc3VsdDEEB3Jlc3VsdDIJAQppbnZva2VTd2FwAQkAkQMCBQ9lc3RpbWF0ZWRSZXN1bHQAAQMJAAACBQdyZXN1bHQyBQdyZXN1bHQyBAdyZXN1bHQzCQEKaW52b2tlU3dhcAEJAJEDAgUPZXN0aW1hdGVkUmVzdWx0AAIDCQAAAgUHcmVzdWx0MwUHcmVzdWx0MwQGcHJvZml0CQBlAgkBCmdldEJhbGFuY2UBBQdJbkFzc2V0BQlpbkJhbGFuY2UECnB1cmVQcm9maXQJAGUCBQZwcm9maXQA4MZbAwkAZwIAAAUKcHVyZVByb2ZpdAkAAgECDEV4ZWN1dGUgZmFpbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQFPIx4=", "height": 3635653, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D8N7EvbYzCmqS6pBS9B9YAwgL93J96yJUjPjMahKUZhY Next: GjUnsxBbhZoxWm3nj4UoPzjWh8TKyLCr4pnLzFVQKAXD Diff:
Old | New | Differences | |
---|---|---|---|
12 | 12 | "" | |
13 | 13 | } | |
14 | 14 | ||
15 | + | let w2 = match getString(this, "w2") { | |
16 | + | case r: String => | |
17 | + | r | |
18 | + | case _ => | |
19 | + | "" | |
20 | + | } | |
21 | + | ||
22 | + | let USDN_ASSET_ID = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
23 | + | ||
15 | 24 | let WX_SWAP_DAPP = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93') | |
16 | 25 | ||
17 | 26 | let assets_in = ["DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"] | |
18 | - | ||
19 | - | func getBalance (assetId) = match assetId { | |
20 | - | case b: ByteVector => | |
21 | - | assetBalance(this, b) | |
22 | - | case _ => | |
23 | - | wavesBalance(this).available | |
24 | - | } | |
25 | - | ||
26 | 27 | ||
27 | 28 | func getBase1 (data) = { | |
28 | 29 | let p_data = split_4C(data, "_") | |
78 | 79 | 0 | |
79 | 80 | } | |
80 | 81 | ||
82 | + | ||
83 | + | let Scale6 = 1000000 | |
84 | + | ||
85 | + | let Scale6BigInt = toBigInt(Scale6) | |
86 | + | ||
87 | + | let Scale8 = 100000000 | |
88 | + | ||
89 | + | let Scale8BigInt = toBigInt(Scale8) | |
90 | + | ||
91 | + | let ZeroBigInt = toBigInt(0) | |
92 | + | ||
93 | + | let SEP = "__" | |
94 | + | ||
95 | + | let InScale = 100000000 | |
96 | + | ||
97 | + | let InDecimals = 8 | |
98 | + | ||
99 | + | let InScaleBigInt = toBigInt(InScale) | |
100 | + | ||
101 | + | let InAsset = unit | |
102 | + | ||
103 | + | let InAssetStr = "WAVES" | |
104 | + | ||
105 | + | let wxSwapAddress = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93') | |
106 | + | ||
107 | + | let thisAddressStr = toString(this) | |
108 | + | ||
109 | + | func getIntOrZero (key) = valueOrElse(getInteger(key), 0) | |
110 | + | ||
111 | + | ||
112 | + | func getBalance (asset) = if ((asset == unit)) | |
113 | + | then wavesBalance(this).regular | |
114 | + | else assetBalance(this, value(asset)) | |
115 | + | ||
116 | + | ||
117 | + | func getAssetOrWaves (assetStr) = if ((assetStr == "WAVES")) | |
118 | + | then unit | |
119 | + | else fromBase58String(assetStr) | |
120 | + | ||
121 | + | ||
122 | + | let inBalance = getBalance(InAsset) | |
123 | + | ||
124 | + | let inBalanceBigInt = toBigInt(inBalance) | |
125 | + | ||
126 | + | func getSwopPool (pool) = { | |
127 | + | let assetIdAStr = getStringValue(pool, "A_asset_id") | |
128 | + | let assetIdBStr = getStringValue(pool, "B_asset_id") | |
129 | + | let assetIdA = getAssetOrWaves(assetIdAStr) | |
130 | + | let assetIdB = getAssetOrWaves(assetIdBStr) | |
131 | + | let balanceA = getIntegerValue(pool, "A_asset_balance") | |
132 | + | let balanceB = getIntegerValue(pool, "B_asset_balance") | |
133 | + | let outFee = (Scale6BigInt - toBigInt(getIntegerValue(pool, "commission"))) | |
134 | + | $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, Scale6BigInt, outFee, pool) | |
135 | + | } | |
136 | + | ||
137 | + | ||
138 | + | func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP) | |
139 | + | ||
140 | + | ||
141 | + | func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP) | |
142 | + | ||
143 | + | ||
144 | + | func getAdditionalBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyAdditionalBalance(assetId)), 0) | |
145 | + | ||
146 | + | ||
147 | + | func getStakingAssetBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyStakingAssetBalance(assetId)), 0) | |
148 | + | ||
149 | + | ||
150 | + | func getWxAccountBalance (pool,assetId) = { | |
151 | + | let balanceOnPool = if ((assetId == "WAVES")) | |
152 | + | then wavesBalance(pool).available | |
153 | + | else assetBalance(pool, fromBase58String(assetId)) | |
154 | + | let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(pool, assetId)) - getStakingAssetBalanceOrZero(pool, assetId)) | |
155 | + | max([0, totalBalance]) | |
156 | + | } | |
157 | + | ||
158 | + | ||
159 | + | func getWxPool (pool) = { | |
160 | + | let assetIdAStr = getStringValue(pool, "%s__amountAsset") | |
161 | + | let assetIdBStr = getStringValue(pool, "%s__priceAsset") | |
162 | + | let assetIdA = getAssetOrWaves(assetIdAStr) | |
163 | + | let assetIdB = getAssetOrWaves(assetIdBStr) | |
164 | + | let balanceA = getWxAccountBalance(pool, assetIdAStr) | |
165 | + | let balanceB = getWxAccountBalance(pool, assetIdBStr) | |
166 | + | let protocolFee = getIntegerValue(wxSwapAddress, "%s__protocolFee") | |
167 | + | let poolFee = getIntegerValue(wxSwapAddress, "%s__poolFee") | |
168 | + | let inFee = (Scale6BigInt - fraction(toBigInt((protocolFee + poolFee)), Scale6BigInt, Scale8BigInt)) | |
169 | + | $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, inFee, Scale6BigInt, wxSwapAddress) | |
170 | + | } | |
171 | + | ||
172 | + | ||
173 | + | func calcSwap (pmtAmount,tokenFrom,tokenTo,inFee,outFee) = { | |
174 | + | let cleanAmount = fraction(pmtAmount, inFee, Scale6BigInt) | |
175 | + | let amountWithoutFee = fraction(tokenTo, cleanAmount, (cleanAmount + tokenFrom)) | |
176 | + | let amountWithFee = fraction(amountWithoutFee, outFee, Scale6BigInt) | |
177 | + | amountWithFee | |
178 | + | } | |
179 | + | ||
180 | + | ||
181 | + | func estimateSwap (poolInfo,inAsset,inAmount) = { | |
182 | + | let routeArgs = if ((inAsset == poolInfo._3)) | |
183 | + | then $Tuple3(poolInfo._4, poolInfo._6, calcSwap(inAmount, poolInfo._1, poolInfo._2, poolInfo._7, poolInfo._8)) | |
184 | + | else $Tuple3(poolInfo._3, poolInfo._5, calcSwap(inAmount, poolInfo._2, poolInfo._1, poolInfo._7, poolInfo._8)) | |
185 | + | let dappArgs = if ((poolInfo._9 == wxSwapAddress)) | |
186 | + | then $Tuple2("swap", [0, routeArgs._2, thisAddressStr]) | |
187 | + | else $Tuple2("exchange", [1]) | |
188 | + | $Tuple4(routeArgs._1, routeArgs._3, dappArgs._1, dappArgs._2) | |
189 | + | } | |
190 | + | ||
191 | + | ||
192 | + | func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = { | |
193 | + | let a12 = if (pool1Reverse) | |
194 | + | then pool1._2 | |
195 | + | else pool1._1 | |
196 | + | let a21 = if (pool1Reverse) | |
197 | + | then pool1._1 | |
198 | + | else pool1._2 | |
199 | + | let a23 = if (pool2Reverse) | |
200 | + | then pool2._2 | |
201 | + | else pool2._1 | |
202 | + | let a32 = if (pool2Reverse) | |
203 | + | then pool2._1 | |
204 | + | else pool2._2 | |
205 | + | let a31 = if (pool3Reverse) | |
206 | + | then pool3._2 | |
207 | + | else pool3._1 | |
208 | + | let a13 = if (pool3Reverse) | |
209 | + | then pool3._1 | |
210 | + | else pool3._2 | |
211 | + | let aaDenominator = (a23 + fraction(fraction(a21, pool1._8, Scale6BigInt), pool2._7, Scale6BigInt)) | |
212 | + | let aa13 = fraction(a12, a23, aaDenominator) | |
213 | + | let aa31 = fraction(fraction(fraction(a21, a32, aaDenominator), pool2._7, Scale6BigInt), pool2._8, Scale6BigInt) | |
214 | + | let aDenominator = (a31 + fraction(fraction(aa31, pool1._7, Scale6BigInt), pool1._8, Scale6BigInt)) | |
215 | + | let a = fraction(aa13, a31, aDenominator) | |
216 | + | let aa = fraction(fraction(fraction(aa31, a13, aDenominator), pool3._7, Scale6BigInt), pool3._8, Scale6BigInt) | |
217 | + | let delta = fraction((sqrtBigInt(fraction(fraction(fraction(aa, a, InScaleBigInt), pool1._7, Scale6BigInt), pool1._8, Scale6BigInt), InDecimals, InDecimals, CEILING) - a), Scale6BigInt, pool1._7) | |
218 | + | if ((ZeroBigInt >= delta)) | |
219 | + | then $Tuple2(0, nil) | |
220 | + | else { | |
221 | + | let input = if ((delta > inBalanceBigInt)) | |
222 | + | then inBalanceBigInt | |
223 | + | else delta | |
224 | + | let swap1 = estimateSwap(pool1, InAsset, input) | |
225 | + | let swap2 = estimateSwap(pool2, swap1._1, swap1._2) | |
226 | + | let swap3 = estimateSwap(pool3, swap2._1, swap2._2) | |
227 | + | $Tuple2(toInt((swap3._2 - input)), [$Tuple5(pool1._9, swap1._3, swap1._4, InAsset, toInt(input)), $Tuple5(pool2._9, swap2._3, swap2._4, swap1._1, toInt(swap1._2)), $Tuple5(pool3._9, swap3._3, swap3._4, swap2._1, toInt(swap2._2))]) | |
228 | + | } | |
229 | + | } | |
230 | + | ||
231 | + | ||
232 | + | func invokeSwap (args) = { | |
233 | + | let currentBalance = getBalance(args._4) | |
234 | + | let trimmedAmount = if ((args._5 > currentBalance)) | |
235 | + | then currentBalance | |
236 | + | else args._5 | |
237 | + | let resultAmount = if ((args._4 == InAsset)) | |
238 | + | then trimmedAmount | |
239 | + | else if ((currentBalance > args._5)) | |
240 | + | then currentBalance | |
241 | + | else trimmedAmount | |
242 | + | invoke(args._1, args._2, args._3, [AttachedPayment(args._4, resultAmount)]) | |
243 | + | } | |
244 | + | ||
245 | + | ||
246 | + | let swop_btcwxg_xtn = getSwopPool(Address(base58'3PACj2DLTw3uUhsUmT98zHU5M4hPufbHKav')) | |
247 | + | ||
248 | + | let swop_crvwxg_xtn = getSwopPool(Address(base58'3P9o2H6G5d2xXBTfBEwjzHc16RLSZLFLQjp')) | |
249 | + | ||
250 | + | let swop_egg_waves = getSwopPool(Address(base58'3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ')) | |
251 | + | ||
252 | + | let swop_ethwxg_xtn = getSwopPool(Address(base58'3PNEC4YKqZiMMytFrYRVtpW2ujvi3aGXRPm')) | |
253 | + | ||
254 | + | let swop_ethppt_waves = getSwopPool(Address(base58'3P3KU81iteCQxKb8u15yEPcABknLEcCvGyr')) | |
255 | + | ||
256 | + | let swop_enno_xtn = getSwopPool(Address(base58'3P8bovWtkLFVToB8LxP8AZLoWVwC8rDZLQQ')) | |
257 | + | ||
258 | + | let swop_ltcwxg_xtn = getSwopPool(Address(base58'3P32Rjpo9YHoHaorLSxvnV6CkKFXyfDCkJh')) | |
259 | + | ||
260 | + | let swop_nsbt_xtn = getSwopPool(Address(base58'3P2V63Xd6BviDkeMzxhUw2SJyojByRz8a8m')) | |
261 | + | ||
262 | + | let swop_pluto_xtn = getSwopPool(Address(base58'3PDSXwwA2xAtmxeo2bebDP3AA5ynZ2Krgnw')) | |
263 | + | ||
264 | + | let swop_pwr_xtn = getSwopPool(Address(base58'3P88KDKWHNKNdbZxe8FfAJP8coAhvfDtuzV')) | |
265 | + | ||
266 | + | let swop_puzzle_xtn = getSwopPool(Address(base58'3PBHyEwmERR1CEkrTNbPj2bgyisTfPRqfee')) | |
267 | + | ||
268 | + | let swop_puzzle_waves = getSwopPool(Address(base58'3PRFKemXs4rAJYGPccNtP63Kw2UzwEdH7sZ')) | |
269 | + | ||
270 | + | let swop_race_egg = getSwopPool(Address(base58'3P3Z8Gn665CJr14bTLv4d5USDBUQCTeeCaT')) | |
271 | + | ||
272 | + | let swop_sign_xtn = getSwopPool(Address(base58'3P4Ftyud3U3xnuR8sTc1RvV4iQD62TcKndy')) | |
273 | + | ||
274 | + | let swop_surf_xtn = getSwopPool(Address(base58'3PLp9KrdrbWAvSFHGJVEaszUubquz3M6mfe')) | |
275 | + | ||
276 | + | let swop_swop_xtn = getSwopPool(Address(base58'3P27S9V36kw2McjWRZ37AxTx8iwkd7HXw6W')) | |
277 | + | ||
278 | + | let swop_swop_waves = getSwopPool(Address(base58'3PH8Np6jwuoikvkHL2qmdpFEHBR4UV5vwSq')) | |
279 | + | ||
280 | + | let swop_tsn_xtn = getSwopPool(Address(base58'3PCwvns2dnmobD6Z4cR86v98s7LgMZYygEy')) | |
281 | + | ||
282 | + | let swop_vires_xtn = getSwopPool(Address(base58'3PJ48P3p2wvWUjgQaQiZ2cFbr8qmxMokBGd')) | |
283 | + | ||
284 | + | let swop_vvusdnlp_xtn = getSwopPool(Address(base58'3PCkJuWHu1QJLHvcdUegYczfNVohS6c1A6o')) | |
285 | + | ||
286 | + | let swop_usdcwxg_usdtwxg = getSwopPool(Address(base58'3PJgkN4gy6b8qpA86otcJ2KDTbL8ay2n91s')) | |
287 | + | ||
288 | + | let swop_waves_btcwxg = getSwopPool(Address(base58'3P8FVZgAJUAq32UEZtTw84qS4zLqEREiEiP')) | |
289 | + | ||
290 | + | let swop_waves_xtn = getSwopPool(Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')) | |
291 | + | ||
292 | + | let swop_west_east = getSwopPool(Address(base58'3PHTDdjz8Kb5JcAkhzfR57MCUYoe73pyxxK')) | |
293 | + | ||
294 | + | let swop_waves_eurn = getSwopPool(Address(base58'3PK7Xe5BiedRyxHLuMQx5ey9riUQqvUths2')) | |
295 | + | ||
296 | + | let swop_waves_usdcppt = getSwopPool(Address(base58'3PESG2RvmPdDrMCbCVvzJvqxDR9d2HcAE2z')) | |
297 | + | ||
298 | + | let swop_waves_usdtppt = getSwopPool(Address(base58'3P2M9btqYdpENh1SkaHFDdc8XSjXHNiAXF5')) | |
299 | + | ||
300 | + | let swop_wct_xtn = getSwopPool(Address(base58'3PMDFxmG9uXAbuQgiNogZCBQASvCHt1Mdar')) | |
301 | + | ||
302 | + | let swop_west_xtn = getSwopPool(Address(base58'3P6DLdJTP2EySq9MFdJu6beUevrQd2sVVBh')) | |
303 | + | ||
304 | + | let swop_wx_xtn = getSwopPool(Address(base58'3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R')) | |
305 | + | ||
306 | + | let swop_xtn_usdtwxg = getSwopPool(Address(base58'3PAunb4Dadc9rQM2VJNQBgQV3vrgF9z8Evq')) | |
307 | + | ||
308 | + | let wx_bnbppt_waves = getWxPool(Address(base58'3PErdCQg2f8WYGG7DzSiH5FBosdnPHE6cND')) | |
309 | + | ||
310 | + | let wx_bnbwxg_xtn = getWxPool(Address(base58'3P8NCvcipinDQVQZujpczBdvG7FL5EvTqLM')) | |
311 | + | ||
312 | + | let wx_btcwxg_xtn = getWxPool(Address(base58'3PCBWDTA6jrFswd7gQgaE3Xk7gLM5RKofvp')) | |
313 | + | ||
314 | + | let wx_crv_xtn = getWxPool(Address(base58'3PHBmNjbaT8Re837JUfPGXeaW8NKfBQPr1u')) | |
315 | + | ||
316 | + | let wx_east_xtn = getWxPool(Address(base58'3PHxdxsgxNwEjVRt45sjeUfNZZ8uHzYVpvH')) | |
317 | + | ||
318 | + | let wx_egg_waves = getWxPool(Address(base58'3PJkUhnAHMaBTjyc7FkBfHantNUy871kBBW')) | |
319 | + | ||
320 | + | let wx_egg_xtn = getWxPool(Address(base58'3P3Y38zymCHoTM6qcE9JcEA8rhaGTQbVMgu')) | |
321 | + | ||
322 | + | let wx_enno_xtn = getWxPool(Address(base58'3P2H4iQAfxQCJaFCNgRLmKkLvv2yDhV93QC')) | |
323 | + | ||
324 | + | let wx_ethppt_waves = getWxPool(Address(base58'3P2yiVnK48evTLr8MAZWavpE4WA4fw1weQg')) | |
325 | + | ||
326 | + | let wx_ethppt_usdtppt = getWxPool(Address(base58'3PATKQATPmnxLd5DjXg8FmbXXbKpA1BVAvS')) | |
327 | + | ||
328 | + | let wx_ethwxg_waves = getWxPool(Address(base58'3P3XGTN6s292g9iwYhs3TEqJqHiffQYojuE')) | |
329 | + | ||
330 | + | let wx_ethwxg_xtn = getWxPool(Address(base58'3PEMqetsaJDbYMw1XGovmE37FB8VUhGnX9A')) | |
331 | + | ||
332 | + | let wx_eurn_xtn = getWxPool(Address(base58'3P879DU3ycr2XWorD7rR5gSpn1CpYgHjgFT')) | |
333 | + | ||
334 | + | let wx_ltcwxg_xtn = getWxPool(Address(base58'3P94wvu5gA7VhjPgAB3twaeqdwHCwNK2vsn')) | |
335 | + | ||
336 | + | let wx_nsbt_waves = getWxPool(Address(base58'3PPR4zVfWP4w4rshP541aiFtPNQN2sNJwrY')) | |
337 | + | ||
338 | + | let wx_nsbt_xtn = getWxPool(Address(base58'3P97XQCT9VYMXBxasVpDsE7eZfQ6cR9eS9n')) | |
339 | + | ||
340 | + | let wx_pluto_waves = getWxPool(Address(base58'3P6ZipK8ydb4qHmufCquh98g9KW6EwaeJfk')) | |
341 | + | ||
342 | + | let wx_pluto_xtn = getWxPool(Address(base58'3PEkD5LuHGWhUfgBW1owZFxVydYoWjV6Jia')) | |
343 | + | ||
344 | + | let wx_puzzle_waves = getWxPool(Address(base58'3PQaYm4pbRVrNTTnL8pDJZTxhcmD4jRskrz')) | |
345 | + | ||
346 | + | let wx_puzzle_xtn = getWxPool(Address(base58'3P615yXeQ9Qu4qBM1QGimGzixyMS5W4Ktug')) | |
347 | + | ||
348 | + | let wx_pwr_waves = getWxPool(Address(base58'3PDi7Qq8pLQYvtKyTfQuqqPUWyhoYbU957t')) | |
349 | + | ||
350 | + | let wx_race_xtn = getWxPool(Address(base58'3P2nHbqMt7hiYKQjYLT3AEDteS4SYGeHTuc')) | |
351 | + | ||
352 | + | let wx_sign_xtn = getWxPool(Address(base58'3P6UuvAt9RFuVznvjAQ7c2RrU25iU917WTN')) | |
353 | + | ||
354 | + | let wx_surf_waves = getWxPool(Address(base58'3PNnCngfvAzyvAQ1cEudZ3o6o3tFktsBVz5')) | |
355 | + | ||
356 | + | let wx_surf_usdcwxg = getWxPool(Address(base58'3PBfTdcoKmMNxZcjP8eTokbLFqYTUdoNKWL')) | |
357 | + | ||
358 | + | let wx_surf_usdtwxg = getWxPool(Address(base58'3PM6YyJauiFTZzVLuRcCkDwWBvWTvPYo1ZM')) | |
359 | + | ||
360 | + | let wx_swaves_waves = getWxPool(Address(base58'3PDVaJDqCadWeBugf768XeKiXtCCLUrYMge')) | |
361 | + | ||
362 | + | let wx_swaves_xtn = getWxPool(Address(base58'3PEmxUzcCbsAcw6Q3VNLTWdd8bjc8KBUEDz')) | |
363 | + | ||
364 | + | let wx_swop_waves = getWxPool(Address(base58'3PA8nK44sopUpXNcCRTpPSH2F7yjvxzx5cw')) | |
365 | + | ||
366 | + | let wx_swop_xtn = getWxPool(Address(base58'3PCApn7kL3UMdCVYA2Ln2UcQvfnkFRL1qDC')) | |
367 | + | ||
368 | + | let wx_usdtppt_xtn = getWxPool(Address(base58'3P5kfoYW7jPa9zYoTkN6Z6z8xtw8JGhymYB')) | |
369 | + | ||
370 | + | let wx_tsn_xtn = getWxPool(Address(base58'3PH832eKnw67PFvJfUg9Knz6BHM87QvjMeL')) | |
371 | + | ||
372 | + | let wx_vires_waves = getWxPool(Address(base58'3P7Z7X5kKXN4TpZ2SmqP2xyLGuotAqht1pU')) | |
373 | + | ||
374 | + | let wx_vires_xtn = getWxPool(Address(base58'3P5HjPowgipiVB3UvXphDiPvKs424WC9xQw')) | |
375 | + | ||
376 | + | let wx_vvusdnlp_xtn = getWxPool(Address(base58'3P9UJxhsqj1UkqPDtM16yi9aGE26V5tdH6i')) | |
377 | + | ||
378 | + | let wx_waves_btcwxg = getWxPool(Address(base58'3PPQDcvXuwVToC2QNWzPwxmLxLzMw9Eoe8C')) | |
379 | + | ||
380 | + | let wx_waves_busdwxg = getWxPool(Address(base58'3P9vSwu2eLLmyAi8BdEoZvTwsxSWjsAh8Jm')) | |
381 | + | ||
382 | + | let wx_waves_xtn = getWxPool(Address(base58'3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g')) | |
383 | + | ||
384 | + | let wx_waves_usdtppt = getWxPool(Address(base58'3PPeWowdyQLKwW9AExN5CgFa7X9ts7D4LkM')) | |
385 | + | ||
386 | + | let wx_waves_usdcwxg = getWxPool(Address(base58'3P3g3eipfG2NZKKQE8DZXt2E9tRJqii9jcX')) | |
387 | + | ||
388 | + | let wx_waves_usdtwxg = getWxPool(Address(base58'3PKMVZ7kQeaREajYi8Yc25Ro6mcNw5D6QSa')) | |
389 | + | ||
390 | + | let wx_wct_xtn = getWxPool(Address(base58'3P4bKahCwC2kPg8QcT8Pw5Br58hVgpziGsB')) | |
391 | + | ||
392 | + | let wx_west_waves = getWxPool(Address(base58'3PCA7wkovBpAGgm5e6rZMXyXY97jUwVENWe')) | |
393 | + | ||
394 | + | let wx_west_xtn = getWxPool(Address(base58'3PFxchXqKNjgP1CcbgFZjHyrEj9xMbSeLU3')) | |
395 | + | ||
396 | + | let wx_wx_usdtwxg = getWxPool(Address(base58'3PHiXGo7NTRoC2KqkMZ1y9LaA2QSrroGs8y')) | |
397 | + | ||
398 | + | let wx_wx_waves = getWxPool(Address(base58'3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh')) | |
399 | + | ||
400 | + | let wx_wx_xtn = getWxPool(Address(base58'3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99')) | |
401 | + | ||
402 | + | let routes = [$Tuple6(wx_waves_xtn, wx_wx_xtn, wx_wx_waves, false, true, false), $Tuple6(wx_wx_waves, wx_wx_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_waves_xtn, wx_btcwxg_xtn, wx_waves_btcwxg, false, true, true), $Tuple6(wx_waves_btcwxg, wx_btcwxg_xtn, wx_waves_xtn, false, false, true), $Tuple6(wx_waves_xtn, wx_ethwxg_xtn, wx_ethwxg_waves, false, true, false), $Tuple6(wx_ethwxg_waves, wx_ethwxg_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_waves_xtn, swop_pwr_xtn, wx_pwr_waves, false, true, false), $Tuple6(wx_pwr_waves, swop_pwr_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_surf_waves, wx_surf_usdtwxg, wx_waves_usdtwxg, true, false, true), $Tuple6(wx_waves_usdtwxg, wx_surf_usdtwxg, wx_surf_waves, false, true, false), $Tuple6(wx_surf_waves, wx_surf_usdcwxg, wx_waves_usdcwxg, true, false, true), $Tuple6(wx_waves_usdcwxg, wx_surf_usdcwxg, wx_surf_waves, false, true, false), $Tuple6(wx_wx_waves, wx_wx_usdtwxg, wx_waves_usdtwxg, true, false, true), $Tuple6(wx_waves_usdtwxg, wx_wx_usdtwxg, wx_wx_waves, false, true, false), $Tuple6(wx_waves_xtn, wx_nsbt_xtn, wx_nsbt_waves, false, true, false), $Tuple6(wx_nsbt_waves, wx_nsbt_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_waves_xtn, wx_swaves_xtn, wx_swaves_waves, false, true, false), $Tuple6(wx_swaves_waves, wx_swaves_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_waves_xtn, wx_vires_xtn, wx_vires_waves, false, true, false), $Tuple6(wx_vires_waves, wx_vires_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_waves_xtn, wx_usdtppt_xtn, wx_waves_usdtppt, false, true, true), $Tuple6(wx_waves_usdtppt, wx_usdtppt_xtn, wx_waves_xtn, false, false, true), $Tuple6(wx_waves_usdtppt, wx_ethppt_usdtppt, wx_ethppt_waves, false, true, false), $Tuple6(wx_ethppt_waves, wx_ethppt_usdtppt, wx_waves_usdtppt, true, false, true)] | |
81 | 403 | ||
82 | 404 | @Callable(i) | |
83 | 405 | func s () = if ((i.caller != this)) | |
1019 | 1341 | } | |
1020 | 1342 | ||
1021 | 1343 | ||
1344 | + | ||
1345 | + | @Callable(i) | |
1346 | + | func default () = if ((i.caller != this)) | |
1347 | + | then throw("No touching") | |
1348 | + | else { | |
1349 | + | func accumFunction (accum,next) = { | |
1350 | + | let estimation = estimateRoute(next._1, next._2, next._3, next._4, next._5, next._6) | |
1351 | + | $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2)) | |
1352 | + | } | |
1353 | + | ||
1354 | + | let fold = { | |
1355 | + | let $l = routes | |
1356 | + | let $s = size($l) | |
1357 | + | let $acc0 = $Tuple2(nil, nil) | |
1358 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
1359 | + | then $a | |
1360 | + | else accumFunction($a, $l[$i]) | |
1361 | + | ||
1362 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
1363 | + | then $a | |
1364 | + | else throw("List size exceeds 24") | |
1365 | + | ||
1366 | + | $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($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) | |
1367 | + | } | |
1368 | + | let maxSwapProfit = max(fold._1) | |
1369 | + | if ((0 >= maxSwapProfit)) | |
1370 | + | then throw("Estimate fail") | |
1371 | + | else { | |
1372 | + | let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))] | |
1373 | + | let result1 = invokeSwap(estimatedResult[0]) | |
1374 | + | if ((result1 == result1)) | |
1375 | + | then { | |
1376 | + | let result2 = invokeSwap(estimatedResult[1]) | |
1377 | + | if ((result2 == result2)) | |
1378 | + | then { | |
1379 | + | let result3 = invokeSwap(estimatedResult[2]) | |
1380 | + | if ((result3 == result3)) | |
1381 | + | then { | |
1382 | + | let profit = (getBalance(InAsset) - inBalance) | |
1383 | + | let pureProfit = (profit - 1500000) | |
1384 | + | if ((0 >= pureProfit)) | |
1385 | + | then throw("Execute fail") | |
1386 | + | else nil | |
1387 | + | } | |
1388 | + | else throw("Strict value is not equal to itself.") | |
1389 | + | } | |
1390 | + | else throw("Strict value is not equal to itself.") | |
1391 | + | } | |
1392 | + | else throw("Strict value is not equal to itself.") | |
1393 | + | } | |
1394 | + | } | |
1395 | + | ||
1396 | + | ||
1022 | 1397 | @Verifier(tx) | |
1023 | 1398 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
1024 | 1399 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let TOKEN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
5 | 5 | ||
6 | 6 | let fee_scale = 1000000 | |
7 | 7 | ||
8 | 8 | let w1 = match getString(this, "w1") { | |
9 | 9 | case r: String => | |
10 | 10 | r | |
11 | 11 | case _ => | |
12 | 12 | "" | |
13 | 13 | } | |
14 | 14 | ||
15 | + | let w2 = match getString(this, "w2") { | |
16 | + | case r: String => | |
17 | + | r | |
18 | + | case _ => | |
19 | + | "" | |
20 | + | } | |
21 | + | ||
22 | + | let USDN_ASSET_ID = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
23 | + | ||
15 | 24 | let WX_SWAP_DAPP = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93') | |
16 | 25 | ||
17 | 26 | let assets_in = ["DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"] | |
18 | - | ||
19 | - | func getBalance (assetId) = match assetId { | |
20 | - | case b: ByteVector => | |
21 | - | assetBalance(this, b) | |
22 | - | case _ => | |
23 | - | wavesBalance(this).available | |
24 | - | } | |
25 | - | ||
26 | 27 | ||
27 | 28 | func getBase1 (data) = { | |
28 | 29 | let p_data = split_4C(data, "_") | |
29 | 30 | let a = p_data[0] | |
30 | 31 | let a2 = p_data[1] | |
31 | 32 | let assetIn = assets_in[value(parseInt(p_data[2]))] | |
32 | 33 | let amountIn = p_data[3] | |
33 | 34 | $Tuple4(a, a2, assetIn, amountIn) | |
34 | 35 | } | |
35 | 36 | ||
36 | 37 | ||
37 | 38 | func getBase2 (data) = { | |
38 | 39 | let p_data = split(data, "_") | |
39 | 40 | let p1 = p_data[0] | |
40 | 41 | let t = p_data[1] | |
41 | 42 | $Tuple2(p1, t) | |
42 | 43 | } | |
43 | 44 | ||
44 | 45 | ||
45 | 46 | func getAssetBytes (assetId) = if ((assetId == "WAVES")) | |
46 | 47 | then unit | |
47 | 48 | else fromBase58String(assetId) | |
48 | 49 | ||
49 | 50 | ||
50 | 51 | func swap_wx (p,asset,amount,a) = { | |
51 | 52 | let call = invoke(WX_SWAP_DAPP, "swap", [1, a, toString(this)], [AttachedPayment(getAssetBytes(asset), amount)]) | |
52 | 53 | if ((call == call)) | |
53 | 54 | then nil | |
54 | 55 | else throw("Strict value is not equal to itself.") | |
55 | 56 | } | |
56 | 57 | ||
57 | 58 | ||
58 | 59 | func swap_swop (p,asset,amount) = { | |
59 | 60 | let swap = invoke(Address(fromBase58String(p)), "exchange", [1], [AttachedPayment(getAssetBytes(asset), amount)]) | |
60 | 61 | if ((swap == swap)) | |
61 | 62 | then nil | |
62 | 63 | else throw("Strict value is not equal to itself.") | |
63 | 64 | } | |
64 | 65 | ||
65 | 66 | ||
66 | 67 | func swap_puzzle (p,asset,amount,assetOut) = { | |
67 | 68 | let swap = invoke(Address(fromBase58String(p)), "swap", [assetOut, 1], [AttachedPayment(getAssetBytes(asset), amount)]) | |
68 | 69 | if ((swap == swap)) | |
69 | 70 | then nil | |
70 | 71 | else throw("Strict value is not equal to itself.") | |
71 | 72 | } | |
72 | 73 | ||
73 | 74 | ||
74 | 75 | func ucheck (id) = match transactionHeightById(id) { | |
75 | 76 | case h: Int => | |
76 | 77 | h | |
77 | 78 | case _ => | |
78 | 79 | 0 | |
79 | 80 | } | |
80 | 81 | ||
82 | + | ||
83 | + | let Scale6 = 1000000 | |
84 | + | ||
85 | + | let Scale6BigInt = toBigInt(Scale6) | |
86 | + | ||
87 | + | let Scale8 = 100000000 | |
88 | + | ||
89 | + | let Scale8BigInt = toBigInt(Scale8) | |
90 | + | ||
91 | + | let ZeroBigInt = toBigInt(0) | |
92 | + | ||
93 | + | let SEP = "__" | |
94 | + | ||
95 | + | let InScale = 100000000 | |
96 | + | ||
97 | + | let InDecimals = 8 | |
98 | + | ||
99 | + | let InScaleBigInt = toBigInt(InScale) | |
100 | + | ||
101 | + | let InAsset = unit | |
102 | + | ||
103 | + | let InAssetStr = "WAVES" | |
104 | + | ||
105 | + | let wxSwapAddress = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93') | |
106 | + | ||
107 | + | let thisAddressStr = toString(this) | |
108 | + | ||
109 | + | func getIntOrZero (key) = valueOrElse(getInteger(key), 0) | |
110 | + | ||
111 | + | ||
112 | + | func getBalance (asset) = if ((asset == unit)) | |
113 | + | then wavesBalance(this).regular | |
114 | + | else assetBalance(this, value(asset)) | |
115 | + | ||
116 | + | ||
117 | + | func getAssetOrWaves (assetStr) = if ((assetStr == "WAVES")) | |
118 | + | then unit | |
119 | + | else fromBase58String(assetStr) | |
120 | + | ||
121 | + | ||
122 | + | let inBalance = getBalance(InAsset) | |
123 | + | ||
124 | + | let inBalanceBigInt = toBigInt(inBalance) | |
125 | + | ||
126 | + | func getSwopPool (pool) = { | |
127 | + | let assetIdAStr = getStringValue(pool, "A_asset_id") | |
128 | + | let assetIdBStr = getStringValue(pool, "B_asset_id") | |
129 | + | let assetIdA = getAssetOrWaves(assetIdAStr) | |
130 | + | let assetIdB = getAssetOrWaves(assetIdBStr) | |
131 | + | let balanceA = getIntegerValue(pool, "A_asset_balance") | |
132 | + | let balanceB = getIntegerValue(pool, "B_asset_balance") | |
133 | + | let outFee = (Scale6BigInt - toBigInt(getIntegerValue(pool, "commission"))) | |
134 | + | $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, Scale6BigInt, outFee, pool) | |
135 | + | } | |
136 | + | ||
137 | + | ||
138 | + | func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP) | |
139 | + | ||
140 | + | ||
141 | + | func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP) | |
142 | + | ||
143 | + | ||
144 | + | func getAdditionalBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyAdditionalBalance(assetId)), 0) | |
145 | + | ||
146 | + | ||
147 | + | func getStakingAssetBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyStakingAssetBalance(assetId)), 0) | |
148 | + | ||
149 | + | ||
150 | + | func getWxAccountBalance (pool,assetId) = { | |
151 | + | let balanceOnPool = if ((assetId == "WAVES")) | |
152 | + | then wavesBalance(pool).available | |
153 | + | else assetBalance(pool, fromBase58String(assetId)) | |
154 | + | let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(pool, assetId)) - getStakingAssetBalanceOrZero(pool, assetId)) | |
155 | + | max([0, totalBalance]) | |
156 | + | } | |
157 | + | ||
158 | + | ||
159 | + | func getWxPool (pool) = { | |
160 | + | let assetIdAStr = getStringValue(pool, "%s__amountAsset") | |
161 | + | let assetIdBStr = getStringValue(pool, "%s__priceAsset") | |
162 | + | let assetIdA = getAssetOrWaves(assetIdAStr) | |
163 | + | let assetIdB = getAssetOrWaves(assetIdBStr) | |
164 | + | let balanceA = getWxAccountBalance(pool, assetIdAStr) | |
165 | + | let balanceB = getWxAccountBalance(pool, assetIdBStr) | |
166 | + | let protocolFee = getIntegerValue(wxSwapAddress, "%s__protocolFee") | |
167 | + | let poolFee = getIntegerValue(wxSwapAddress, "%s__poolFee") | |
168 | + | let inFee = (Scale6BigInt - fraction(toBigInt((protocolFee + poolFee)), Scale6BigInt, Scale8BigInt)) | |
169 | + | $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, inFee, Scale6BigInt, wxSwapAddress) | |
170 | + | } | |
171 | + | ||
172 | + | ||
173 | + | func calcSwap (pmtAmount,tokenFrom,tokenTo,inFee,outFee) = { | |
174 | + | let cleanAmount = fraction(pmtAmount, inFee, Scale6BigInt) | |
175 | + | let amountWithoutFee = fraction(tokenTo, cleanAmount, (cleanAmount + tokenFrom)) | |
176 | + | let amountWithFee = fraction(amountWithoutFee, outFee, Scale6BigInt) | |
177 | + | amountWithFee | |
178 | + | } | |
179 | + | ||
180 | + | ||
181 | + | func estimateSwap (poolInfo,inAsset,inAmount) = { | |
182 | + | let routeArgs = if ((inAsset == poolInfo._3)) | |
183 | + | then $Tuple3(poolInfo._4, poolInfo._6, calcSwap(inAmount, poolInfo._1, poolInfo._2, poolInfo._7, poolInfo._8)) | |
184 | + | else $Tuple3(poolInfo._3, poolInfo._5, calcSwap(inAmount, poolInfo._2, poolInfo._1, poolInfo._7, poolInfo._8)) | |
185 | + | let dappArgs = if ((poolInfo._9 == wxSwapAddress)) | |
186 | + | then $Tuple2("swap", [0, routeArgs._2, thisAddressStr]) | |
187 | + | else $Tuple2("exchange", [1]) | |
188 | + | $Tuple4(routeArgs._1, routeArgs._3, dappArgs._1, dappArgs._2) | |
189 | + | } | |
190 | + | ||
191 | + | ||
192 | + | func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = { | |
193 | + | let a12 = if (pool1Reverse) | |
194 | + | then pool1._2 | |
195 | + | else pool1._1 | |
196 | + | let a21 = if (pool1Reverse) | |
197 | + | then pool1._1 | |
198 | + | else pool1._2 | |
199 | + | let a23 = if (pool2Reverse) | |
200 | + | then pool2._2 | |
201 | + | else pool2._1 | |
202 | + | let a32 = if (pool2Reverse) | |
203 | + | then pool2._1 | |
204 | + | else pool2._2 | |
205 | + | let a31 = if (pool3Reverse) | |
206 | + | then pool3._2 | |
207 | + | else pool3._1 | |
208 | + | let a13 = if (pool3Reverse) | |
209 | + | then pool3._1 | |
210 | + | else pool3._2 | |
211 | + | let aaDenominator = (a23 + fraction(fraction(a21, pool1._8, Scale6BigInt), pool2._7, Scale6BigInt)) | |
212 | + | let aa13 = fraction(a12, a23, aaDenominator) | |
213 | + | let aa31 = fraction(fraction(fraction(a21, a32, aaDenominator), pool2._7, Scale6BigInt), pool2._8, Scale6BigInt) | |
214 | + | let aDenominator = (a31 + fraction(fraction(aa31, pool1._7, Scale6BigInt), pool1._8, Scale6BigInt)) | |
215 | + | let a = fraction(aa13, a31, aDenominator) | |
216 | + | let aa = fraction(fraction(fraction(aa31, a13, aDenominator), pool3._7, Scale6BigInt), pool3._8, Scale6BigInt) | |
217 | + | let delta = fraction((sqrtBigInt(fraction(fraction(fraction(aa, a, InScaleBigInt), pool1._7, Scale6BigInt), pool1._8, Scale6BigInt), InDecimals, InDecimals, CEILING) - a), Scale6BigInt, pool1._7) | |
218 | + | if ((ZeroBigInt >= delta)) | |
219 | + | then $Tuple2(0, nil) | |
220 | + | else { | |
221 | + | let input = if ((delta > inBalanceBigInt)) | |
222 | + | then inBalanceBigInt | |
223 | + | else delta | |
224 | + | let swap1 = estimateSwap(pool1, InAsset, input) | |
225 | + | let swap2 = estimateSwap(pool2, swap1._1, swap1._2) | |
226 | + | let swap3 = estimateSwap(pool3, swap2._1, swap2._2) | |
227 | + | $Tuple2(toInt((swap3._2 - input)), [$Tuple5(pool1._9, swap1._3, swap1._4, InAsset, toInt(input)), $Tuple5(pool2._9, swap2._3, swap2._4, swap1._1, toInt(swap1._2)), $Tuple5(pool3._9, swap3._3, swap3._4, swap2._1, toInt(swap2._2))]) | |
228 | + | } | |
229 | + | } | |
230 | + | ||
231 | + | ||
232 | + | func invokeSwap (args) = { | |
233 | + | let currentBalance = getBalance(args._4) | |
234 | + | let trimmedAmount = if ((args._5 > currentBalance)) | |
235 | + | then currentBalance | |
236 | + | else args._5 | |
237 | + | let resultAmount = if ((args._4 == InAsset)) | |
238 | + | then trimmedAmount | |
239 | + | else if ((currentBalance > args._5)) | |
240 | + | then currentBalance | |
241 | + | else trimmedAmount | |
242 | + | invoke(args._1, args._2, args._3, [AttachedPayment(args._4, resultAmount)]) | |
243 | + | } | |
244 | + | ||
245 | + | ||
246 | + | let swop_btcwxg_xtn = getSwopPool(Address(base58'3PACj2DLTw3uUhsUmT98zHU5M4hPufbHKav')) | |
247 | + | ||
248 | + | let swop_crvwxg_xtn = getSwopPool(Address(base58'3P9o2H6G5d2xXBTfBEwjzHc16RLSZLFLQjp')) | |
249 | + | ||
250 | + | let swop_egg_waves = getSwopPool(Address(base58'3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ')) | |
251 | + | ||
252 | + | let swop_ethwxg_xtn = getSwopPool(Address(base58'3PNEC4YKqZiMMytFrYRVtpW2ujvi3aGXRPm')) | |
253 | + | ||
254 | + | let swop_ethppt_waves = getSwopPool(Address(base58'3P3KU81iteCQxKb8u15yEPcABknLEcCvGyr')) | |
255 | + | ||
256 | + | let swop_enno_xtn = getSwopPool(Address(base58'3P8bovWtkLFVToB8LxP8AZLoWVwC8rDZLQQ')) | |
257 | + | ||
258 | + | let swop_ltcwxg_xtn = getSwopPool(Address(base58'3P32Rjpo9YHoHaorLSxvnV6CkKFXyfDCkJh')) | |
259 | + | ||
260 | + | let swop_nsbt_xtn = getSwopPool(Address(base58'3P2V63Xd6BviDkeMzxhUw2SJyojByRz8a8m')) | |
261 | + | ||
262 | + | let swop_pluto_xtn = getSwopPool(Address(base58'3PDSXwwA2xAtmxeo2bebDP3AA5ynZ2Krgnw')) | |
263 | + | ||
264 | + | let swop_pwr_xtn = getSwopPool(Address(base58'3P88KDKWHNKNdbZxe8FfAJP8coAhvfDtuzV')) | |
265 | + | ||
266 | + | let swop_puzzle_xtn = getSwopPool(Address(base58'3PBHyEwmERR1CEkrTNbPj2bgyisTfPRqfee')) | |
267 | + | ||
268 | + | let swop_puzzle_waves = getSwopPool(Address(base58'3PRFKemXs4rAJYGPccNtP63Kw2UzwEdH7sZ')) | |
269 | + | ||
270 | + | let swop_race_egg = getSwopPool(Address(base58'3P3Z8Gn665CJr14bTLv4d5USDBUQCTeeCaT')) | |
271 | + | ||
272 | + | let swop_sign_xtn = getSwopPool(Address(base58'3P4Ftyud3U3xnuR8sTc1RvV4iQD62TcKndy')) | |
273 | + | ||
274 | + | let swop_surf_xtn = getSwopPool(Address(base58'3PLp9KrdrbWAvSFHGJVEaszUubquz3M6mfe')) | |
275 | + | ||
276 | + | let swop_swop_xtn = getSwopPool(Address(base58'3P27S9V36kw2McjWRZ37AxTx8iwkd7HXw6W')) | |
277 | + | ||
278 | + | let swop_swop_waves = getSwopPool(Address(base58'3PH8Np6jwuoikvkHL2qmdpFEHBR4UV5vwSq')) | |
279 | + | ||
280 | + | let swop_tsn_xtn = getSwopPool(Address(base58'3PCwvns2dnmobD6Z4cR86v98s7LgMZYygEy')) | |
281 | + | ||
282 | + | let swop_vires_xtn = getSwopPool(Address(base58'3PJ48P3p2wvWUjgQaQiZ2cFbr8qmxMokBGd')) | |
283 | + | ||
284 | + | let swop_vvusdnlp_xtn = getSwopPool(Address(base58'3PCkJuWHu1QJLHvcdUegYczfNVohS6c1A6o')) | |
285 | + | ||
286 | + | let swop_usdcwxg_usdtwxg = getSwopPool(Address(base58'3PJgkN4gy6b8qpA86otcJ2KDTbL8ay2n91s')) | |
287 | + | ||
288 | + | let swop_waves_btcwxg = getSwopPool(Address(base58'3P8FVZgAJUAq32UEZtTw84qS4zLqEREiEiP')) | |
289 | + | ||
290 | + | let swop_waves_xtn = getSwopPool(Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')) | |
291 | + | ||
292 | + | let swop_west_east = getSwopPool(Address(base58'3PHTDdjz8Kb5JcAkhzfR57MCUYoe73pyxxK')) | |
293 | + | ||
294 | + | let swop_waves_eurn = getSwopPool(Address(base58'3PK7Xe5BiedRyxHLuMQx5ey9riUQqvUths2')) | |
295 | + | ||
296 | + | let swop_waves_usdcppt = getSwopPool(Address(base58'3PESG2RvmPdDrMCbCVvzJvqxDR9d2HcAE2z')) | |
297 | + | ||
298 | + | let swop_waves_usdtppt = getSwopPool(Address(base58'3P2M9btqYdpENh1SkaHFDdc8XSjXHNiAXF5')) | |
299 | + | ||
300 | + | let swop_wct_xtn = getSwopPool(Address(base58'3PMDFxmG9uXAbuQgiNogZCBQASvCHt1Mdar')) | |
301 | + | ||
302 | + | let swop_west_xtn = getSwopPool(Address(base58'3P6DLdJTP2EySq9MFdJu6beUevrQd2sVVBh')) | |
303 | + | ||
304 | + | let swop_wx_xtn = getSwopPool(Address(base58'3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R')) | |
305 | + | ||
306 | + | let swop_xtn_usdtwxg = getSwopPool(Address(base58'3PAunb4Dadc9rQM2VJNQBgQV3vrgF9z8Evq')) | |
307 | + | ||
308 | + | let wx_bnbppt_waves = getWxPool(Address(base58'3PErdCQg2f8WYGG7DzSiH5FBosdnPHE6cND')) | |
309 | + | ||
310 | + | let wx_bnbwxg_xtn = getWxPool(Address(base58'3P8NCvcipinDQVQZujpczBdvG7FL5EvTqLM')) | |
311 | + | ||
312 | + | let wx_btcwxg_xtn = getWxPool(Address(base58'3PCBWDTA6jrFswd7gQgaE3Xk7gLM5RKofvp')) | |
313 | + | ||
314 | + | let wx_crv_xtn = getWxPool(Address(base58'3PHBmNjbaT8Re837JUfPGXeaW8NKfBQPr1u')) | |
315 | + | ||
316 | + | let wx_east_xtn = getWxPool(Address(base58'3PHxdxsgxNwEjVRt45sjeUfNZZ8uHzYVpvH')) | |
317 | + | ||
318 | + | let wx_egg_waves = getWxPool(Address(base58'3PJkUhnAHMaBTjyc7FkBfHantNUy871kBBW')) | |
319 | + | ||
320 | + | let wx_egg_xtn = getWxPool(Address(base58'3P3Y38zymCHoTM6qcE9JcEA8rhaGTQbVMgu')) | |
321 | + | ||
322 | + | let wx_enno_xtn = getWxPool(Address(base58'3P2H4iQAfxQCJaFCNgRLmKkLvv2yDhV93QC')) | |
323 | + | ||
324 | + | let wx_ethppt_waves = getWxPool(Address(base58'3P2yiVnK48evTLr8MAZWavpE4WA4fw1weQg')) | |
325 | + | ||
326 | + | let wx_ethppt_usdtppt = getWxPool(Address(base58'3PATKQATPmnxLd5DjXg8FmbXXbKpA1BVAvS')) | |
327 | + | ||
328 | + | let wx_ethwxg_waves = getWxPool(Address(base58'3P3XGTN6s292g9iwYhs3TEqJqHiffQYojuE')) | |
329 | + | ||
330 | + | let wx_ethwxg_xtn = getWxPool(Address(base58'3PEMqetsaJDbYMw1XGovmE37FB8VUhGnX9A')) | |
331 | + | ||
332 | + | let wx_eurn_xtn = getWxPool(Address(base58'3P879DU3ycr2XWorD7rR5gSpn1CpYgHjgFT')) | |
333 | + | ||
334 | + | let wx_ltcwxg_xtn = getWxPool(Address(base58'3P94wvu5gA7VhjPgAB3twaeqdwHCwNK2vsn')) | |
335 | + | ||
336 | + | let wx_nsbt_waves = getWxPool(Address(base58'3PPR4zVfWP4w4rshP541aiFtPNQN2sNJwrY')) | |
337 | + | ||
338 | + | let wx_nsbt_xtn = getWxPool(Address(base58'3P97XQCT9VYMXBxasVpDsE7eZfQ6cR9eS9n')) | |
339 | + | ||
340 | + | let wx_pluto_waves = getWxPool(Address(base58'3P6ZipK8ydb4qHmufCquh98g9KW6EwaeJfk')) | |
341 | + | ||
342 | + | let wx_pluto_xtn = getWxPool(Address(base58'3PEkD5LuHGWhUfgBW1owZFxVydYoWjV6Jia')) | |
343 | + | ||
344 | + | let wx_puzzle_waves = getWxPool(Address(base58'3PQaYm4pbRVrNTTnL8pDJZTxhcmD4jRskrz')) | |
345 | + | ||
346 | + | let wx_puzzle_xtn = getWxPool(Address(base58'3P615yXeQ9Qu4qBM1QGimGzixyMS5W4Ktug')) | |
347 | + | ||
348 | + | let wx_pwr_waves = getWxPool(Address(base58'3PDi7Qq8pLQYvtKyTfQuqqPUWyhoYbU957t')) | |
349 | + | ||
350 | + | let wx_race_xtn = getWxPool(Address(base58'3P2nHbqMt7hiYKQjYLT3AEDteS4SYGeHTuc')) | |
351 | + | ||
352 | + | let wx_sign_xtn = getWxPool(Address(base58'3P6UuvAt9RFuVznvjAQ7c2RrU25iU917WTN')) | |
353 | + | ||
354 | + | let wx_surf_waves = getWxPool(Address(base58'3PNnCngfvAzyvAQ1cEudZ3o6o3tFktsBVz5')) | |
355 | + | ||
356 | + | let wx_surf_usdcwxg = getWxPool(Address(base58'3PBfTdcoKmMNxZcjP8eTokbLFqYTUdoNKWL')) | |
357 | + | ||
358 | + | let wx_surf_usdtwxg = getWxPool(Address(base58'3PM6YyJauiFTZzVLuRcCkDwWBvWTvPYo1ZM')) | |
359 | + | ||
360 | + | let wx_swaves_waves = getWxPool(Address(base58'3PDVaJDqCadWeBugf768XeKiXtCCLUrYMge')) | |
361 | + | ||
362 | + | let wx_swaves_xtn = getWxPool(Address(base58'3PEmxUzcCbsAcw6Q3VNLTWdd8bjc8KBUEDz')) | |
363 | + | ||
364 | + | let wx_swop_waves = getWxPool(Address(base58'3PA8nK44sopUpXNcCRTpPSH2F7yjvxzx5cw')) | |
365 | + | ||
366 | + | let wx_swop_xtn = getWxPool(Address(base58'3PCApn7kL3UMdCVYA2Ln2UcQvfnkFRL1qDC')) | |
367 | + | ||
368 | + | let wx_usdtppt_xtn = getWxPool(Address(base58'3P5kfoYW7jPa9zYoTkN6Z6z8xtw8JGhymYB')) | |
369 | + | ||
370 | + | let wx_tsn_xtn = getWxPool(Address(base58'3PH832eKnw67PFvJfUg9Knz6BHM87QvjMeL')) | |
371 | + | ||
372 | + | let wx_vires_waves = getWxPool(Address(base58'3P7Z7X5kKXN4TpZ2SmqP2xyLGuotAqht1pU')) | |
373 | + | ||
374 | + | let wx_vires_xtn = getWxPool(Address(base58'3P5HjPowgipiVB3UvXphDiPvKs424WC9xQw')) | |
375 | + | ||
376 | + | let wx_vvusdnlp_xtn = getWxPool(Address(base58'3P9UJxhsqj1UkqPDtM16yi9aGE26V5tdH6i')) | |
377 | + | ||
378 | + | let wx_waves_btcwxg = getWxPool(Address(base58'3PPQDcvXuwVToC2QNWzPwxmLxLzMw9Eoe8C')) | |
379 | + | ||
380 | + | let wx_waves_busdwxg = getWxPool(Address(base58'3P9vSwu2eLLmyAi8BdEoZvTwsxSWjsAh8Jm')) | |
381 | + | ||
382 | + | let wx_waves_xtn = getWxPool(Address(base58'3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g')) | |
383 | + | ||
384 | + | let wx_waves_usdtppt = getWxPool(Address(base58'3PPeWowdyQLKwW9AExN5CgFa7X9ts7D4LkM')) | |
385 | + | ||
386 | + | let wx_waves_usdcwxg = getWxPool(Address(base58'3P3g3eipfG2NZKKQE8DZXt2E9tRJqii9jcX')) | |
387 | + | ||
388 | + | let wx_waves_usdtwxg = getWxPool(Address(base58'3PKMVZ7kQeaREajYi8Yc25Ro6mcNw5D6QSa')) | |
389 | + | ||
390 | + | let wx_wct_xtn = getWxPool(Address(base58'3P4bKahCwC2kPg8QcT8Pw5Br58hVgpziGsB')) | |
391 | + | ||
392 | + | let wx_west_waves = getWxPool(Address(base58'3PCA7wkovBpAGgm5e6rZMXyXY97jUwVENWe')) | |
393 | + | ||
394 | + | let wx_west_xtn = getWxPool(Address(base58'3PFxchXqKNjgP1CcbgFZjHyrEj9xMbSeLU3')) | |
395 | + | ||
396 | + | let wx_wx_usdtwxg = getWxPool(Address(base58'3PHiXGo7NTRoC2KqkMZ1y9LaA2QSrroGs8y')) | |
397 | + | ||
398 | + | let wx_wx_waves = getWxPool(Address(base58'3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh')) | |
399 | + | ||
400 | + | let wx_wx_xtn = getWxPool(Address(base58'3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99')) | |
401 | + | ||
402 | + | let routes = [$Tuple6(wx_waves_xtn, wx_wx_xtn, wx_wx_waves, false, true, false), $Tuple6(wx_wx_waves, wx_wx_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_waves_xtn, wx_btcwxg_xtn, wx_waves_btcwxg, false, true, true), $Tuple6(wx_waves_btcwxg, wx_btcwxg_xtn, wx_waves_xtn, false, false, true), $Tuple6(wx_waves_xtn, wx_ethwxg_xtn, wx_ethwxg_waves, false, true, false), $Tuple6(wx_ethwxg_waves, wx_ethwxg_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_waves_xtn, swop_pwr_xtn, wx_pwr_waves, false, true, false), $Tuple6(wx_pwr_waves, swop_pwr_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_surf_waves, wx_surf_usdtwxg, wx_waves_usdtwxg, true, false, true), $Tuple6(wx_waves_usdtwxg, wx_surf_usdtwxg, wx_surf_waves, false, true, false), $Tuple6(wx_surf_waves, wx_surf_usdcwxg, wx_waves_usdcwxg, true, false, true), $Tuple6(wx_waves_usdcwxg, wx_surf_usdcwxg, wx_surf_waves, false, true, false), $Tuple6(wx_wx_waves, wx_wx_usdtwxg, wx_waves_usdtwxg, true, false, true), $Tuple6(wx_waves_usdtwxg, wx_wx_usdtwxg, wx_wx_waves, false, true, false), $Tuple6(wx_waves_xtn, wx_nsbt_xtn, wx_nsbt_waves, false, true, false), $Tuple6(wx_nsbt_waves, wx_nsbt_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_waves_xtn, wx_swaves_xtn, wx_swaves_waves, false, true, false), $Tuple6(wx_swaves_waves, wx_swaves_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_waves_xtn, wx_vires_xtn, wx_vires_waves, false, true, false), $Tuple6(wx_vires_waves, wx_vires_xtn, wx_waves_xtn, true, false, true), $Tuple6(wx_waves_xtn, wx_usdtppt_xtn, wx_waves_usdtppt, false, true, true), $Tuple6(wx_waves_usdtppt, wx_usdtppt_xtn, wx_waves_xtn, false, false, true), $Tuple6(wx_waves_usdtppt, wx_ethppt_usdtppt, wx_ethppt_waves, false, true, false), $Tuple6(wx_ethppt_waves, wx_ethppt_usdtppt, wx_waves_usdtppt, true, false, true)] | |
81 | 403 | ||
82 | 404 | @Callable(i) | |
83 | 405 | func s () = if ((i.caller != this)) | |
84 | 406 | then throw("self") | |
85 | 407 | else [StringEntry("current", toBase58String(i.transactionId))] | |
86 | 408 | ||
87 | 409 | ||
88 | 410 | ||
89 | 411 | @Callable(i) | |
90 | 412 | func e () = if ((i.caller != this)) | |
91 | 413 | then throw("self") | |
92 | 414 | else [DeleteEntry("current")] | |
93 | 415 | ||
94 | 416 | ||
95 | 417 | ||
96 | 418 | @Callable(i) | |
97 | 419 | func sf (fee) = if ((i.caller != this)) | |
98 | 420 | then throw("self") | |
99 | 421 | else [IntegerEntry("fee", fee)] | |
100 | 422 | ||
101 | 423 | ||
102 | 424 | ||
103 | 425 | @Callable(i) | |
104 | 426 | func d () = if (!(containsElement(split_4C(w1, "|"), toBase58String(i.caller.bytes)))) | |
105 | 427 | then throw("wl") | |
106 | 428 | else { | |
107 | 429 | let current = match getString(this, "current") { | |
108 | 430 | case ret: String => | |
109 | 431 | throw("current") | |
110 | 432 | case _ => | |
111 | 433 | "" | |
112 | 434 | } | |
113 | 435 | let pmt = if ((size(i.payments) == 1)) | |
114 | 436 | then i.payments[0] | |
115 | 437 | else throw("1 payment expected") | |
116 | 438 | if ((pmt.assetId != TOKEN)) | |
117 | 439 | then throw("wrong token") | |
118 | 440 | else { | |
119 | 441 | let caller = toBase58String(i.caller.bytes) | |
120 | 442 | let currentAmount = match getInteger(this, ("deposit_" + caller)) { | |
121 | 443 | case a: Int => | |
122 | 444 | a | |
123 | 445 | case _ => | |
124 | 446 | 0 | |
125 | 447 | } | |
126 | 448 | let totalDeposit = match getInteger(this, "total_deposit") { | |
127 | 449 | case a: Int => | |
128 | 450 | a | |
129 | 451 | case _ => | |
130 | 452 | 0 | |
131 | 453 | } | |
132 | 454 | let newAmount = (currentAmount + pmt.amount) | |
133 | 455 | [IntegerEntry(("deposit_" + caller), newAmount), IntegerEntry("total_deposit", (totalDeposit + pmt.amount))] | |
134 | 456 | } | |
135 | 457 | } | |
136 | 458 | ||
137 | 459 | ||
138 | 460 | ||
139 | 461 | @Callable(i) | |
140 | 462 | func w (amnt) = if ((this != i.caller)) | |
141 | 463 | then throw("wl") | |
142 | 464 | else { | |
143 | 465 | let current = match getString(this, "current") { | |
144 | 466 | case ret: String => | |
145 | 467 | throw("current") | |
146 | 468 | case _ => | |
147 | 469 | "" | |
148 | 470 | } | |
149 | 471 | let caller = toBase58String(i.caller.bytes) | |
150 | 472 | let currentAmount = match getInteger(this, ("deposit_" + caller)) { | |
151 | 473 | case a: Int => | |
152 | 474 | a | |
153 | 475 | case _ => | |
154 | 476 | 0 | |
155 | 477 | } | |
156 | 478 | if ((amnt > currentAmount)) | |
157 | 479 | then throw("w > d") | |
158 | 480 | else { | |
159 | 481 | let newAmount = (currentAmount - amnt) | |
160 | 482 | if ((0 > newAmount)) | |
161 | 483 | then throw("underflow") | |
162 | 484 | else { | |
163 | 485 | let totalDeposit = match getInteger(this, "total_deposit") { | |
164 | 486 | case a: Int => | |
165 | 487 | a | |
166 | 488 | case _ => | |
167 | 489 | 0 | |
168 | 490 | } | |
169 | 491 | [IntegerEntry(("deposit_" + caller), newAmount), IntegerEntry("total_deposit", (totalDeposit - amnt)), ScriptTransfer(i.caller, amnt, TOKEN)] | |
170 | 492 | } | |
171 | 493 | } | |
172 | 494 | } | |
173 | 495 | ||
174 | 496 | ||
175 | 497 | ||
176 | 498 | @Callable(i) | |
177 | 499 | func x (amnt,a,f,data) = if ((this != i.caller)) | |
178 | 500 | then throw("wl") | |
179 | 501 | else { | |
180 | 502 | let st = assetBalance(this, TOKEN) | |
181 | 503 | if ((st == st)) | |
182 | 504 | then { | |
183 | 505 | let ii = reentrantInvoke(addressFromStringValue(a), f, [data], [AttachedPayment(TOKEN, amnt)]) | |
184 | 506 | if ((ii == ii)) | |
185 | 507 | then { | |
186 | 508 | let et = assetBalance(this, TOKEN) | |
187 | 509 | if ((et == et)) | |
188 | 510 | then { | |
189 | 511 | let fee_r = match getInteger(this, "fee") { | |
190 | 512 | case ret: Int => | |
191 | 513 | ret | |
192 | 514 | case _ => | |
193 | 515 | 0 | |
194 | 516 | } | |
195 | 517 | let fee = fraction(st, fee_r, fee_scale, DOWN) | |
196 | 518 | if (((st + fee) > et)) | |
197 | 519 | then throw(("! " + toString((st + fee)))) | |
198 | 520 | else nil | |
199 | 521 | } | |
200 | 522 | else throw("Strict value is not equal to itself.") | |
201 | 523 | } | |
202 | 524 | else throw("Strict value is not equal to itself.") | |
203 | 525 | } | |
204 | 526 | else throw("Strict value is not equal to itself.") | |
205 | 527 | } | |
206 | 528 | ||
207 | 529 | ||
208 | 530 | ||
209 | 531 | @Callable(i) | |
210 | 532 | func arbWaves (path,amount) = { | |
211 | 533 | let poolAddress = "3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g" | |
212 | 534 | let pool = addressFromStringValue(poolAddress) | |
213 | 535 | let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
214 | 536 | let usdnAssetIdString = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
215 | 537 | let usdnWavesLPTokenAssetId = base58'7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1' | |
216 | 538 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
217 | 539 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
218 | 540 | if ((i.caller != this)) | |
219 | 541 | then throw("you are not allowed to arb!") | |
220 | 542 | else { | |
221 | 543 | let initialWavesBalance = wavesBalance(this).available | |
222 | 544 | if ((initialWavesBalance == initialWavesBalance)) | |
223 | 545 | then { | |
224 | 546 | let initialAmount = assetBalance(this, usdnAssetId) | |
225 | 547 | if ((initialAmount == initialAmount)) | |
226 | 548 | then { | |
227 | 549 | let buyOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(usdnAssetId, (amount * 1000000))]) | |
228 | 550 | if ((buyOnPuzzle == buyOnPuzzle)) | |
229 | 551 | then { | |
230 | 552 | let wavesTokenBalance = (wavesBalance(this).available - initialWavesBalance) | |
231 | 553 | if ((wavesTokenBalance == wavesTokenBalance)) | |
232 | 554 | then { | |
233 | 555 | let putTheTokenInThePool = invoke(pool, "putOneTkn", [1, false], [AttachedPayment(unit, wavesTokenBalance)]) | |
234 | 556 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
235 | 557 | then { | |
236 | 558 | let lpTokenBalance = assetBalance(this, usdnWavesLPTokenAssetId) | |
237 | 559 | if ((lpTokenBalance == lpTokenBalance)) | |
238 | 560 | then { | |
239 | 561 | let sellPoolToken = invoke(pool, "getOneTkn", [usdnAssetIdString, 1], [AttachedPayment(usdnWavesLPTokenAssetId, lpTokenBalance)]) | |
240 | 562 | if ((sellPoolToken == sellPoolToken)) | |
241 | 563 | then { | |
242 | 564 | let finalAmount = assetBalance(this, usdnAssetId) | |
243 | 565 | if ((finalAmount == finalAmount)) | |
244 | 566 | then if ((initialAmount >= finalAmount)) | |
245 | 567 | then throw("arb not successful!") | |
246 | 568 | else nil | |
247 | 569 | else throw("Strict value is not equal to itself.") | |
248 | 570 | } | |
249 | 571 | else throw("Strict value is not equal to itself.") | |
250 | 572 | } | |
251 | 573 | else throw("Strict value is not equal to itself.") | |
252 | 574 | } | |
253 | 575 | else throw("Strict value is not equal to itself.") | |
254 | 576 | } | |
255 | 577 | else throw("Strict value is not equal to itself.") | |
256 | 578 | } | |
257 | 579 | else throw("Strict value is not equal to itself.") | |
258 | 580 | } | |
259 | 581 | else throw("Strict value is not equal to itself.") | |
260 | 582 | } | |
261 | 583 | else throw("Strict value is not equal to itself.") | |
262 | 584 | } | |
263 | 585 | } | |
264 | 586 | ||
265 | 587 | ||
266 | 588 | ||
267 | 589 | @Callable(i) | |
268 | 590 | func arbWaves2 (path,amount) = { | |
269 | 591 | let poolAddress = "3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g" | |
270 | 592 | let pool = addressFromStringValue(poolAddress) | |
271 | 593 | let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
272 | 594 | let usdnAssetIdString = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
273 | 595 | let usdnWavesLPTokenAssetId = base58'7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1' | |
274 | 596 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
275 | 597 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
276 | 598 | if ((i.caller != this)) | |
277 | 599 | then throw("you are not allowed to arb!") | |
278 | 600 | else { | |
279 | 601 | let initialWavesBalance = wavesBalance(this).available | |
280 | 602 | if ((initialWavesBalance == initialWavesBalance)) | |
281 | 603 | then { | |
282 | 604 | let initialAmount = assetBalance(this, usdnAssetId) | |
283 | 605 | if ((initialAmount == initialAmount)) | |
284 | 606 | then { | |
285 | 607 | let putTheTokenInThePool = invoke(pool, "putOneTkn", [1, false], [AttachedPayment(usdnAssetId, (amount * 1000000))]) | |
286 | 608 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
287 | 609 | then { | |
288 | 610 | let lpTokenBalance = assetBalance(this, usdnWavesLPTokenAssetId) | |
289 | 611 | if ((lpTokenBalance == lpTokenBalance)) | |
290 | 612 | then { | |
291 | 613 | let sellPoolToken = invoke(pool, "getOneTkn", ["WAVES", 1], [AttachedPayment(usdnWavesLPTokenAssetId, lpTokenBalance)]) | |
292 | 614 | if ((sellPoolToken == sellPoolToken)) | |
293 | 615 | then { | |
294 | 616 | let wavesTokenBalance = (wavesBalance(this).available - initialWavesBalance) | |
295 | 617 | if ((wavesTokenBalance == wavesTokenBalance)) | |
296 | 618 | then { | |
297 | 619 | let sellOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(unit, wavesTokenBalance)]) | |
298 | 620 | if ((sellOnPuzzle == sellOnPuzzle)) | |
299 | 621 | then { | |
300 | 622 | let finalAmount = assetBalance(this, usdnAssetId) | |
301 | 623 | if ((finalAmount == finalAmount)) | |
302 | 624 | then if ((initialAmount >= finalAmount)) | |
303 | 625 | then throw("arb not successful!") | |
304 | 626 | else nil | |
305 | 627 | else throw("Strict value is not equal to itself.") | |
306 | 628 | } | |
307 | 629 | else throw("Strict value is not equal to itself.") | |
308 | 630 | } | |
309 | 631 | else throw("Strict value is not equal to itself.") | |
310 | 632 | } | |
311 | 633 | else throw("Strict value is not equal to itself.") | |
312 | 634 | } | |
313 | 635 | else throw("Strict value is not equal to itself.") | |
314 | 636 | } | |
315 | 637 | else throw("Strict value is not equal to itself.") | |
316 | 638 | } | |
317 | 639 | else throw("Strict value is not equal to itself.") | |
318 | 640 | } | |
319 | 641 | else throw("Strict value is not equal to itself.") | |
320 | 642 | } | |
321 | 643 | } | |
322 | 644 | ||
323 | 645 | ||
324 | 646 | ||
325 | 647 | @Callable(i) | |
326 | 648 | func arbUSDC (path,amount) = { | |
327 | 649 | let poolAddress = "3PC3HtupBxBmy4WtZf1Tym1vrxg9MwbZRK1" | |
328 | 650 | let pool = addressFromStringValue(poolAddress) | |
329 | 651 | let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
330 | 652 | let usdnAssetIdString = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
331 | 653 | let usdcAssetIdString = "6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" | |
332 | 654 | let usdcAssetId = base58'6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ' | |
333 | 655 | let usdnUsdcLPTokenAssetId = base58'EK6N7S38xbtBT3SxAqoGdDLCiX6rojX6G169CnSyuE5' | |
334 | 656 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
335 | 657 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
336 | 658 | if ((i.caller != this)) | |
337 | 659 | then throw("you are not allowed to arb!") | |
338 | 660 | else { | |
339 | 661 | let initialAmount = assetBalance(this, usdnAssetId) | |
340 | 662 | if ((initialAmount == initialAmount)) | |
341 | 663 | then { | |
342 | 664 | let initialAmountUSDC = assetBalance(this, usdcAssetId) | |
343 | 665 | if ((initialAmountUSDC == initialAmountUSDC)) | |
344 | 666 | then { | |
345 | 667 | let buyOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(usdnAssetId, (amount * 1000000))]) | |
346 | 668 | if ((buyOnPuzzle == buyOnPuzzle)) | |
347 | 669 | then { | |
348 | 670 | let usdcTokenBalance = (assetBalance(this, usdcAssetId) - initialAmountUSDC) | |
349 | 671 | if ((usdcTokenBalance == usdcTokenBalance)) | |
350 | 672 | then { | |
351 | 673 | let putTheTokenInThePool = invoke(pool, "putOneTknV2", [1, false], [AttachedPayment(usdcAssetId, usdcTokenBalance)]) | |
352 | 674 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
353 | 675 | then { | |
354 | 676 | let lpTokenBalance = assetBalance(this, usdnUsdcLPTokenAssetId) | |
355 | 677 | if ((lpTokenBalance == lpTokenBalance)) | |
356 | 678 | then { | |
357 | 679 | let sellPoolToken = invoke(pool, "getOneTknV2", [usdnAssetIdString, 1], [AttachedPayment(usdnUsdcLPTokenAssetId, lpTokenBalance)]) | |
358 | 680 | if ((sellPoolToken == sellPoolToken)) | |
359 | 681 | then { | |
360 | 682 | let finalAmount = assetBalance(this, usdnAssetId) | |
361 | 683 | if ((finalAmount == finalAmount)) | |
362 | 684 | then if ((initialAmount >= finalAmount)) | |
363 | 685 | then throw("arb not successful!") | |
364 | 686 | else nil | |
365 | 687 | else throw("Strict value is not equal to itself.") | |
366 | 688 | } | |
367 | 689 | else throw("Strict value is not equal to itself.") | |
368 | 690 | } | |
369 | 691 | else throw("Strict value is not equal to itself.") | |
370 | 692 | } | |
371 | 693 | else throw("Strict value is not equal to itself.") | |
372 | 694 | } | |
373 | 695 | else throw("Strict value is not equal to itself.") | |
374 | 696 | } | |
375 | 697 | else throw("Strict value is not equal to itself.") | |
376 | 698 | } | |
377 | 699 | else throw("Strict value is not equal to itself.") | |
378 | 700 | } | |
379 | 701 | else throw("Strict value is not equal to itself.") | |
380 | 702 | } | |
381 | 703 | } | |
382 | 704 | ||
383 | 705 | ||
384 | 706 | ||
385 | 707 | @Callable(i) | |
386 | 708 | func arbUSDC2 (path,amount) = { | |
387 | 709 | let poolAddress = "3PC3HtupBxBmy4WtZf1Tym1vrxg9MwbZRK1" | |
388 | 710 | let pool = addressFromStringValue(poolAddress) | |
389 | 711 | let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
390 | 712 | let usdnAssetIdString = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
391 | 713 | let usdcAssetIdString = "6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" | |
392 | 714 | let usdcAssetId = base58'6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ' | |
393 | 715 | let usdnUsdcLPTokenAssetId = base58'EK6N7S38xbtBT3SxAqoGdDLCiX6rojX6G169CnSyuE5' | |
394 | 716 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
395 | 717 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
396 | 718 | if ((i.caller != this)) | |
397 | 719 | then throw("you are not allowed to arb!") | |
398 | 720 | else { | |
399 | 721 | let initialAmount = assetBalance(this, usdnAssetId) | |
400 | 722 | if ((initialAmount == initialAmount)) | |
401 | 723 | then { | |
402 | 724 | let initialAmountUSDC = assetBalance(this, usdcAssetId) | |
403 | 725 | if ((initialAmountUSDC == initialAmountUSDC)) | |
404 | 726 | then { | |
405 | 727 | let putTheTokenInThePool = invoke(pool, "putOneTknV2", [1, false], [AttachedPayment(usdnAssetId, (amount * 1000000))]) | |
406 | 728 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
407 | 729 | then { | |
408 | 730 | let lpTokenBalance = assetBalance(this, usdnUsdcLPTokenAssetId) | |
409 | 731 | if ((lpTokenBalance == lpTokenBalance)) | |
410 | 732 | then { | |
411 | 733 | let sellPoolToken = invoke(pool, "getOneTknV2", [usdcAssetIdString, 1], [AttachedPayment(usdnUsdcLPTokenAssetId, lpTokenBalance)]) | |
412 | 734 | if ((sellPoolToken == sellPoolToken)) | |
413 | 735 | then { | |
414 | 736 | let usdcTokenBalance = (assetBalance(this, usdcAssetId) - initialAmountUSDC) | |
415 | 737 | if ((usdcTokenBalance == usdcTokenBalance)) | |
416 | 738 | then { | |
417 | 739 | let sellOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(usdcAssetId, usdcTokenBalance)]) | |
418 | 740 | if ((sellOnPuzzle == sellOnPuzzle)) | |
419 | 741 | then { | |
420 | 742 | let finalAmount = assetBalance(this, usdnAssetId) | |
421 | 743 | if ((finalAmount == finalAmount)) | |
422 | 744 | then if ((initialAmount >= finalAmount)) | |
423 | 745 | then throw("arb not successful!") | |
424 | 746 | else nil | |
425 | 747 | else throw("Strict value is not equal to itself.") | |
426 | 748 | } | |
427 | 749 | else throw("Strict value is not equal to itself.") | |
428 | 750 | } | |
429 | 751 | else throw("Strict value is not equal to itself.") | |
430 | 752 | } | |
431 | 753 | else throw("Strict value is not equal to itself.") | |
432 | 754 | } | |
433 | 755 | else throw("Strict value is not equal to itself.") | |
434 | 756 | } | |
435 | 757 | else throw("Strict value is not equal to itself.") | |
436 | 758 | } | |
437 | 759 | else throw("Strict value is not equal to itself.") | |
438 | 760 | } | |
439 | 761 | else throw("Strict value is not equal to itself.") | |
440 | 762 | } | |
441 | 763 | } | |
442 | 764 | ||
443 | 765 | ||
444 | 766 | ||
445 | 767 | @Callable(i) | |
446 | 768 | func arbUSDT (path,amount) = { | |
447 | 769 | let poolAddress = "3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz" | |
448 | 770 | let pool = addressFromStringValue(poolAddress) | |
449 | 771 | let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
450 | 772 | let usdnAssetIdString = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
451 | 773 | let usdtAssetIdString = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" | |
452 | 774 | let usdtAssetId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ' | |
453 | 775 | let usdnUsdtLPTokenAssetId = base58'97zHFp1C3cB7qfvx8Xv5f2rWp9nUSG5UnAamfPcW6txf' | |
454 | 776 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
455 | 777 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
456 | 778 | if ((i.caller != this)) | |
457 | 779 | then throw("you are not allowed to arb!") | |
458 | 780 | else { | |
459 | 781 | let initialAmount = assetBalance(this, usdnAssetId) | |
460 | 782 | if ((initialAmount == initialAmount)) | |
461 | 783 | then { | |
462 | 784 | let initialAmountUSDT = assetBalance(this, usdtAssetId) | |
463 | 785 | if ((initialAmountUSDT == initialAmountUSDT)) | |
464 | 786 | then { | |
465 | 787 | let buyOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(usdnAssetId, (amount * 1000000))]) | |
466 | 788 | if ((buyOnPuzzle == buyOnPuzzle)) | |
467 | 789 | then { | |
468 | 790 | let usdtTokenBalance = (assetBalance(this, usdtAssetId) - initialAmountUSDT) | |
469 | 791 | if ((usdtTokenBalance == usdtTokenBalance)) | |
470 | 792 | then { | |
471 | 793 | let putTheTokenInThePool = invoke(pool, "putOneTknV2", [1, false], [AttachedPayment(usdtAssetId, usdtTokenBalance)]) | |
472 | 794 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
473 | 795 | then { | |
474 | 796 | let lpTokenBalance = assetBalance(this, usdnUsdtLPTokenAssetId) | |
475 | 797 | if ((lpTokenBalance == lpTokenBalance)) | |
476 | 798 | then { | |
477 | 799 | let sellPoolToken = invoke(pool, "getOneTknV2", [usdnAssetIdString, 1], [AttachedPayment(usdnUsdtLPTokenAssetId, lpTokenBalance)]) | |
478 | 800 | if ((sellPoolToken == sellPoolToken)) | |
479 | 801 | then { | |
480 | 802 | let finalAmount = assetBalance(this, usdnAssetId) | |
481 | 803 | if ((finalAmount == finalAmount)) | |
482 | 804 | then if ((initialAmount >= finalAmount)) | |
483 | 805 | then throw("arb not successful!") | |
484 | 806 | else nil | |
485 | 807 | else throw("Strict value is not equal to itself.") | |
486 | 808 | } | |
487 | 809 | else throw("Strict value is not equal to itself.") | |
488 | 810 | } | |
489 | 811 | else throw("Strict value is not equal to itself.") | |
490 | 812 | } | |
491 | 813 | else throw("Strict value is not equal to itself.") | |
492 | 814 | } | |
493 | 815 | else throw("Strict value is not equal to itself.") | |
494 | 816 | } | |
495 | 817 | else throw("Strict value is not equal to itself.") | |
496 | 818 | } | |
497 | 819 | else throw("Strict value is not equal to itself.") | |
498 | 820 | } | |
499 | 821 | else throw("Strict value is not equal to itself.") | |
500 | 822 | } | |
501 | 823 | } | |
502 | 824 | ||
503 | 825 | ||
504 | 826 | ||
505 | 827 | @Callable(i) | |
506 | 828 | func arbUSDT2 (path,amount) = { | |
507 | 829 | let poolAddress = "3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz" | |
508 | 830 | let pool = addressFromStringValue(poolAddress) | |
509 | 831 | let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
510 | 832 | let usdnAssetIdString = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
511 | 833 | let usdtAssetIdString = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" | |
512 | 834 | let usdtAssetId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ' | |
513 | 835 | let usdnUsdtLPTokenAssetId = base58'97zHFp1C3cB7qfvx8Xv5f2rWp9nUSG5UnAamfPcW6txf' | |
514 | 836 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
515 | 837 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
516 | 838 | if ((i.caller != this)) | |
517 | 839 | then throw("you are not allowed to arb!") | |
518 | 840 | else { | |
519 | 841 | let initialAmount = assetBalance(this, usdnAssetId) | |
520 | 842 | if ((initialAmount == initialAmount)) | |
521 | 843 | then { | |
522 | 844 | let initialAmountUSDT = assetBalance(this, usdtAssetId) | |
523 | 845 | if ((initialAmountUSDT == initialAmountUSDT)) | |
524 | 846 | then { | |
525 | 847 | let putTheTokenInThePool = invoke(pool, "putOneTknV2", [1, false], [AttachedPayment(usdnAssetId, (amount * 1000000))]) | |
526 | 848 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
527 | 849 | then { | |
528 | 850 | let lpTokenBalance = assetBalance(this, usdnUsdtLPTokenAssetId) | |
529 | 851 | if ((lpTokenBalance == lpTokenBalance)) | |
530 | 852 | then { | |
531 | 853 | let sellPoolToken = invoke(pool, "getOneTknV2", [usdtAssetIdString, 1], [AttachedPayment(usdnUsdtLPTokenAssetId, lpTokenBalance)]) | |
532 | 854 | if ((sellPoolToken == sellPoolToken)) | |
533 | 855 | then { | |
534 | 856 | let usdtTokenBalance = (assetBalance(this, usdtAssetId) - initialAmountUSDT) | |
535 | 857 | if ((usdtTokenBalance == usdtTokenBalance)) | |
536 | 858 | then { | |
537 | 859 | let sellOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(usdtAssetId, usdtTokenBalance)]) | |
538 | 860 | if ((sellOnPuzzle == sellOnPuzzle)) | |
539 | 861 | then { | |
540 | 862 | let finalAmount = assetBalance(this, usdnAssetId) | |
541 | 863 | if ((finalAmount == finalAmount)) | |
542 | 864 | then if ((initialAmount >= finalAmount)) | |
543 | 865 | then throw("arb not successful!") | |
544 | 866 | else nil | |
545 | 867 | else throw("Strict value is not equal to itself.") | |
546 | 868 | } | |
547 | 869 | else throw("Strict value is not equal to itself.") | |
548 | 870 | } | |
549 | 871 | else throw("Strict value is not equal to itself.") | |
550 | 872 | } | |
551 | 873 | else throw("Strict value is not equal to itself.") | |
552 | 874 | } | |
553 | 875 | else throw("Strict value is not equal to itself.") | |
554 | 876 | } | |
555 | 877 | else throw("Strict value is not equal to itself.") | |
556 | 878 | } | |
557 | 879 | else throw("Strict value is not equal to itself.") | |
558 | 880 | } | |
559 | 881 | else throw("Strict value is not equal to itself.") | |
560 | 882 | } | |
561 | 883 | } | |
562 | 884 | ||
563 | 885 | ||
564 | 886 | ||
565 | 887 | @Callable(i) | |
566 | 888 | func arbTSN (path,amount) = { | |
567 | 889 | let poolAddress = "3PH832eKnw67PFvJfUg9Knz6BHM87QvjMeL" | |
568 | 890 | let pool = addressFromStringValue(poolAddress) | |
569 | 891 | let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
570 | 892 | let usdnAssetIdString = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
571 | 893 | let tsnAssetId = base58'8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91' | |
572 | 894 | let usdnTsnLPTokenAssetId = base58'EbwpqrZjrvi7XLowkM5Z2rg7xVdzfg6S5ec9asarpAU9' | |
573 | 895 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
574 | 896 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
575 | 897 | if ((i.caller != this)) | |
576 | 898 | then throw("you are not allowed to arb!") | |
577 | 899 | else { | |
578 | 900 | let initialAmount = assetBalance(this, usdnAssetId) | |
579 | 901 | if ((initialAmount == initialAmount)) | |
580 | 902 | then { | |
581 | 903 | let initialAmountTSN = assetBalance(this, tsnAssetId) | |
582 | 904 | if ((initialAmountTSN == initialAmountTSN)) | |
583 | 905 | then { | |
584 | 906 | let buyOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(usdnAssetId, (amount * 1000000))]) | |
585 | 907 | if ((buyOnPuzzle == buyOnPuzzle)) | |
586 | 908 | then { | |
587 | 909 | let tsnTokenBalance = (assetBalance(this, tsnAssetId) - initialAmountTSN) | |
588 | 910 | if ((tsnTokenBalance == tsnTokenBalance)) | |
589 | 911 | then { | |
590 | 912 | let putTheTokenInThePool = invoke(pool, "putOneTkn", [1, false], [AttachedPayment(tsnAssetId, tsnTokenBalance)]) | |
591 | 913 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
592 | 914 | then { | |
593 | 915 | let lpTokenBalance = assetBalance(this, usdnTsnLPTokenAssetId) | |
594 | 916 | if ((lpTokenBalance == lpTokenBalance)) | |
595 | 917 | then { | |
596 | 918 | let sellPoolToken = invoke(pool, "getOneTkn", [usdnAssetIdString, 1], [AttachedPayment(usdnTsnLPTokenAssetId, lpTokenBalance)]) | |
597 | 919 | if ((sellPoolToken == sellPoolToken)) | |
598 | 920 | then { | |
599 | 921 | let finalAmount = assetBalance(this, usdnAssetId) | |
600 | 922 | if ((finalAmount == finalAmount)) | |
601 | 923 | then if ((initialAmount >= finalAmount)) | |
602 | 924 | then throw("arb not successful!") | |
603 | 925 | else nil | |
604 | 926 | else throw("Strict value is not equal to itself.") | |
605 | 927 | } | |
606 | 928 | else throw("Strict value is not equal to itself.") | |
607 | 929 | } | |
608 | 930 | else throw("Strict value is not equal to itself.") | |
609 | 931 | } | |
610 | 932 | else throw("Strict value is not equal to itself.") | |
611 | 933 | } | |
612 | 934 | else throw("Strict value is not equal to itself.") | |
613 | 935 | } | |
614 | 936 | else throw("Strict value is not equal to itself.") | |
615 | 937 | } | |
616 | 938 | else throw("Strict value is not equal to itself.") | |
617 | 939 | } | |
618 | 940 | else throw("Strict value is not equal to itself.") | |
619 | 941 | } | |
620 | 942 | } | |
621 | 943 | ||
622 | 944 | ||
623 | 945 | ||
624 | 946 | @Callable(i) | |
625 | 947 | func arbTSN2 (path,amount) = { | |
626 | 948 | let poolAddress = "3PH832eKnw67PFvJfUg9Knz6BHM87QvjMeL" | |
627 | 949 | let pool = addressFromStringValue(poolAddress) | |
628 | 950 | let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
629 | 951 | let usdnAssetIdString = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
630 | 952 | let tsnAssetId = base58'8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91' | |
631 | 953 | let tsnAssetIdString = "8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" | |
632 | 954 | let usdnTsnLPTokenAssetId = base58'EbwpqrZjrvi7XLowkM5Z2rg7xVdzfg6S5ec9asarpAU9' | |
633 | 955 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
634 | 956 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
635 | 957 | if ((i.caller != this)) | |
636 | 958 | then throw("you are not allowed to arb!") | |
637 | 959 | else { | |
638 | 960 | let initialAmount = assetBalance(this, usdnAssetId) | |
639 | 961 | if ((initialAmount == initialAmount)) | |
640 | 962 | then { | |
641 | 963 | let initialAmountTSN = assetBalance(this, tsnAssetId) | |
642 | 964 | if ((initialAmountTSN == initialAmountTSN)) | |
643 | 965 | then { | |
644 | 966 | let putTheTokenInThePool = invoke(pool, "putOneTkn", [1, false], [AttachedPayment(usdnAssetId, (amount * 1000000))]) | |
645 | 967 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
646 | 968 | then { | |
647 | 969 | let lpTokenBalance = assetBalance(this, usdnTsnLPTokenAssetId) | |
648 | 970 | if ((lpTokenBalance == lpTokenBalance)) | |
649 | 971 | then { | |
650 | 972 | let sellPoolToken = invoke(pool, "getOneTkn", [tsnAssetIdString, 1], [AttachedPayment(usdnTsnLPTokenAssetId, lpTokenBalance)]) | |
651 | 973 | if ((sellPoolToken == sellPoolToken)) | |
652 | 974 | then { | |
653 | 975 | let tsnTokenBalance = (assetBalance(this, tsnAssetId) - initialAmountTSN) | |
654 | 976 | if ((tsnTokenBalance == tsnTokenBalance)) | |
655 | 977 | then { | |
656 | 978 | let sellOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(tsnAssetId, tsnTokenBalance)]) | |
657 | 979 | if ((sellOnPuzzle == sellOnPuzzle)) | |
658 | 980 | then { | |
659 | 981 | let finalAmount = assetBalance(this, usdnAssetId) | |
660 | 982 | if ((finalAmount == finalAmount)) | |
661 | 983 | then if ((initialAmount >= finalAmount)) | |
662 | 984 | then throw("arb not successful!") | |
663 | 985 | else nil | |
664 | 986 | else throw("Strict value is not equal to itself.") | |
665 | 987 | } | |
666 | 988 | else throw("Strict value is not equal to itself.") | |
667 | 989 | } | |
668 | 990 | else throw("Strict value is not equal to itself.") | |
669 | 991 | } | |
670 | 992 | else throw("Strict value is not equal to itself.") | |
671 | 993 | } | |
672 | 994 | else throw("Strict value is not equal to itself.") | |
673 | 995 | } | |
674 | 996 | else throw("Strict value is not equal to itself.") | |
675 | 997 | } | |
676 | 998 | else throw("Strict value is not equal to itself.") | |
677 | 999 | } | |
678 | 1000 | else throw("Strict value is not equal to itself.") | |
679 | 1001 | } | |
680 | 1002 | } | |
681 | 1003 | ||
682 | 1004 | ||
683 | 1005 | ||
684 | 1006 | @Callable(i) | |
685 | 1007 | func arbPool (firstAsset,secondAsset,poolAddress,lpToken,path,amount) = { | |
686 | 1008 | let pool = addressFromStringValue(poolAddress) | |
687 | 1009 | let firstAssetId = fromBase58String(firstAsset) | |
688 | 1010 | let secondAssetId = fromBase58String(secondAsset) | |
689 | 1011 | let lpTokenAssetId = fromBase58String(lpToken) | |
690 | 1012 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
691 | 1013 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
692 | 1014 | if ((i.caller != this)) | |
693 | 1015 | then throw("you are not allowed to arb!") | |
694 | 1016 | else { | |
695 | 1017 | let initialAmount = assetBalance(this, firstAssetId) | |
696 | 1018 | if ((initialAmount == initialAmount)) | |
697 | 1019 | then { | |
698 | 1020 | let initialAmountSecondAsset = assetBalance(this, secondAssetId) | |
699 | 1021 | if ((initialAmountSecondAsset == initialAmountSecondAsset)) | |
700 | 1022 | then { | |
701 | 1023 | let buyOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(firstAssetId, (amount * 1000000))]) | |
702 | 1024 | if ((buyOnPuzzle == buyOnPuzzle)) | |
703 | 1025 | then { | |
704 | 1026 | let secondTokenBalance = (assetBalance(this, secondAssetId) - initialAmountSecondAsset) | |
705 | 1027 | if ((secondTokenBalance == secondTokenBalance)) | |
706 | 1028 | then { | |
707 | 1029 | let putTheTokenInThePool = invoke(pool, "putOneTkn", [1, false], [AttachedPayment(secondAssetId, secondTokenBalance)]) | |
708 | 1030 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
709 | 1031 | then { | |
710 | 1032 | let lpTokenBalance = assetBalance(this, lpTokenAssetId) | |
711 | 1033 | if ((lpTokenBalance == lpTokenBalance)) | |
712 | 1034 | then { | |
713 | 1035 | let sellPoolToken = invoke(pool, "getOneTkn", [firstAsset, 1], [AttachedPayment(lpTokenAssetId, lpTokenBalance)]) | |
714 | 1036 | if ((sellPoolToken == sellPoolToken)) | |
715 | 1037 | then { | |
716 | 1038 | let finalAmount = assetBalance(this, firstAssetId) | |
717 | 1039 | if ((finalAmount == finalAmount)) | |
718 | 1040 | then if ((initialAmount >= finalAmount)) | |
719 | 1041 | then throw("arb not successful!") | |
720 | 1042 | else nil | |
721 | 1043 | else throw("Strict value is not equal to itself.") | |
722 | 1044 | } | |
723 | 1045 | else throw("Strict value is not equal to itself.") | |
724 | 1046 | } | |
725 | 1047 | else throw("Strict value is not equal to itself.") | |
726 | 1048 | } | |
727 | 1049 | else throw("Strict value is not equal to itself.") | |
728 | 1050 | } | |
729 | 1051 | else throw("Strict value is not equal to itself.") | |
730 | 1052 | } | |
731 | 1053 | else throw("Strict value is not equal to itself.") | |
732 | 1054 | } | |
733 | 1055 | else throw("Strict value is not equal to itself.") | |
734 | 1056 | } | |
735 | 1057 | else throw("Strict value is not equal to itself.") | |
736 | 1058 | } | |
737 | 1059 | } | |
738 | 1060 | ||
739 | 1061 | ||
740 | 1062 | ||
741 | 1063 | @Callable(i) | |
742 | 1064 | func arbPool2 (firstAsset,secondAsset,poolAddress,lpToken,path,amount) = { | |
743 | 1065 | let pool = addressFromStringValue(poolAddress) | |
744 | 1066 | let firstAssetId = fromBase58String(firstAsset) | |
745 | 1067 | let secondAssetId = fromBase58String(secondAsset) | |
746 | 1068 | let lpTokenAssetId = fromBase58String(lpToken) | |
747 | 1069 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
748 | 1070 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
749 | 1071 | if ((i.caller != this)) | |
750 | 1072 | then throw("you are not allowed to arb!") | |
751 | 1073 | else { | |
752 | 1074 | let initialAmount = assetBalance(this, firstAssetId) | |
753 | 1075 | if ((initialAmount == initialAmount)) | |
754 | 1076 | then { | |
755 | 1077 | let initialAmountSecondAsset = assetBalance(this, secondAssetId) | |
756 | 1078 | if ((initialAmountSecondAsset == initialAmountSecondAsset)) | |
757 | 1079 | then { | |
758 | 1080 | let putTheTokenInThePool = invoke(pool, "putOneTkn", [1, false], [AttachedPayment(firstAssetId, (amount * 1000000))]) | |
759 | 1081 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
760 | 1082 | then { | |
761 | 1083 | let lpTokenBalance = assetBalance(this, lpTokenAssetId) | |
762 | 1084 | if ((lpTokenBalance == lpTokenBalance)) | |
763 | 1085 | then { | |
764 | 1086 | let sellPoolToken = invoke(pool, "getOneTkn", [secondAsset, 1], [AttachedPayment(lpTokenAssetId, lpTokenBalance)]) | |
765 | 1087 | if ((sellPoolToken == sellPoolToken)) | |
766 | 1088 | then { | |
767 | 1089 | let secondTokenBalance = (assetBalance(this, secondAssetId) - initialAmountSecondAsset) | |
768 | 1090 | if ((secondTokenBalance == secondTokenBalance)) | |
769 | 1091 | then { | |
770 | 1092 | let sellOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(secondAssetId, secondTokenBalance)]) | |
771 | 1093 | if ((sellOnPuzzle == sellOnPuzzle)) | |
772 | 1094 | then { | |
773 | 1095 | let finalAmount = assetBalance(this, firstAssetId) | |
774 | 1096 | if ((finalAmount == finalAmount)) | |
775 | 1097 | then if ((initialAmount >= finalAmount)) | |
776 | 1098 | then throw("arb not successful!") | |
777 | 1099 | else nil | |
778 | 1100 | else throw("Strict value is not equal to itself.") | |
779 | 1101 | } | |
780 | 1102 | else throw("Strict value is not equal to itself.") | |
781 | 1103 | } | |
782 | 1104 | else throw("Strict value is not equal to itself.") | |
783 | 1105 | } | |
784 | 1106 | else throw("Strict value is not equal to itself.") | |
785 | 1107 | } | |
786 | 1108 | else throw("Strict value is not equal to itself.") | |
787 | 1109 | } | |
788 | 1110 | else throw("Strict value is not equal to itself.") | |
789 | 1111 | } | |
790 | 1112 | else throw("Strict value is not equal to itself.") | |
791 | 1113 | } | |
792 | 1114 | else throw("Strict value is not equal to itself.") | |
793 | 1115 | } | |
794 | 1116 | } | |
795 | 1117 | ||
796 | 1118 | ||
797 | 1119 | ||
798 | 1120 | @Callable(i) | |
799 | 1121 | func arbPoolV2 (firstAsset,secondAsset,poolAddress,lpToken,path,amount) = { | |
800 | 1122 | let pool = addressFromStringValue(poolAddress) | |
801 | 1123 | let firstAssetId = fromBase58String(firstAsset) | |
802 | 1124 | let secondAssetId = fromBase58String(secondAsset) | |
803 | 1125 | let lpTokenAssetId = fromBase58String(lpToken) | |
804 | 1126 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
805 | 1127 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
806 | 1128 | if ((i.caller != this)) | |
807 | 1129 | then throw("you are not allowed to arb!") | |
808 | 1130 | else { | |
809 | 1131 | let initialAmount = assetBalance(this, firstAssetId) | |
810 | 1132 | if ((initialAmount == initialAmount)) | |
811 | 1133 | then { | |
812 | 1134 | let initialAmountSecondAsset = assetBalance(this, secondAssetId) | |
813 | 1135 | if ((initialAmountSecondAsset == initialAmountSecondAsset)) | |
814 | 1136 | then { | |
815 | 1137 | let buyOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(firstAssetId, (amount * 1000000))]) | |
816 | 1138 | if ((buyOnPuzzle == buyOnPuzzle)) | |
817 | 1139 | then { | |
818 | 1140 | let secondTokenBalance = (assetBalance(this, secondAssetId) - initialAmountSecondAsset) | |
819 | 1141 | if ((secondTokenBalance == secondTokenBalance)) | |
820 | 1142 | then { | |
821 | 1143 | let putTheTokenInThePool = invoke(pool, "putOneTknV2", [1, false], [AttachedPayment(secondAssetId, secondTokenBalance)]) | |
822 | 1144 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
823 | 1145 | then { | |
824 | 1146 | let lpTokenBalance = assetBalance(this, lpTokenAssetId) | |
825 | 1147 | if ((lpTokenBalance == lpTokenBalance)) | |
826 | 1148 | then { | |
827 | 1149 | let sellPoolToken = invoke(pool, "getOneTknV2", [firstAsset, 1], [AttachedPayment(lpTokenAssetId, lpTokenBalance)]) | |
828 | 1150 | if ((sellPoolToken == sellPoolToken)) | |
829 | 1151 | then { | |
830 | 1152 | let finalAmount = assetBalance(this, firstAssetId) | |
831 | 1153 | if ((finalAmount == finalAmount)) | |
832 | 1154 | then if ((initialAmount >= finalAmount)) | |
833 | 1155 | then throw("arb not successful!") | |
834 | 1156 | else nil | |
835 | 1157 | else throw("Strict value is not equal to itself.") | |
836 | 1158 | } | |
837 | 1159 | else throw("Strict value is not equal to itself.") | |
838 | 1160 | } | |
839 | 1161 | else throw("Strict value is not equal to itself.") | |
840 | 1162 | } | |
841 | 1163 | else throw("Strict value is not equal to itself.") | |
842 | 1164 | } | |
843 | 1165 | else throw("Strict value is not equal to itself.") | |
844 | 1166 | } | |
845 | 1167 | else throw("Strict value is not equal to itself.") | |
846 | 1168 | } | |
847 | 1169 | else throw("Strict value is not equal to itself.") | |
848 | 1170 | } | |
849 | 1171 | else throw("Strict value is not equal to itself.") | |
850 | 1172 | } | |
851 | 1173 | } | |
852 | 1174 | ||
853 | 1175 | ||
854 | 1176 | ||
855 | 1177 | @Callable(i) | |
856 | 1178 | func arbPool2V2 (firstAsset,secondAsset,poolAddress,lpToken,path,amount) = { | |
857 | 1179 | let pool = addressFromStringValue(poolAddress) | |
858 | 1180 | let firstAssetId = fromBase58String(firstAsset) | |
859 | 1181 | let secondAssetId = fromBase58String(secondAsset) | |
860 | 1182 | let lpTokenAssetId = fromBase58String(lpToken) | |
861 | 1183 | let puzzlePoolAddress = "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU" | |
862 | 1184 | let puzzlePool = addressFromStringValue(puzzlePoolAddress) | |
863 | 1185 | if ((i.caller != this)) | |
864 | 1186 | then throw("you are not allowed to arb!") | |
865 | 1187 | else { | |
866 | 1188 | let initialAmount = assetBalance(this, firstAssetId) | |
867 | 1189 | if ((initialAmount == initialAmount)) | |
868 | 1190 | then { | |
869 | 1191 | let initialAmountSecondAsset = assetBalance(this, secondAssetId) | |
870 | 1192 | if ((initialAmountSecondAsset == initialAmountSecondAsset)) | |
871 | 1193 | then { | |
872 | 1194 | let putTheTokenInThePool = invoke(pool, "putOneTknV2", [1, false], [AttachedPayment(firstAssetId, (amount * 1000000))]) | |
873 | 1195 | if ((putTheTokenInThePool == putTheTokenInThePool)) | |
874 | 1196 | then { | |
875 | 1197 | let lpTokenBalance = assetBalance(this, lpTokenAssetId) | |
876 | 1198 | if ((lpTokenBalance == lpTokenBalance)) | |
877 | 1199 | then { | |
878 | 1200 | let sellPoolToken = invoke(pool, "getOneTknV2", [secondAsset, 1], [AttachedPayment(lpTokenAssetId, lpTokenBalance)]) | |
879 | 1201 | if ((sellPoolToken == sellPoolToken)) | |
880 | 1202 | then { | |
881 | 1203 | let secondTokenBalance = (assetBalance(this, secondAssetId) - initialAmountSecondAsset) | |
882 | 1204 | if ((secondTokenBalance == secondTokenBalance)) | |
883 | 1205 | then { | |
884 | 1206 | let sellOnPuzzle = invoke(puzzlePool, "swap", [path, 1], [AttachedPayment(secondAssetId, secondTokenBalance)]) | |
885 | 1207 | if ((sellOnPuzzle == sellOnPuzzle)) | |
886 | 1208 | then { | |
887 | 1209 | let finalAmount = assetBalance(this, firstAssetId) | |
888 | 1210 | if ((finalAmount == finalAmount)) | |
889 | 1211 | then if ((initialAmount >= finalAmount)) | |
890 | 1212 | then throw("arb not successful!") | |
891 | 1213 | else nil | |
892 | 1214 | else throw("Strict value is not equal to itself.") | |
893 | 1215 | } | |
894 | 1216 | else throw("Strict value is not equal to itself.") | |
895 | 1217 | } | |
896 | 1218 | else throw("Strict value is not equal to itself.") | |
897 | 1219 | } | |
898 | 1220 | else throw("Strict value is not equal to itself.") | |
899 | 1221 | } | |
900 | 1222 | else throw("Strict value is not equal to itself.") | |
901 | 1223 | } | |
902 | 1224 | else throw("Strict value is not equal to itself.") | |
903 | 1225 | } | |
904 | 1226 | else throw("Strict value is not equal to itself.") | |
905 | 1227 | } | |
906 | 1228 | else throw("Strict value is not equal to itself.") | |
907 | 1229 | } | |
908 | 1230 | } | |
909 | 1231 | ||
910 | 1232 | ||
911 | 1233 | ||
912 | 1234 | @Callable(i) | |
913 | 1235 | func y (data) = if ((i.caller != this)) | |
914 | 1236 | then throw("you are not allowed to arb!") | |
915 | 1237 | else { | |
916 | 1238 | let data_array = split_4C(data, "|") | |
917 | 1239 | let t030083064 = getBase1(data_array[0]) | |
918 | 1240 | let a = t030083064._1 | |
919 | 1241 | let a2 = t030083064._2 | |
920 | 1242 | let assetIn = t030083064._3 | |
921 | 1243 | let amountIn = t030083064._4 | |
922 | 1244 | let t030693107 = getBase2(data_array[1]) | |
923 | 1245 | let p1 = t030693107._1 | |
924 | 1246 | let t1 = t030693107._2 | |
925 | 1247 | let t031123150 = getBase2(data_array[2]) | |
926 | 1248 | let p2 = t031123150._1 | |
927 | 1249 | let t2 = t031123150._2 | |
928 | 1250 | let t031553193 = getBase2(data_array[3]) | |
929 | 1251 | let p3 = t031553193._1 | |
930 | 1252 | let t3 = t031553193._2 | |
931 | 1253 | let idu = if ((size(data_array[4]) > 1)) | |
932 | 1254 | then split_4C(data_array[4], "-") | |
933 | 1255 | else nil | |
934 | 1256 | if (if (if ((size(idu) > 0)) | |
935 | 1257 | then (ucheck(fromBase58String(idu[0])) > 0) | |
936 | 1258 | else false) | |
937 | 1259 | then true | |
938 | 1260 | else (1 >= size(data_array[4]))) | |
939 | 1261 | then { | |
940 | 1262 | let amount_bef_assetIn = getBalance(getAssetBytes(assetIn)) | |
941 | 1263 | if ((amount_bef_assetIn == amount_bef_assetIn)) | |
942 | 1264 | then { | |
943 | 1265 | let ulimit = valueOrElse(getInteger(this, "ulimit"), 100) | |
944 | 1266 | let max_amount = if ((size(idu) > 0)) | |
945 | 1267 | then fraction(amount_bef_assetIn, ulimit, 100) | |
946 | 1268 | else amount_bef_assetIn | |
947 | 1269 | let new_amountIn = if ((value(parseInt(amountIn)) > max_amount)) | |
948 | 1270 | then max_amount | |
949 | 1271 | else value(parseInt(amountIn)) | |
950 | 1272 | if ((new_amountIn == new_amountIn)) | |
951 | 1273 | then { | |
952 | 1274 | let amount_bef_asset1 = getBalance(getAssetBytes(a)) | |
953 | 1275 | if ((amount_bef_asset1 == amount_bef_asset1)) | |
954 | 1276 | then { | |
955 | 1277 | let swap1 = if ((t1 == "W")) | |
956 | 1278 | then swap_wx(p1, assetIn, new_amountIn, a) | |
957 | 1279 | else if ((t1 == "S")) | |
958 | 1280 | then swap_swop(p1, assetIn, new_amountIn) | |
959 | 1281 | else swap_puzzle(p1, assetIn, new_amountIn, a) | |
960 | 1282 | if ((swap1 == swap1)) | |
961 | 1283 | then { | |
962 | 1284 | let nb = (getBalance(getAssetBytes(a)) - amount_bef_asset1) | |
963 | 1285 | if ((nb == nb)) | |
964 | 1286 | then { | |
965 | 1287 | let amount_bef_asset2 = getBalance(getAssetBytes(a2)) | |
966 | 1288 | if ((amount_bef_asset2 == amount_bef_asset2)) | |
967 | 1289 | then { | |
968 | 1290 | let swap2 = if ((t2 == "W")) | |
969 | 1291 | then swap_wx(p2, a, nb, a2) | |
970 | 1292 | else if ((t2 == "S")) | |
971 | 1293 | then swap_swop(p2, a, nb) | |
972 | 1294 | else swap_puzzle(p2, a, nb, a2) | |
973 | 1295 | if ((swap2 == swap2)) | |
974 | 1296 | then { | |
975 | 1297 | let nb2 = (getBalance(getAssetBytes(a2)) - amount_bef_asset2) | |
976 | 1298 | if ((nb2 == nb2)) | |
977 | 1299 | then { | |
978 | 1300 | let amount_bef_base_asset = getBalance(getAssetBytes(assetIn)) | |
979 | 1301 | if ((amount_bef_base_asset == amount_bef_base_asset)) | |
980 | 1302 | then { | |
981 | 1303 | let swap3 = if ((t3 == "W")) | |
982 | 1304 | then swap_wx(p3, a2, nb2, assetIn) | |
983 | 1305 | else if ((t3 == "S")) | |
984 | 1306 | then swap_swop(p3, a2, nb2) | |
985 | 1307 | else swap_puzzle(p3, a2, nb2, assetIn) | |
986 | 1308 | if ((swap3 == swap3)) | |
987 | 1309 | then { | |
988 | 1310 | let nb3 = (getBalance(getAssetBytes(assetIn)) - amount_bef_base_asset) | |
989 | 1311 | if ((nb3 == nb3)) | |
990 | 1312 | then { | |
991 | 1313 | let treshold = valueOrElse(getInteger(this, "treshold"), 150000) | |
992 | 1314 | if ((nb3 > (new_amountIn + treshold))) | |
993 | 1315 | then nil | |
994 | 1316 | else throw(((((((((("origin amountIn = " + amountIn) + ", new_amountIn = ") + toString(new_amountIn)) + ", newBal_1: ") + toString(nb)) + ", newBal_2: ") + toString(nb2)) + ", newBal_3: ") + toString(nb3))) | |
995 | 1317 | } | |
996 | 1318 | else throw("Strict value is not equal to itself.") | |
997 | 1319 | } | |
998 | 1320 | else throw("Strict value is not equal to itself.") | |
999 | 1321 | } | |
1000 | 1322 | else throw("Strict value is not equal to itself.") | |
1001 | 1323 | } | |
1002 | 1324 | else throw("Strict value is not equal to itself.") | |
1003 | 1325 | } | |
1004 | 1326 | else throw("Strict value is not equal to itself.") | |
1005 | 1327 | } | |
1006 | 1328 | else throw("Strict value is not equal to itself.") | |
1007 | 1329 | } | |
1008 | 1330 | else throw("Strict value is not equal to itself.") | |
1009 | 1331 | } | |
1010 | 1332 | else throw("Strict value is not equal to itself.") | |
1011 | 1333 | } | |
1012 | 1334 | else throw("Strict value is not equal to itself.") | |
1013 | 1335 | } | |
1014 | 1336 | else throw("Strict value is not equal to itself.") | |
1015 | 1337 | } | |
1016 | 1338 | else throw("Strict value is not equal to itself.") | |
1017 | 1339 | } | |
1018 | 1340 | else nil | |
1019 | 1341 | } | |
1020 | 1342 | ||
1021 | 1343 | ||
1344 | + | ||
1345 | + | @Callable(i) | |
1346 | + | func default () = if ((i.caller != this)) | |
1347 | + | then throw("No touching") | |
1348 | + | else { | |
1349 | + | func accumFunction (accum,next) = { | |
1350 | + | let estimation = estimateRoute(next._1, next._2, next._3, next._4, next._5, next._6) | |
1351 | + | $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2)) | |
1352 | + | } | |
1353 | + | ||
1354 | + | let fold = { | |
1355 | + | let $l = routes | |
1356 | + | let $s = size($l) | |
1357 | + | let $acc0 = $Tuple2(nil, nil) | |
1358 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
1359 | + | then $a | |
1360 | + | else accumFunction($a, $l[$i]) | |
1361 | + | ||
1362 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
1363 | + | then $a | |
1364 | + | else throw("List size exceeds 24") | |
1365 | + | ||
1366 | + | $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($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) | |
1367 | + | } | |
1368 | + | let maxSwapProfit = max(fold._1) | |
1369 | + | if ((0 >= maxSwapProfit)) | |
1370 | + | then throw("Estimate fail") | |
1371 | + | else { | |
1372 | + | let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))] | |
1373 | + | let result1 = invokeSwap(estimatedResult[0]) | |
1374 | + | if ((result1 == result1)) | |
1375 | + | then { | |
1376 | + | let result2 = invokeSwap(estimatedResult[1]) | |
1377 | + | if ((result2 == result2)) | |
1378 | + | then { | |
1379 | + | let result3 = invokeSwap(estimatedResult[2]) | |
1380 | + | if ((result3 == result3)) | |
1381 | + | then { | |
1382 | + | let profit = (getBalance(InAsset) - inBalance) | |
1383 | + | let pureProfit = (profit - 1500000) | |
1384 | + | if ((0 >= pureProfit)) | |
1385 | + | then throw("Execute fail") | |
1386 | + | else nil | |
1387 | + | } | |
1388 | + | else throw("Strict value is not equal to itself.") | |
1389 | + | } | |
1390 | + | else throw("Strict value is not equal to itself.") | |
1391 | + | } | |
1392 | + | else throw("Strict value is not equal to itself.") | |
1393 | + | } | |
1394 | + | } | |
1395 | + | ||
1396 | + | ||
1022 | 1397 | @Verifier(tx) | |
1023 | 1398 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
1024 | 1399 |
github/deemru/w8io/3ef1775 114.54 ms ◑