tx · CaqBX449oHEdueMRrQmTPCUVDrq7tY9fTmcGJZLAvXon 3Mzep1R5kHeC1ecKFkWjuhU3Gw4LAdCib9N: -0.01100000 Waves 2023.11.16 12:38 [2845758] smart account 3Mzep1R5kHeC1ecKFkWjuhU3Gw4LAdCib9N > SELF 0.00000000 Waves
{ "type": 13, "id": "CaqBX449oHEdueMRrQmTPCUVDrq7tY9fTmcGJZLAvXon", "fee": 1100000, "feeAssetId": null, "timestamp": 1700127519301, "version": 2, "chainId": 84, "sender": "3Mzep1R5kHeC1ecKFkWjuhU3Gw4LAdCib9N", "senderPublicKey": "41THq9VrFxHEvVGJyz2oMpJQErnSkkqJXpBypSDxa5Mv", "proofs": [ "49yTiD5nCqoVNnwXDYqvZHzfMb87E9YNizEPdZ5nRznuKyLwyw3Hwy5UQ6nvG7iytu3J1zMvH2qxsaSKFuupQCwq" ], "script": "base64:BgIeCAISAwoBGBIDCgEYEgQKAgIYEgQKAgIYEgQKAgIYIQAJc2VwYXJhdG9yAgJfXwAHY2hhaW5JZAkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQAIY2hhaW5JZFQBAVQACGNoYWluSWRXAQFXAQttdXN0QWRkcmVzcwIBaQdhZGRyZXNzAwkAAAIIBQFpBmNhbGxlcgUHYWRkcmVzcwYJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAEIbXVzdFRoaXMBAWkJAQttdXN0QWRkcmVzcwIFAWkFBHRoaXMAA1NFUAICX18ABVdBVkVTAgVXQVZFUwAQY29udHJhY3RGaWxlbmFtZQIVd3hkYW9fY2FsY3VsYXRvci5yaWRlAAVtdWx0OACAwtcvAQd3cmFwRXJyAQFzCQCsAgIJAKwCAgUQY29udHJhY3RGaWxlbmFtZQICOiAFAXMBCHRocm93RXJyAQFzCQACAQkBB3dyYXBFcnIBBQFzARBrZXlDdXJyZW50UGVyaW9kAAkAuQkCCQDMCAICAiVzCQDMCAICDWN1cnJlbnRQZXJpb2QFA25pbAUDU0VQARZrZXlTdGFydEhlaWdodEJ5UGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICC3N0YXJ0SGVpZ2h0CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEPa2V5UGVyaW9kTGVuZ3RoAAkAuQkCCQDMCAICAiVzCQDMCAICDHBlcmlvZExlbmd0aAUDbmlsBQNTRVABGGtleVRyZWFzdXJ5VmFsdWVCeVBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAg10cmVhc3VyeVZhbHVlCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEVa2V5UG93ZXJDb25maWdBZGRyZXNzAAIWJXNfX3Bvd2VyQ29uZmlnQWRkcmVzcwEScG93ZXJDb25maWdBZGRyZXNzAQ5mYWN0b3J5QWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBAckbWF0Y2gwCQCdCAIFDmZhY3RvcnlBZGRyZXNzCQEVa2V5UG93ZXJDb25maWdBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IJAQd3cmFwRXJyAQIcaW52YWxpZCBwb3dlciBjb25maWcgYWRkcmVzcwEPa2V5UG93ZXJBc3NldElkAAIMcG93ZXJBc3NldElkAQ9nZXRQb3dlckFzc2V0SWQBDmZhY3RvcnlBZGRyZXNzCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEScG93ZXJDb25maWdBZGRyZXNzAQUOZmFjdG9yeUFkZHJlc3MJAQ9rZXlQb3dlckFzc2V0SWQACQEHd3JhcEVycgECFmludmFsaWQgcG93ZXIgYXNzZXQgaWQBF2tleVBvd2VyQ29udHJhY3RBZGRyZXNzAAIYJXNfX3Bvd2VyQ29udHJhY3RBZGRyZXNzARRwb3dlckNvbnRyYWN0QWRkcmVzcwEOZmFjdG9yeUFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgQHJG1hdGNoMAkAnQgCBQ5mYWN0b3J5QWRkcmVzcwkBF2tleVBvd2VyQ29udHJhY3RBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IJAQd3cmFwRXJyAQIeaW52YWxpZCBwb3dlciBjb250cmFjdCBhZGRyZXNzARZrZXlQb29sc0ZhY3RvcnlBZGRyZXNzAAIXJXNfX3Bvb2xzRmFjdG9yeUFkZHJlc3MBFmdldFBvb2xzRmFjdG9yeUFkZHJlc3MBDmZhY3RvcnlBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIEByRtYXRjaDAJAJ0IAgUOZmFjdG9yeUFkZHJlc3MJARZrZXlQb29sc0ZhY3RvcnlBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IJAQd3cmFwRXJyAQIdaW52YWxpZCBwb29scyBmYWN0b3J5IGFkZHJlc3MBEmtleVRyZWFzdXJ5QWRkcmVzcwACEyVzX190cmVhc3VyeUFkZHJlc3MBEmdldFRyZWFzdXJ5QWRkcmVzcwEOZmFjdG9yeUFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgQHJG1hdGNoMAkAnQgCBQ5mYWN0b3J5QWRkcmVzcwkBEmtleVRyZWFzdXJ5QWRkcmVzcwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yCQEHd3JhcEVycgECGGludmFsaWQgdHJlYXN1cnkgYWRkcmVzcwEJa2V5QXNzZXRzAAIKJXNfX2Fzc2V0cwEMZ2V0QXNzZXRzU3RyAQ5mYWN0b3J5QWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDmZhY3RvcnlBZGRyZXNzCQEJa2V5QXNzZXRzAAkBB3dyYXBFcnIBAg5pbnZhbGlkIGFzc2V0cwEMa2V5THBBc3NldElkAAINJXNfX2xwQXNzZXRJZAEMZ2V0THBBc3NldElkAQ5mYWN0b3J5QWRkcmVzcwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUOZmFjdG9yeUFkZHJlc3MJAQxrZXlMcEFzc2V0SWQACQEHd3JhcEVycgECE2ludmFsaWQgbHAgYXNzZXQgaWQBEWdldEFzc2V0c0JhbGFuY2VzAg10YXJnZXRBZGRyZXNzC2Fzc2V0SWRMaXN0CgEDbWFwAgNhY2MObmV4dEFzc2V0SWRTdHIEB2JhbGFuY2UDCQAAAgUObmV4dEFzc2V0SWRTdHIFBVdBVkVTCQDvBwEFDXRhcmdldEFkZHJlc3MJAPAHAgUNdGFyZ2V0QWRkcmVzcwkA2QQBBQ5uZXh0QXNzZXRJZFN0cgkAzQgCBQNhY2MFB2JhbGFuY2UKAAIkbAULYXNzZXRJZExpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA21hcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEPZ2V0QXNzZXRzUHJpY2VzAhNwb29sc0ZhY3RvcnlBZGRyZXNzC2Fzc2V0SWRMaXN0AwkAAAIFB2NoYWluSWQFCGNoYWluSWRXBBN3YXZlc1VzZHRBZGRyZXNzU3RyAiMzUEtmcnVwRXlkVTJuWkFnaFZqWkFmdkN3TUJrenVSMUY1MgQOd2F2ZXNVc2R0UHJpY2UKAAFACQD8BwQFE3Bvb2xzRmFjdG9yeUFkZHJlc3MCCGdldFByaWNlCQDMCAIFE3dhdmVzVXNkdEFkZHJlc3NTdHIFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQSd2F2ZXNYdG5BZGRyZXNzU3RyAiMzUFBaV2dGTlJLSEx2TTUxcHdTOTM0QzhWWjdkMkY0WjU4ZwQNd2F2ZXNYdG5QcmljZQoAAUAJAPwHBAUTcG9vbHNGYWN0b3J5QWRkcmVzcwIIZ2V0UHJpY2UJAMwIAgUSd2F2ZXNYdG5BZGRyZXNzU3RyBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEDHh0blVzZHRQcmljZQkAawMFDndhdmVzVXNkdFByaWNlBQVtdWx0OAUNd2F2ZXNYdG5QcmljZQoBA21hcAIDYWNjC25leHRBc3NldElkBAVwcmljZQQHJG1hdGNoMAULbmV4dEFzc2V0SWQDCQAAAgIsMnRoc0FDdUhtekRNdU5lelBNMzJ3ZzlhM0J3VXpCV0RlU0tha2d6M2N3MjEFByRtYXRjaDAEEnB3cldhdmVzQWRkcmVzc1N0cgIjM1BEaTdRcThwTFFZdnRLeVRmUXVxcVBVV3lob1liVTk1N3QEDXB3cldhdmVzUHJpY2UKAAFACQD8BwQFE3Bvb2xzRmFjdG9yeUFkZHJlc3MCCGdldFByaWNlCQDMCAIFEnB3cldhdmVzQWRkcmVzc1N0cgUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQBrAwUNcHdyV2F2ZXNQcmljZQUOd2F2ZXNVc2R0UHJpY2UFBW11bHQ4AwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gwBBF3eFdhdmVzQWRkcmVzc1N0cgIjM1BGemFIMmdocHdBTkhGZ2pldmE4M04xeXh6RXJFTHgyZWgEDHd4V2F2ZXNQcmljZQoAAUAJAPwHBAUTcG9vbHNGYWN0b3J5QWRkcmVzcwIIZ2V0UHJpY2UJAMwIAgURd3hXYXZlc0FkZHJlc3NTdHIFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAawMFDHd4V2F2ZXNQcmljZQUOd2F2ZXNVc2R0UHJpY2UFBW11bHQ4AwkAAAICLDM0TjlZY0VFVExXbjkzcVlRNjRFc1AxeDg5dFNydUpVNDRSckVNU1hYRVBKBQckbWF0Y2gwBBR1c2R0d3hnWHRuQWRkcmVzc1N0cgIjM1A4S015QUpDUFdOY3llZHFybXlteGFlV29udm1raEdhdXoED3VzZHR3eGdYdG5QcmljZQoAAUAJAPwHBAUTcG9vbHNGYWN0b3J5QWRkcmVzcwIIZ2V0UHJpY2UJAMwIAgUUdXNkdHd4Z1h0bkFkZHJlc3NTdHIFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAawMFD3VzZHR3eGdYdG5QcmljZQUMeHRuVXNkdFByaWNlBQVtdWx0OAMJAAACAiw2WHRIanBYYnM5UlJKUDJTcjlHVXlWcXpBQ2NieTlUa1RoSFhualZDNUNESgUHJG1hdGNoMAQWd2F2ZXNVc2Rjd3hnQWRkcmVzc1N0cgIjM1AzZzNlaXBmRzJOWktLUUU4RFpYdDJFOXRSSnFpaTlqY1gED3VzZGN3eGdYdG5QcmljZQoAAUAJAPwHBAUTcG9vbHNGYWN0b3J5QWRkcmVzcwIIZ2V0UHJpY2UJAMwIAgUWd2F2ZXNVc2Rjd3hnQWRkcmVzc1N0cgUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQBrAwUOd2F2ZXNVc2R0UHJpY2UFBW11bHQ4BQ91c2Rjd3hnWHRuUHJpY2UDCQAAAgIsSFprMW1iZnVKcG14VTFGczRBWDVNV0xWWXRjdHNOY2c2ZTJDNlZLcUs4emsFByRtYXRjaDAEE2x0Y3d4Z1h0bkFkZHJlc3NTdHICIzNQOTR3dnU1Z0E3VmhqUGdBQjN0d2FlcWR3SEN3TksydnNuBA5sdGN3eGdYdG5QcmljZQoAAUAJAPwHBAUTcG9vbHNGYWN0b3J5QWRkcmVzcwIIZ2V0UHJpY2UJAMwIAgUTbHRjd3hnWHRuQWRkcmVzc1N0cgUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQBrAwUObHRjd3hnWHRuUHJpY2UFDHh0blVzZHRQcmljZQUFbXVsdDgDCQAAAgIsSFprMW1iZnVKcG14VTFGczRBWDVNV0xWWXRjdHNOY2c2ZTJDNlZLcUs4emsFByRtYXRjaDAEE2V0aHd4Z1h0bkFkZHJlc3NTdHICIzNQM1hHVE42czI5Mmc5aXdZaHMzVEVxSnFIaWZmUVlvanVFBA5ldGh3eGdYdG5QcmljZQoAAUAJAPwHBAUTcG9vbHNGYWN0b3J5QWRkcmVzcwIIZ2V0UHJpY2UJAMwIAgUTZXRod3hnWHRuQWRkcmVzc1N0cgUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQBrAwUOZXRod3hnWHRuUHJpY2UFDndhdmVzVXNkdFByaWNlBQVtdWx0OAMJAAACAixIWmsxbWJmdUpwbXhVMUZzNEFYNU1XTFZZdGN0c05jZzZlMkM2VktxSzh6awUHJG1hdGNoMAQTYnRjd3hnWHRuQWRkcmVzc1N0cgIjM1BDQldEVEE2anJGc3dkN2dRZ2FFM1hrN2dMTTVSS29mdnAEDmJ0Y3d4Z1h0blByaWNlCgABQAkA/AcEBRNwb29sc0ZhY3RvcnlBZGRyZXNzAghnZXRQcmljZQkAzAgCBRNidGN3eGdYdG5BZGRyZXNzU3RyBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAGsDBQ5idGN3eGdYdG5QcmljZQUOd2F2ZXNVc2R0UHJpY2UFBW11bHQ4CQEIdGhyb3dFcnIBAhBpbnZhbGlkIGFzc2V0IGlkCQDNCAIFA2FjYwUFcHJpY2UKAAIkbAULYXNzZXRJZExpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA21hcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMJAAACBQdjaGFpbklkBQhjaGFpbklkVAoBA21hcAIDYWNjC25leHRBc3NldElkBAVwcmljZQQHJG1hdGNoMAULbmV4dEFzc2V0SWQDCQAAAgIsRU1BTUx4RG52M3hpejhSWGc4QnRqMzNqY0V3M3dMY3pMM0pLWVltdXVicGMFByRtYXRjaDAEEHd4VXNkdEFkZHJlc3NTdHICIzNNclVMUVJMYzUyR1dySkYxdE1jQW00TTc4ZlBlNTdvOUt0BAt3eFVzZHRQcmljZQoAAUAJAPwHBAUTcG9vbHNGYWN0b3J5QWRkcmVzcwIIZ2V0UHJpY2UJAMwIAgUQd3hVc2R0QWRkcmVzc1N0cgUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BQt3eFVzZHRQcmljZQMJAAACAixBN0tzaDdmWHlxbTFLaEtBaUszYkFCMmFpUFNpdFFRRjZ2MXB5dTlTUzNGUgUHJG1hdGNoMAQSdXNkY1VzZHRBZGRyZXNzU3RyAiMzTXpLU2RUSDJqRmJ5cExzb05mckg3UWdrelNieDNFWXdDQQQNdXNkY1VzZHRQcmljZQoAAUAJAPwHBAUTcG9vbHNGYWN0b3J5QWRkcmVzcwIIZ2V0UHJpY2UJAMwIAgUSdXNkY1VzZHRBZGRyZXNzU3RyBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQFDXVzZGNVc2R0UHJpY2UJAQh0aHJvd0VycgECEGludmFsaWQgYXNzZXQgaWQJAM0IAgUDYWNjBQVwcmljZQoAAiRsBQthc3NldElkTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDbWFwAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQEIdGhyb3dFcnIBAhBpbnZhbGlkIGNoYWluIGlkARFjYWxjVHJlYXN1cnlWYWx1ZQEOZmFjdG9yeUFkZHJlc3MED3RyZWFzdXJ5QWRkcmVzcwkBEmdldFRyZWFzdXJ5QWRkcmVzcwEFDmZhY3RvcnlBZGRyZXNzBBNwb29sc0ZhY3RvcnlBZGRyZXNzCQEWZ2V0UG9vbHNGYWN0b3J5QWRkcmVzcwEFDmZhY3RvcnlBZGRyZXNzBAlhc3NldHNTdHIJALUJAgkBDGdldEFzc2V0c1N0cgEFDmZhY3RvcnlBZGRyZXNzBQNTRVAEDmFzc2V0c0JhbGFuY2VzCQERZ2V0QXNzZXRzQmFsYW5jZXMCBQ90cmVhc3VyeUFkZHJlc3MFCWFzc2V0c1N0cgQMYXNzZXRzUHJpY2VzCQEPZ2V0QXNzZXRzUHJpY2VzAgUTcG9vbHNGYWN0b3J5QWRkcmVzcwUJYXNzZXRzU3RyCgEGcmVkdWNlAgNhY2MObmV4dEFzc2V0SWRTdHIEB2Fzc2V0SWQJANkEAQUObmV4dEFzc2V0SWRTdHIEBWluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUJYXNzZXRzU3RyBQ5uZXh0QXNzZXRJZFN0cgkBB3dyYXBFcnIBAhBpbnZhbGlkIGFzc2V0IGlkBAdiYWxhbmNlCQCRAwIFDmFzc2V0c0JhbGFuY2VzBQVpbmRleAQFcHJpY2UJAJEDAgUMYXNzZXRzUHJpY2VzBQVpbmRleAQKYXNzZXRWYWx1ZQkAawMFB2JhbGFuY2UFBXByaWNlBQVtdWx0OAkAZAIFA2FjYwUKYXNzZXRWYWx1ZQQNdHJlYXN1cnlWYWx1ZQoAAiRsBQlhc3NldHNTdHIKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBnJlZHVjZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgUNdHJlYXN1cnlWYWx1ZQUBaQEId2l0aGRyYXcBBGFyZ3MECXJlY2lwaWVudAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQRhcmdzAAAEBmFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAQQGcmVzdWx0CQD8BwQIBQFpBmNhbGxlcgINdHJhbnNmZXJXYXZlcwkAzAgCCAUJcmVjaXBpZW50BWJ5dGVzCQDMCAIFBmFtb3VudAUDbmlsBQNuaWwJAJQKAgUDbmlsBQZyZXN1bHQBaQELc2V0SW50UGFyYW0BBGFyZ3MEA2tleQkAkQMCBQRhcmdzAAAEA3ZhbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAQQGcmVzdWx0CQD8BwQIBQFpBmNhbGxlcgIMaW50ZWdlckVudHJ5CQDMCAIFA2tleQkAzAgCBQN2YWwFA25pbAUDbmlsCQCUCgIFA25pbAUGcmVzdWx0AWkBBHN3YXACD2NhbGxlclB1YmxpY0tleQRhcmdzBA5mYWN0b3J5QWRkcmVzcwgFAWkGY2FsbGVyBAt1c2VyQWRkcmVzcwkApwgBBQ9jYWxsZXJQdWJsaWNLZXkEB3BheW1lbnQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAQh0aHJvd0VycgECFTEgcGF5bWVudCBpcyByZXF1aXJlZAQDZXJyCQEHd3JhcEVycgECGGludmFsaWQgcGF5bWVudCBhc3NldCBpZAQOcGF5bWVudEFzc2V0SWQDCQAAAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUHcGF5bWVudAdhc3NldElkBQNlcnIJAQxnZXRMcEFzc2V0SWQBBQ5mYWN0b3J5QWRkcmVzcwkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAkBCHRocm93RXJyAQUDZXJyBAhwd3JQcmljZQBkBAlwd3JBbW91bnQJAGkCCAUHcGF5bWVudAZhbW91bnQFCHB3clByaWNlBAlhc3NldHNTdHIJALUJAgkBDGdldEFzc2V0c1N0cgEFDmZhY3RvcnlBZGRyZXNzBQNTRVAECnB3ckJhbGFuY2UJAPAHAgUOZmFjdG9yeUFkZHJlc3MJAQ9nZXRQb3dlckFzc2V0SWQBBQ5mYWN0b3J5QWRkcmVzcwMJAAACBQpwd3JCYWxhbmNlBQpwd3JCYWxhbmNlBA90cmVhc3VyeUFkZHJlc3MJARJnZXRUcmVhc3VyeUFkZHJlc3MBBQ5mYWN0b3J5QWRkcmVzcwQOYXNzZXRzQmFsYW5jZXMJARFnZXRBc3NldHNCYWxhbmNlcwIFD3RyZWFzdXJ5QWRkcmVzcwUJYXNzZXRzU3RyCgEDbWFwAgNhY2MObmV4dEFzc2V0SWRTdHIEB2Fzc2V0SWQJANkEAQUObmV4dEFzc2V0SWRTdHIEBWluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUJYXNzZXRzU3RyBQ5uZXh0QXNzZXRJZFN0cgkBB3dyYXBFcnIBAhVpbnZhbGlkIGFzc2V0IGJhbGFuY2UEB2JhbGFuY2UJAJEDAgUOYXNzZXRzQmFsYW5jZXMFBWluZGV4BAZhbW91bnQJAGsDBQdiYWxhbmNlBQlwd3JBbW91bnQFCnB3ckJhbGFuY2UDCQBmAgUGYW1vdW50AAAJAJQKAgkAzQgCCAUDYWNjAl8xBQdhc3NldElkCQDNCAIIBQNhY2MCXzIFBmFtb3VudAUDYWNjBAl0cmFuc2ZlcnMKAAIkbAUJYXNzZXRzU3RyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDbWFwAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAwkAAAIFCXRyYW5zZmVycwUJdHJhbnNmZXJzBBRhZGRpdGlvbmFsTG9ja1JvdW5kcwAABA5mYWN0b3J5QWN0aW9ucwkAzggCCQDMCAIJAPwHBAUOZmFjdG9yeUFkZHJlc3MCIGNvbW1pdEFmdGVyU3RhcnRXaXRoTG9ja1JvdW5kRm9yCQDMCAIJAKUIAQkBFHBvd2VyQ29udHJhY3RBZGRyZXNzAQUOZmFjdG9yeUFkZHJlc3MJAMwIAgkApQgBBQ5mYWN0b3J5QWRkcmVzcwkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAIFFGFkZGl0aW9uYWxMb2NrUm91bmRzCQDMCAIJAQ9nZXRQb3dlckFzc2V0SWQBBQ5mYWN0b3J5QWRkcmVzcwkAzAgCBQlwd3JBbW91bnQFA25pbAUDbmlsBQNuaWwDCQAAAgkAkAMBCAUJdHJhbnNmZXJzAl8xAAAFA25pbAkAzAgCCQD8BwQFDmZhY3RvcnlBZGRyZXNzAg50cmFuc2ZlckFzc2V0cwkAzAgCCAULdXNlckFkZHJlc3MFYnl0ZXMJAMwIAggFCXRyYW5zZmVycwJfMQkAzAgCCAUJdHJhbnNmZXJzAl8yBQNuaWwFA25pbAUDbmlsCQCUCgIJAMwIAgkBBEJ1cm4CBQ5wYXltZW50QXNzZXRJZAgFB3BheW1lbnQGYW1vdW50BQNuaWwFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXByaWNlAg9jYWxsZXJQdWJsaWNLZXkEYXJncwQOZmFjdG9yeUFkZHJlc3MIBQFpBmNhbGxlcgQNY3VycmVudFBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDmZhY3RvcnlBZGRyZXNzCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIWaW52YWxpZCBjdXJyZW50IHBlcmlvZAQSc3RhcnRUcmVhc3VyeVZhbHVlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUOZmFjdG9yeUFkZHJlc3MJARhrZXlUcmVhc3VyeVZhbHVlQnlQZXJpb2QBBQ1jdXJyZW50UGVyaW9kCQEHd3JhcEVycgEJAKwCAgIiaW52YWxpZCB0cmVhc3VyeSB2YWx1ZSBmb3IgcGVyaW9kIAkApAMBBQ1jdXJyZW50UGVyaW9kBA10cmVhc3VyeVZhbHVlCQERY2FsY1RyZWFzdXJ5VmFsdWUBBQ5mYWN0b3J5QWRkcmVzcwQRdHJlYXN1cnlWYWx1ZURpZmYJAGUCBQ10cmVhc3VyeVZhbHVlBRJzdGFydFRyZWFzdXJ5VmFsdWUEC3B3clByaWNlUmF3CQCRAwIJAQ9nZXRBc3NldHNQcmljZXMCBQ5mYWN0b3J5QWRkcmVzcwkAzAgCCQDYBAEJAQ9nZXRQb3dlckFzc2V0SWQBBQ5mYWN0b3J5QWRkcmVzcwUDbmlsAAAECHB3clByaWNlAwkAZgIFC3B3clByaWNlUmF3AAAFC3B3clByaWNlUmF3CQEIdGhyb3dFcnIBAhFpbnZhbGlkIFBXUiBwcmljZQQFcHJpY2UDCQBmAgAABRF0cmVhc3VyeVZhbHVlRGlmZgkAaQIFCHB3clByaWNlAGQJAGkCCQBkAgkAawMFEXRyZWFzdXJ5VmFsdWVEaWZmAAIAkE4FCHB3clByaWNlAGQJAJQKAgUDbmlsBQVwcmljZQFpARBnZXRUcmVhc3VyeVZhbHVlAg9jYWxsZXJQdWJsaWNLZXkEYXJncwQOZmFjdG9yeUFkZHJlc3MIBQFpBmNhbGxlcgQNdHJlYXN1cnlWYWx1ZQkBEWNhbGNUcmVhc3VyeVZhbHVlAQUOZmFjdG9yeUFkZHJlc3MJAJQKAgUDbmlsBQ10cmVhc3VyeVZhbHVlAQJ0eAEGdmVyaWZ5AAkAAAIFB2NoYWluSWQFCGNoYWluSWRUtlXQEg==", "height": 2845758, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2AnQUPScjXu7B8u5ETtoD7VLeAFPRozVwoThe5HBHnr6 Next: EgR72zW5AVazXcXRMMTG27dEZ3681ZKQazCoYHvThLPn Diff:
Old | New | Differences | |
---|---|---|---|
23 | 23 | ||
24 | 24 | let contractFilename = "wxdao_calculator.ride" | |
25 | 25 | ||
26 | + | let mult8 = 100000000 | |
27 | + | ||
26 | 28 | func wrapErr (s) = ((contractFilename + ": ") + s) | |
27 | 29 | ||
28 | 30 | ||
29 | 31 | func throwErr (s) = throw(wrapErr(s)) | |
32 | + | ||
33 | + | ||
34 | + | func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP) | |
35 | + | ||
36 | + | ||
37 | + | func keyStartHeightByPeriod (period) = makeString(["%s%d", "startHeight", toString(period)], SEP) | |
38 | + | ||
39 | + | ||
40 | + | func keyPeriodLength () = makeString(["%s", "periodLength"], SEP) | |
41 | + | ||
42 | + | ||
43 | + | func keyTreasuryValueByPeriod (period) = makeString(["%s%d", "treasuryValue", toString(period)], SEP) | |
30 | 44 | ||
31 | 45 | ||
32 | 46 | func keyPowerConfigAddress () = "%s__powerConfigAddress" | |
45 | 59 | func keyPowerAssetId () = "powerAssetId" | |
46 | 60 | ||
47 | 61 | ||
48 | - | func | |
62 | + | func getPowerAssetId (factoryAddress) = fromBase58String(valueOrErrorMessage(getString(powerConfigAddress(factoryAddress), keyPowerAssetId()), wrapErr("invalid power asset id"))) | |
49 | 63 | ||
50 | 64 | ||
51 | 65 | func keyPowerContractAddress () = "%s__powerContractAddress" | |
61 | 75 | }, wrapErr("invalid power contract address")) | |
62 | 76 | ||
63 | 77 | ||
78 | + | func keyPoolsFactoryAddress () = "%s__poolsFactoryAddress" | |
79 | + | ||
80 | + | ||
81 | + | func getPoolsFactoryAddress (factoryAddress) = valueOrErrorMessage(match getString(factoryAddress, keyPoolsFactoryAddress()) { | |
82 | + | case s: String => | |
83 | + | addressFromString(s) | |
84 | + | case _: Unit => | |
85 | + | unit | |
86 | + | case _ => | |
87 | + | throw("Match error") | |
88 | + | }, wrapErr("invalid pools factory address")) | |
89 | + | ||
90 | + | ||
91 | + | func keyTreasuryAddress () = "%s__treasuryAddress" | |
92 | + | ||
93 | + | ||
94 | + | func getTreasuryAddress (factoryAddress) = valueOrErrorMessage(match getString(factoryAddress, keyTreasuryAddress()) { | |
95 | + | case s: String => | |
96 | + | addressFromString(s) | |
97 | + | case _: Unit => | |
98 | + | unit | |
99 | + | case _ => | |
100 | + | throw("Match error") | |
101 | + | }, wrapErr("invalid treasury address")) | |
102 | + | ||
103 | + | ||
64 | 104 | func keyAssets () = "%s__assets" | |
65 | 105 | ||
66 | 106 | ||
71 | 111 | ||
72 | 112 | ||
73 | 113 | func getLpAssetId (factoryAddress) = fromBase58String(valueOrErrorMessage(getString(factoryAddress, keyLpAssetId()), wrapErr("invalid lp asset id"))) | |
114 | + | ||
115 | + | ||
116 | + | func getAssetsBalances (targetAddress,assetIdList) = { | |
117 | + | func map (acc,nextAssetIdStr) = { | |
118 | + | let balance = if ((nextAssetIdStr == WAVES)) | |
119 | + | then wavesBalance(targetAddress) | |
120 | + | else assetBalance(targetAddress, fromBase58String(nextAssetIdStr)) | |
121 | + | (acc :+ balance) | |
122 | + | } | |
123 | + | ||
124 | + | let $l = assetIdList | |
125 | + | let $s = size($l) | |
126 | + | let $acc0 = nil | |
127 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
128 | + | then $a | |
129 | + | else map($a, $l[$i]) | |
130 | + | ||
131 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
132 | + | then $a | |
133 | + | else throw("List size exceeds 10") | |
134 | + | ||
135 | + | $f0_2($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) | |
136 | + | } | |
137 | + | ||
138 | + | ||
139 | + | func getAssetsPrices (poolsFactoryAddress,assetIdList) = if ((chainId == chainIdW)) | |
140 | + | then { | |
141 | + | let wavesUsdtAddressStr = "3PKfrupEydU2nZAghVjZAfvCwMBkzuR1F52" | |
142 | + | let wavesUsdtPrice = { | |
143 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [wavesUsdtAddressStr], nil) | |
144 | + | if ($isInstanceOf(@, "Int")) | |
145 | + | then @ | |
146 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
147 | + | } | |
148 | + | let wavesXtnAddressStr = "3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g" | |
149 | + | let wavesXtnPrice = { | |
150 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [wavesXtnAddressStr], nil) | |
151 | + | if ($isInstanceOf(@, "Int")) | |
152 | + | then @ | |
153 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
154 | + | } | |
155 | + | let xtnUsdtPrice = fraction(wavesUsdtPrice, mult8, wavesXtnPrice) | |
156 | + | func map (acc,nextAssetId) = { | |
157 | + | let price = match nextAssetId { | |
158 | + | case _ => | |
159 | + | if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match0)) | |
160 | + | then { | |
161 | + | let pwrWavesAddressStr = "3PDi7Qq8pLQYvtKyTfQuqqPUWyhoYbU957t" | |
162 | + | let pwrWavesPrice = { | |
163 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [pwrWavesAddressStr], nil) | |
164 | + | if ($isInstanceOf(@, "Int")) | |
165 | + | then @ | |
166 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
167 | + | } | |
168 | + | fraction(pwrWavesPrice, wavesUsdtPrice, mult8) | |
169 | + | } | |
170 | + | else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match0)) | |
171 | + | then { | |
172 | + | let wxWavesAddressStr = "3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh" | |
173 | + | let wxWavesPrice = { | |
174 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [wxWavesAddressStr], nil) | |
175 | + | if ($isInstanceOf(@, "Int")) | |
176 | + | then @ | |
177 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
178 | + | } | |
179 | + | fraction(wxWavesPrice, wavesUsdtPrice, mult8) | |
180 | + | } | |
181 | + | else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match0)) | |
182 | + | then { | |
183 | + | let usdtwxgXtnAddressStr = "3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz" | |
184 | + | let usdtwxgXtnPrice = { | |
185 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [usdtwxgXtnAddressStr], nil) | |
186 | + | if ($isInstanceOf(@, "Int")) | |
187 | + | then @ | |
188 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
189 | + | } | |
190 | + | fraction(usdtwxgXtnPrice, xtnUsdtPrice, mult8) | |
191 | + | } | |
192 | + | else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match0)) | |
193 | + | then { | |
194 | + | let wavesUsdcwxgAddressStr = "3P3g3eipfG2NZKKQE8DZXt2E9tRJqii9jcX" | |
195 | + | let usdcwxgXtnPrice = { | |
196 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [wavesUsdcwxgAddressStr], nil) | |
197 | + | if ($isInstanceOf(@, "Int")) | |
198 | + | then @ | |
199 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
200 | + | } | |
201 | + | fraction(wavesUsdtPrice, mult8, usdcwxgXtnPrice) | |
202 | + | } | |
203 | + | else if (("HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk" == $match0)) | |
204 | + | then { | |
205 | + | let ltcwxgXtnAddressStr = "3P94wvu5gA7VhjPgAB3twaeqdwHCwNK2vsn" | |
206 | + | let ltcwxgXtnPrice = { | |
207 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [ltcwxgXtnAddressStr], nil) | |
208 | + | if ($isInstanceOf(@, "Int")) | |
209 | + | then @ | |
210 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
211 | + | } | |
212 | + | fraction(ltcwxgXtnPrice, xtnUsdtPrice, mult8) | |
213 | + | } | |
214 | + | else if (("HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk" == $match0)) | |
215 | + | then { | |
216 | + | let ethwxgXtnAddressStr = "3P3XGTN6s292g9iwYhs3TEqJqHiffQYojuE" | |
217 | + | let ethwxgXtnPrice = { | |
218 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [ethwxgXtnAddressStr], nil) | |
219 | + | if ($isInstanceOf(@, "Int")) | |
220 | + | then @ | |
221 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
222 | + | } | |
223 | + | fraction(ethwxgXtnPrice, wavesUsdtPrice, mult8) | |
224 | + | } | |
225 | + | else if (("HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk" == $match0)) | |
226 | + | then { | |
227 | + | let btcwxgXtnAddressStr = "3PCBWDTA6jrFswd7gQgaE3Xk7gLM5RKofvp" | |
228 | + | let btcwxgXtnPrice = { | |
229 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [btcwxgXtnAddressStr], nil) | |
230 | + | if ($isInstanceOf(@, "Int")) | |
231 | + | then @ | |
232 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
233 | + | } | |
234 | + | fraction(btcwxgXtnPrice, wavesUsdtPrice, mult8) | |
235 | + | } | |
236 | + | else throwErr("invalid asset id") | |
237 | + | } | |
238 | + | (acc :+ price) | |
239 | + | } | |
240 | + | ||
241 | + | let $l = assetIdList | |
242 | + | let $s = size($l) | |
243 | + | let $acc0 = nil | |
244 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
245 | + | then $a | |
246 | + | else map($a, $l[$i]) | |
247 | + | ||
248 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
249 | + | then $a | |
250 | + | else throw("List size exceeds 10") | |
251 | + | ||
252 | + | $f0_2($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) | |
253 | + | } | |
254 | + | else if ((chainId == chainIdT)) | |
255 | + | then { | |
256 | + | func map (acc,nextAssetId) = { | |
257 | + | let price = match nextAssetId { | |
258 | + | case _ => | |
259 | + | if (("EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc" == $match0)) | |
260 | + | then { | |
261 | + | let wxUsdtAddressStr = "3MrULQRLc52GWrJF1tMcAm4M78fPe57o9Kt" | |
262 | + | let wxUsdtPrice = { | |
263 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [wxUsdtAddressStr], nil) | |
264 | + | if ($isInstanceOf(@, "Int")) | |
265 | + | then @ | |
266 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
267 | + | } | |
268 | + | wxUsdtPrice | |
269 | + | } | |
270 | + | else if (("A7Ksh7fXyqm1KhKAiK3bAB2aiPSitQQF6v1pyu9SS3FR" == $match0)) | |
271 | + | then { | |
272 | + | let usdcUsdtAddressStr = "3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA" | |
273 | + | let usdcUsdtPrice = { | |
274 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [usdcUsdtAddressStr], nil) | |
275 | + | if ($isInstanceOf(@, "Int")) | |
276 | + | then @ | |
277 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
278 | + | } | |
279 | + | usdcUsdtPrice | |
280 | + | } | |
281 | + | else throwErr("invalid asset id") | |
282 | + | } | |
283 | + | (acc :+ price) | |
284 | + | } | |
285 | + | ||
286 | + | let $l = assetIdList | |
287 | + | let $s = size($l) | |
288 | + | let $acc0 = nil | |
289 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
290 | + | then $a | |
291 | + | else map($a, $l[$i]) | |
292 | + | ||
293 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
294 | + | then $a | |
295 | + | else throw("List size exceeds 10") | |
296 | + | ||
297 | + | $f0_2($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) | |
298 | + | } | |
299 | + | else throwErr("invalid chain id") | |
300 | + | ||
301 | + | ||
302 | + | func calcTreasuryValue (factoryAddress) = { | |
303 | + | let treasuryAddress = getTreasuryAddress(factoryAddress) | |
304 | + | let poolsFactoryAddress = getPoolsFactoryAddress(factoryAddress) | |
305 | + | let assetsStr = split(getAssetsStr(factoryAddress), SEP) | |
306 | + | let assetsBalances = getAssetsBalances(treasuryAddress, assetsStr) | |
307 | + | let assetsPrices = getAssetsPrices(poolsFactoryAddress, assetsStr) | |
308 | + | func reduce (acc,nextAssetIdStr) = { | |
309 | + | let assetId = fromBase58String(nextAssetIdStr) | |
310 | + | let index = valueOrErrorMessage(indexOf(assetsStr, nextAssetIdStr), wrapErr("invalid asset id")) | |
311 | + | let balance = assetsBalances[index] | |
312 | + | let price = assetsPrices[index] | |
313 | + | let assetValue = fraction(balance, price, mult8) | |
314 | + | (acc + assetValue) | |
315 | + | } | |
316 | + | ||
317 | + | let treasuryValue = { | |
318 | + | let $l = assetsStr | |
319 | + | let $s = size($l) | |
320 | + | let $acc0 = 0 | |
321 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
322 | + | then $a | |
323 | + | else reduce($a, $l[$i]) | |
324 | + | ||
325 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
326 | + | then $a | |
327 | + | else throw("List size exceeds 10") | |
328 | + | ||
329 | + | $f0_2($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) | |
330 | + | } | |
331 | + | treasuryValue | |
332 | + | } | |
74 | 333 | ||
75 | 334 | ||
76 | 335 | @Callable(i) | |
107 | 366 | let pwrPrice = 100 | |
108 | 367 | let pwrAmount = (payment.amount / pwrPrice) | |
109 | 368 | let assetsStr = split(getAssetsStr(factoryAddress), SEP) | |
110 | - | let pwrBalance = assetBalance(factoryAddress, | |
369 | + | let pwrBalance = assetBalance(factoryAddress, getPowerAssetId(factoryAddress)) | |
111 | 370 | if ((pwrBalance == pwrBalance)) | |
112 | 371 | then { | |
113 | - | func map (acc,nextAssetId) = { | |
114 | - | let assetId = fromBase58String(nextAssetId) | |
115 | - | let balance = assetBalance(factoryAddress, assetId) | |
116 | - | if ((balance == balance)) | |
117 | - | then { | |
118 | - | let amount = fraction(balance, pwrAmount, pwrBalance) | |
119 | - | if ((amount > 0)) | |
120 | - | then $Tuple2((acc._1 :+ assetId), (acc._2 :+ amount)) | |
121 | - | else acc | |
122 | - | } | |
123 | - | else throw("Strict value is not equal to itself.") | |
372 | + | let treasuryAddress = getTreasuryAddress(factoryAddress) | |
373 | + | let assetsBalances = getAssetsBalances(treasuryAddress, assetsStr) | |
374 | + | func map (acc,nextAssetIdStr) = { | |
375 | + | let assetId = fromBase58String(nextAssetIdStr) | |
376 | + | let index = valueOrErrorMessage(indexOf(assetsStr, nextAssetIdStr), wrapErr("invalid asset balance")) | |
377 | + | let balance = assetsBalances[index] | |
378 | + | let amount = fraction(balance, pwrAmount, pwrBalance) | |
379 | + | if ((amount > 0)) | |
380 | + | then $Tuple2((acc._1 :+ assetId), (acc._2 :+ amount)) | |
381 | + | else acc | |
124 | 382 | } | |
125 | 383 | ||
126 | 384 | let transfers = { | |
140 | 398 | if ((transfers == transfers)) | |
141 | 399 | then { | |
142 | 400 | let additionalLockRounds = 0 | |
143 | - | let factoryActions = ([invoke(factoryAddress, "commitAfterStartWithLockRoundFor", [toString(powerContractAddress(factoryAddress)), toString(factoryAddress), toString(userAddress), additionalLockRounds, | |
401 | + | let factoryActions = ([invoke(factoryAddress, "commitAfterStartWithLockRoundFor", [toString(powerContractAddress(factoryAddress)), toString(factoryAddress), toString(userAddress), additionalLockRounds, getPowerAssetId(factoryAddress), pwrAmount], nil)] ++ (if ((size(transfers._1) == 0)) | |
144 | 402 | then nil | |
145 | 403 | else [invoke(factoryAddress, "transferAssets", [userAddress.bytes, transfers._1, transfers._2], nil)])) | |
146 | 404 | $Tuple2([Burn(paymentAssetId, payment.amount)], factoryActions) | |
153 | 411 | ||
154 | 412 | ||
155 | 413 | @Callable(i) | |
156 | - | func price (callerPublicKey,args) = $Tuple2(nil, 0) | |
414 | + | func price (callerPublicKey,args) = { | |
415 | + | let factoryAddress = i.caller | |
416 | + | let currentPeriod = valueOrErrorMessage(getInteger(factoryAddress, keyCurrentPeriod()), wrapErr("invalid current period")) | |
417 | + | let startTreasuryValue = valueOrErrorMessage(getInteger(factoryAddress, keyTreasuryValueByPeriod(currentPeriod)), wrapErr(("invalid treasury value for period " + toString(currentPeriod)))) | |
418 | + | let treasuryValue = calcTreasuryValue(factoryAddress) | |
419 | + | let treasuryValueDiff = (treasuryValue - startTreasuryValue) | |
420 | + | let pwrPriceRaw = getAssetsPrices(factoryAddress, [toBase58String(getPowerAssetId(factoryAddress))])[0] | |
421 | + | let pwrPrice = if ((pwrPriceRaw > 0)) | |
422 | + | then pwrPriceRaw | |
423 | + | else throwErr("invalid PWR price") | |
424 | + | let price = if ((0 > treasuryValueDiff)) | |
425 | + | then (pwrPrice / 100) | |
426 | + | else ((fraction(treasuryValueDiff, 2, 10000) + pwrPrice) / 100) | |
427 | + | $Tuple2(nil, price) | |
428 | + | } | |
429 | + | ||
430 | + | ||
431 | + | ||
432 | + | @Callable(i) | |
433 | + | func getTreasuryValue (callerPublicKey,args) = { | |
434 | + | let factoryAddress = i.caller | |
435 | + | let treasuryValue = calcTreasuryValue(factoryAddress) | |
436 | + | $Tuple2(nil, treasuryValue) | |
437 | + | } | |
157 | 438 | ||
158 | 439 | ||
159 | 440 | @Verifier(tx) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let separator = "__" | |
5 | 5 | ||
6 | 6 | let chainId = take(drop(this.bytes, 1), 1) | |
7 | 7 | ||
8 | 8 | let chainIdT = base58'2T' | |
9 | 9 | ||
10 | 10 | let chainIdW = base58'2W' | |
11 | 11 | ||
12 | 12 | func mustAddress (i,address) = if ((i.caller == address)) | |
13 | 13 | then true | |
14 | 14 | else throw("permission denied") | |
15 | 15 | ||
16 | 16 | ||
17 | 17 | func mustThis (i) = mustAddress(i, this) | |
18 | 18 | ||
19 | 19 | ||
20 | 20 | let SEP = "__" | |
21 | 21 | ||
22 | 22 | let WAVES = "WAVES" | |
23 | 23 | ||
24 | 24 | let contractFilename = "wxdao_calculator.ride" | |
25 | 25 | ||
26 | + | let mult8 = 100000000 | |
27 | + | ||
26 | 28 | func wrapErr (s) = ((contractFilename + ": ") + s) | |
27 | 29 | ||
28 | 30 | ||
29 | 31 | func throwErr (s) = throw(wrapErr(s)) | |
32 | + | ||
33 | + | ||
34 | + | func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP) | |
35 | + | ||
36 | + | ||
37 | + | func keyStartHeightByPeriod (period) = makeString(["%s%d", "startHeight", toString(period)], SEP) | |
38 | + | ||
39 | + | ||
40 | + | func keyPeriodLength () = makeString(["%s", "periodLength"], SEP) | |
41 | + | ||
42 | + | ||
43 | + | func keyTreasuryValueByPeriod (period) = makeString(["%s%d", "treasuryValue", toString(period)], SEP) | |
30 | 44 | ||
31 | 45 | ||
32 | 46 | func keyPowerConfigAddress () = "%s__powerConfigAddress" | |
33 | 47 | ||
34 | 48 | ||
35 | 49 | func powerConfigAddress (factoryAddress) = valueOrErrorMessage(match getString(factoryAddress, keyPowerConfigAddress()) { | |
36 | 50 | case s: String => | |
37 | 51 | addressFromString(s) | |
38 | 52 | case _: Unit => | |
39 | 53 | unit | |
40 | 54 | case _ => | |
41 | 55 | throw("Match error") | |
42 | 56 | }, wrapErr("invalid power config address")) | |
43 | 57 | ||
44 | 58 | ||
45 | 59 | func keyPowerAssetId () = "powerAssetId" | |
46 | 60 | ||
47 | 61 | ||
48 | - | func | |
62 | + | func getPowerAssetId (factoryAddress) = fromBase58String(valueOrErrorMessage(getString(powerConfigAddress(factoryAddress), keyPowerAssetId()), wrapErr("invalid power asset id"))) | |
49 | 63 | ||
50 | 64 | ||
51 | 65 | func keyPowerContractAddress () = "%s__powerContractAddress" | |
52 | 66 | ||
53 | 67 | ||
54 | 68 | func powerContractAddress (factoryAddress) = valueOrErrorMessage(match getString(factoryAddress, keyPowerContractAddress()) { | |
55 | 69 | case s: String => | |
56 | 70 | addressFromString(s) | |
57 | 71 | case _: Unit => | |
58 | 72 | unit | |
59 | 73 | case _ => | |
60 | 74 | throw("Match error") | |
61 | 75 | }, wrapErr("invalid power contract address")) | |
62 | 76 | ||
63 | 77 | ||
78 | + | func keyPoolsFactoryAddress () = "%s__poolsFactoryAddress" | |
79 | + | ||
80 | + | ||
81 | + | func getPoolsFactoryAddress (factoryAddress) = valueOrErrorMessage(match getString(factoryAddress, keyPoolsFactoryAddress()) { | |
82 | + | case s: String => | |
83 | + | addressFromString(s) | |
84 | + | case _: Unit => | |
85 | + | unit | |
86 | + | case _ => | |
87 | + | throw("Match error") | |
88 | + | }, wrapErr("invalid pools factory address")) | |
89 | + | ||
90 | + | ||
91 | + | func keyTreasuryAddress () = "%s__treasuryAddress" | |
92 | + | ||
93 | + | ||
94 | + | func getTreasuryAddress (factoryAddress) = valueOrErrorMessage(match getString(factoryAddress, keyTreasuryAddress()) { | |
95 | + | case s: String => | |
96 | + | addressFromString(s) | |
97 | + | case _: Unit => | |
98 | + | unit | |
99 | + | case _ => | |
100 | + | throw("Match error") | |
101 | + | }, wrapErr("invalid treasury address")) | |
102 | + | ||
103 | + | ||
64 | 104 | func keyAssets () = "%s__assets" | |
65 | 105 | ||
66 | 106 | ||
67 | 107 | func getAssetsStr (factoryAddress) = valueOrErrorMessage(getString(factoryAddress, keyAssets()), wrapErr("invalid assets")) | |
68 | 108 | ||
69 | 109 | ||
70 | 110 | func keyLpAssetId () = "%s__lpAssetId" | |
71 | 111 | ||
72 | 112 | ||
73 | 113 | func getLpAssetId (factoryAddress) = fromBase58String(valueOrErrorMessage(getString(factoryAddress, keyLpAssetId()), wrapErr("invalid lp asset id"))) | |
114 | + | ||
115 | + | ||
116 | + | func getAssetsBalances (targetAddress,assetIdList) = { | |
117 | + | func map (acc,nextAssetIdStr) = { | |
118 | + | let balance = if ((nextAssetIdStr == WAVES)) | |
119 | + | then wavesBalance(targetAddress) | |
120 | + | else assetBalance(targetAddress, fromBase58String(nextAssetIdStr)) | |
121 | + | (acc :+ balance) | |
122 | + | } | |
123 | + | ||
124 | + | let $l = assetIdList | |
125 | + | let $s = size($l) | |
126 | + | let $acc0 = nil | |
127 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
128 | + | then $a | |
129 | + | else map($a, $l[$i]) | |
130 | + | ||
131 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
132 | + | then $a | |
133 | + | else throw("List size exceeds 10") | |
134 | + | ||
135 | + | $f0_2($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) | |
136 | + | } | |
137 | + | ||
138 | + | ||
139 | + | func getAssetsPrices (poolsFactoryAddress,assetIdList) = if ((chainId == chainIdW)) | |
140 | + | then { | |
141 | + | let wavesUsdtAddressStr = "3PKfrupEydU2nZAghVjZAfvCwMBkzuR1F52" | |
142 | + | let wavesUsdtPrice = { | |
143 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [wavesUsdtAddressStr], nil) | |
144 | + | if ($isInstanceOf(@, "Int")) | |
145 | + | then @ | |
146 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
147 | + | } | |
148 | + | let wavesXtnAddressStr = "3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g" | |
149 | + | let wavesXtnPrice = { | |
150 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [wavesXtnAddressStr], nil) | |
151 | + | if ($isInstanceOf(@, "Int")) | |
152 | + | then @ | |
153 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
154 | + | } | |
155 | + | let xtnUsdtPrice = fraction(wavesUsdtPrice, mult8, wavesXtnPrice) | |
156 | + | func map (acc,nextAssetId) = { | |
157 | + | let price = match nextAssetId { | |
158 | + | case _ => | |
159 | + | if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match0)) | |
160 | + | then { | |
161 | + | let pwrWavesAddressStr = "3PDi7Qq8pLQYvtKyTfQuqqPUWyhoYbU957t" | |
162 | + | let pwrWavesPrice = { | |
163 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [pwrWavesAddressStr], nil) | |
164 | + | if ($isInstanceOf(@, "Int")) | |
165 | + | then @ | |
166 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
167 | + | } | |
168 | + | fraction(pwrWavesPrice, wavesUsdtPrice, mult8) | |
169 | + | } | |
170 | + | else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match0)) | |
171 | + | then { | |
172 | + | let wxWavesAddressStr = "3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh" | |
173 | + | let wxWavesPrice = { | |
174 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [wxWavesAddressStr], nil) | |
175 | + | if ($isInstanceOf(@, "Int")) | |
176 | + | then @ | |
177 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
178 | + | } | |
179 | + | fraction(wxWavesPrice, wavesUsdtPrice, mult8) | |
180 | + | } | |
181 | + | else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match0)) | |
182 | + | then { | |
183 | + | let usdtwxgXtnAddressStr = "3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz" | |
184 | + | let usdtwxgXtnPrice = { | |
185 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [usdtwxgXtnAddressStr], nil) | |
186 | + | if ($isInstanceOf(@, "Int")) | |
187 | + | then @ | |
188 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
189 | + | } | |
190 | + | fraction(usdtwxgXtnPrice, xtnUsdtPrice, mult8) | |
191 | + | } | |
192 | + | else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match0)) | |
193 | + | then { | |
194 | + | let wavesUsdcwxgAddressStr = "3P3g3eipfG2NZKKQE8DZXt2E9tRJqii9jcX" | |
195 | + | let usdcwxgXtnPrice = { | |
196 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [wavesUsdcwxgAddressStr], nil) | |
197 | + | if ($isInstanceOf(@, "Int")) | |
198 | + | then @ | |
199 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
200 | + | } | |
201 | + | fraction(wavesUsdtPrice, mult8, usdcwxgXtnPrice) | |
202 | + | } | |
203 | + | else if (("HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk" == $match0)) | |
204 | + | then { | |
205 | + | let ltcwxgXtnAddressStr = "3P94wvu5gA7VhjPgAB3twaeqdwHCwNK2vsn" | |
206 | + | let ltcwxgXtnPrice = { | |
207 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [ltcwxgXtnAddressStr], nil) | |
208 | + | if ($isInstanceOf(@, "Int")) | |
209 | + | then @ | |
210 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
211 | + | } | |
212 | + | fraction(ltcwxgXtnPrice, xtnUsdtPrice, mult8) | |
213 | + | } | |
214 | + | else if (("HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk" == $match0)) | |
215 | + | then { | |
216 | + | let ethwxgXtnAddressStr = "3P3XGTN6s292g9iwYhs3TEqJqHiffQYojuE" | |
217 | + | let ethwxgXtnPrice = { | |
218 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [ethwxgXtnAddressStr], nil) | |
219 | + | if ($isInstanceOf(@, "Int")) | |
220 | + | then @ | |
221 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
222 | + | } | |
223 | + | fraction(ethwxgXtnPrice, wavesUsdtPrice, mult8) | |
224 | + | } | |
225 | + | else if (("HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk" == $match0)) | |
226 | + | then { | |
227 | + | let btcwxgXtnAddressStr = "3PCBWDTA6jrFswd7gQgaE3Xk7gLM5RKofvp" | |
228 | + | let btcwxgXtnPrice = { | |
229 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [btcwxgXtnAddressStr], nil) | |
230 | + | if ($isInstanceOf(@, "Int")) | |
231 | + | then @ | |
232 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
233 | + | } | |
234 | + | fraction(btcwxgXtnPrice, wavesUsdtPrice, mult8) | |
235 | + | } | |
236 | + | else throwErr("invalid asset id") | |
237 | + | } | |
238 | + | (acc :+ price) | |
239 | + | } | |
240 | + | ||
241 | + | let $l = assetIdList | |
242 | + | let $s = size($l) | |
243 | + | let $acc0 = nil | |
244 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
245 | + | then $a | |
246 | + | else map($a, $l[$i]) | |
247 | + | ||
248 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
249 | + | then $a | |
250 | + | else throw("List size exceeds 10") | |
251 | + | ||
252 | + | $f0_2($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) | |
253 | + | } | |
254 | + | else if ((chainId == chainIdT)) | |
255 | + | then { | |
256 | + | func map (acc,nextAssetId) = { | |
257 | + | let price = match nextAssetId { | |
258 | + | case _ => | |
259 | + | if (("EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc" == $match0)) | |
260 | + | then { | |
261 | + | let wxUsdtAddressStr = "3MrULQRLc52GWrJF1tMcAm4M78fPe57o9Kt" | |
262 | + | let wxUsdtPrice = { | |
263 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [wxUsdtAddressStr], nil) | |
264 | + | if ($isInstanceOf(@, "Int")) | |
265 | + | then @ | |
266 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
267 | + | } | |
268 | + | wxUsdtPrice | |
269 | + | } | |
270 | + | else if (("A7Ksh7fXyqm1KhKAiK3bAB2aiPSitQQF6v1pyu9SS3FR" == $match0)) | |
271 | + | then { | |
272 | + | let usdcUsdtAddressStr = "3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA" | |
273 | + | let usdcUsdtPrice = { | |
274 | + | let @ = invoke(poolsFactoryAddress, "getPrice", [usdcUsdtAddressStr], nil) | |
275 | + | if ($isInstanceOf(@, "Int")) | |
276 | + | then @ | |
277 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
278 | + | } | |
279 | + | usdcUsdtPrice | |
280 | + | } | |
281 | + | else throwErr("invalid asset id") | |
282 | + | } | |
283 | + | (acc :+ price) | |
284 | + | } | |
285 | + | ||
286 | + | let $l = assetIdList | |
287 | + | let $s = size($l) | |
288 | + | let $acc0 = nil | |
289 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
290 | + | then $a | |
291 | + | else map($a, $l[$i]) | |
292 | + | ||
293 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
294 | + | then $a | |
295 | + | else throw("List size exceeds 10") | |
296 | + | ||
297 | + | $f0_2($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) | |
298 | + | } | |
299 | + | else throwErr("invalid chain id") | |
300 | + | ||
301 | + | ||
302 | + | func calcTreasuryValue (factoryAddress) = { | |
303 | + | let treasuryAddress = getTreasuryAddress(factoryAddress) | |
304 | + | let poolsFactoryAddress = getPoolsFactoryAddress(factoryAddress) | |
305 | + | let assetsStr = split(getAssetsStr(factoryAddress), SEP) | |
306 | + | let assetsBalances = getAssetsBalances(treasuryAddress, assetsStr) | |
307 | + | let assetsPrices = getAssetsPrices(poolsFactoryAddress, assetsStr) | |
308 | + | func reduce (acc,nextAssetIdStr) = { | |
309 | + | let assetId = fromBase58String(nextAssetIdStr) | |
310 | + | let index = valueOrErrorMessage(indexOf(assetsStr, nextAssetIdStr), wrapErr("invalid asset id")) | |
311 | + | let balance = assetsBalances[index] | |
312 | + | let price = assetsPrices[index] | |
313 | + | let assetValue = fraction(balance, price, mult8) | |
314 | + | (acc + assetValue) | |
315 | + | } | |
316 | + | ||
317 | + | let treasuryValue = { | |
318 | + | let $l = assetsStr | |
319 | + | let $s = size($l) | |
320 | + | let $acc0 = 0 | |
321 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
322 | + | then $a | |
323 | + | else reduce($a, $l[$i]) | |
324 | + | ||
325 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
326 | + | then $a | |
327 | + | else throw("List size exceeds 10") | |
328 | + | ||
329 | + | $f0_2($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) | |
330 | + | } | |
331 | + | treasuryValue | |
332 | + | } | |
74 | 333 | ||
75 | 334 | ||
76 | 335 | @Callable(i) | |
77 | 336 | func withdraw (args) = { | |
78 | 337 | let recipient = addressFromStringValue(args[0]) | |
79 | 338 | let amount = parseIntValue(args[1]) | |
80 | 339 | let result = invoke(i.caller, "transferWaves", [recipient.bytes, amount], nil) | |
81 | 340 | $Tuple2(nil, result) | |
82 | 341 | } | |
83 | 342 | ||
84 | 343 | ||
85 | 344 | ||
86 | 345 | @Callable(i) | |
87 | 346 | func setIntParam (args) = { | |
88 | 347 | let key = args[0] | |
89 | 348 | let val = parseIntValue(args[1]) | |
90 | 349 | let result = invoke(i.caller, "integerEntry", [key, val], nil) | |
91 | 350 | $Tuple2(nil, result) | |
92 | 351 | } | |
93 | 352 | ||
94 | 353 | ||
95 | 354 | ||
96 | 355 | @Callable(i) | |
97 | 356 | func swap (callerPublicKey,args) = { | |
98 | 357 | let factoryAddress = i.caller | |
99 | 358 | let userAddress = addressFromPublicKey(callerPublicKey) | |
100 | 359 | let payment = if ((size(i.payments) == 1)) | |
101 | 360 | then i.payments[0] | |
102 | 361 | else throwErr("1 payment is required") | |
103 | 362 | let err = wrapErr("invalid payment asset id") | |
104 | 363 | let paymentAssetId = if ((valueOrErrorMessage(payment.assetId, err) == getLpAssetId(factoryAddress))) | |
105 | 364 | then value(payment.assetId) | |
106 | 365 | else throwErr(err) | |
107 | 366 | let pwrPrice = 100 | |
108 | 367 | let pwrAmount = (payment.amount / pwrPrice) | |
109 | 368 | let assetsStr = split(getAssetsStr(factoryAddress), SEP) | |
110 | - | let pwrBalance = assetBalance(factoryAddress, | |
369 | + | let pwrBalance = assetBalance(factoryAddress, getPowerAssetId(factoryAddress)) | |
111 | 370 | if ((pwrBalance == pwrBalance)) | |
112 | 371 | then { | |
113 | - | func map (acc,nextAssetId) = { | |
114 | - | let assetId = fromBase58String(nextAssetId) | |
115 | - | let balance = assetBalance(factoryAddress, assetId) | |
116 | - | if ((balance == balance)) | |
117 | - | then { | |
118 | - | let amount = fraction(balance, pwrAmount, pwrBalance) | |
119 | - | if ((amount > 0)) | |
120 | - | then $Tuple2((acc._1 :+ assetId), (acc._2 :+ amount)) | |
121 | - | else acc | |
122 | - | } | |
123 | - | else throw("Strict value is not equal to itself.") | |
372 | + | let treasuryAddress = getTreasuryAddress(factoryAddress) | |
373 | + | let assetsBalances = getAssetsBalances(treasuryAddress, assetsStr) | |
374 | + | func map (acc,nextAssetIdStr) = { | |
375 | + | let assetId = fromBase58String(nextAssetIdStr) | |
376 | + | let index = valueOrErrorMessage(indexOf(assetsStr, nextAssetIdStr), wrapErr("invalid asset balance")) | |
377 | + | let balance = assetsBalances[index] | |
378 | + | let amount = fraction(balance, pwrAmount, pwrBalance) | |
379 | + | if ((amount > 0)) | |
380 | + | then $Tuple2((acc._1 :+ assetId), (acc._2 :+ amount)) | |
381 | + | else acc | |
124 | 382 | } | |
125 | 383 | ||
126 | 384 | let transfers = { | |
127 | 385 | let $l = assetsStr | |
128 | 386 | let $s = size($l) | |
129 | 387 | let $acc0 = $Tuple2(nil, nil) | |
130 | 388 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
131 | 389 | then $a | |
132 | 390 | else map($a, $l[$i]) | |
133 | 391 | ||
134 | 392 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
135 | 393 | then $a | |
136 | 394 | else throw("List size exceeds 6") | |
137 | 395 | ||
138 | 396 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6) | |
139 | 397 | } | |
140 | 398 | if ((transfers == transfers)) | |
141 | 399 | then { | |
142 | 400 | let additionalLockRounds = 0 | |
143 | - | let factoryActions = ([invoke(factoryAddress, "commitAfterStartWithLockRoundFor", [toString(powerContractAddress(factoryAddress)), toString(factoryAddress), toString(userAddress), additionalLockRounds, | |
401 | + | let factoryActions = ([invoke(factoryAddress, "commitAfterStartWithLockRoundFor", [toString(powerContractAddress(factoryAddress)), toString(factoryAddress), toString(userAddress), additionalLockRounds, getPowerAssetId(factoryAddress), pwrAmount], nil)] ++ (if ((size(transfers._1) == 0)) | |
144 | 402 | then nil | |
145 | 403 | else [invoke(factoryAddress, "transferAssets", [userAddress.bytes, transfers._1, transfers._2], nil)])) | |
146 | 404 | $Tuple2([Burn(paymentAssetId, payment.amount)], factoryActions) | |
147 | 405 | } | |
148 | 406 | else throw("Strict value is not equal to itself.") | |
149 | 407 | } | |
150 | 408 | else throw("Strict value is not equal to itself.") | |
151 | 409 | } | |
152 | 410 | ||
153 | 411 | ||
154 | 412 | ||
155 | 413 | @Callable(i) | |
156 | - | func price (callerPublicKey,args) = $Tuple2(nil, 0) | |
414 | + | func price (callerPublicKey,args) = { | |
415 | + | let factoryAddress = i.caller | |
416 | + | let currentPeriod = valueOrErrorMessage(getInteger(factoryAddress, keyCurrentPeriod()), wrapErr("invalid current period")) | |
417 | + | let startTreasuryValue = valueOrErrorMessage(getInteger(factoryAddress, keyTreasuryValueByPeriod(currentPeriod)), wrapErr(("invalid treasury value for period " + toString(currentPeriod)))) | |
418 | + | let treasuryValue = calcTreasuryValue(factoryAddress) | |
419 | + | let treasuryValueDiff = (treasuryValue - startTreasuryValue) | |
420 | + | let pwrPriceRaw = getAssetsPrices(factoryAddress, [toBase58String(getPowerAssetId(factoryAddress))])[0] | |
421 | + | let pwrPrice = if ((pwrPriceRaw > 0)) | |
422 | + | then pwrPriceRaw | |
423 | + | else throwErr("invalid PWR price") | |
424 | + | let price = if ((0 > treasuryValueDiff)) | |
425 | + | then (pwrPrice / 100) | |
426 | + | else ((fraction(treasuryValueDiff, 2, 10000) + pwrPrice) / 100) | |
427 | + | $Tuple2(nil, price) | |
428 | + | } | |
429 | + | ||
430 | + | ||
431 | + | ||
432 | + | @Callable(i) | |
433 | + | func getTreasuryValue (callerPublicKey,args) = { | |
434 | + | let factoryAddress = i.caller | |
435 | + | let treasuryValue = calcTreasuryValue(factoryAddress) | |
436 | + | $Tuple2(nil, treasuryValue) | |
437 | + | } | |
157 | 438 | ||
158 | 439 | ||
159 | 440 | @Verifier(tx) | |
160 | 441 | func verify () = (chainId == chainIdT) | |
161 | 442 |
github/deemru/w8io/169f3d6 45.28 ms ◑![]()