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:
OldNewDifferences
2323
2424 let contractFilename = "wxdao_calculator.ride"
2525
26+let mult8 = 100000000
27+
2628 func wrapErr (s) = ((contractFilename + ": ") + s)
2729
2830
2931 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)
3044
3145
3246 func keyPowerConfigAddress () = "%s__powerConfigAddress"
4559 func keyPowerAssetId () = "powerAssetId"
4660
4761
48-func powerAssetId (factoryAddress) = fromBase58String(valueOrErrorMessage(getString(powerConfigAddress(factoryAddress), keyPowerAssetId()), wrapErr("invalid power asset id")))
62+func getPowerAssetId (factoryAddress) = fromBase58String(valueOrErrorMessage(getString(powerConfigAddress(factoryAddress), keyPowerAssetId()), wrapErr("invalid power asset id")))
4963
5064
5165 func keyPowerContractAddress () = "%s__powerContractAddress"
6175 }, wrapErr("invalid power contract address"))
6276
6377
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+
64104 func keyAssets () = "%s__assets"
65105
66106
71111
72112
73113 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+ }
74333
75334
76335 @Callable(i)
107366 let pwrPrice = 100
108367 let pwrAmount = (payment.amount / pwrPrice)
109368 let assetsStr = split(getAssetsStr(factoryAddress), SEP)
110- let pwrBalance = assetBalance(factoryAddress, powerAssetId(factoryAddress))
369+ let pwrBalance = assetBalance(factoryAddress, getPowerAssetId(factoryAddress))
111370 if ((pwrBalance == pwrBalance))
112371 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
124382 }
125383
126384 let transfers = {
140398 if ((transfers == transfers))
141399 then {
142400 let additionalLockRounds = 0
143- let factoryActions = ([invoke(factoryAddress, "commitAfterStartWithLockRoundFor", [toString(powerContractAddress(factoryAddress)), toString(factoryAddress), toString(userAddress), additionalLockRounds, powerAssetId(factoryAddress), pwrAmount], nil)] ++ (if ((size(transfers._1) == 0))
401+ let factoryActions = ([invoke(factoryAddress, "commitAfterStartWithLockRoundFor", [toString(powerContractAddress(factoryAddress)), toString(factoryAddress), toString(userAddress), additionalLockRounds, getPowerAssetId(factoryAddress), pwrAmount], nil)] ++ (if ((size(transfers._1) == 0))
144402 then nil
145403 else [invoke(factoryAddress, "transferAssets", [userAddress.bytes, transfers._1, transfers._2], nil)]))
146404 $Tuple2([Burn(paymentAssetId, payment.amount)], factoryActions)
153411
154412
155413 @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+ }
157438
158439
159440 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let chainId = take(drop(this.bytes, 1), 1)
77
88 let chainIdT = base58'2T'
99
1010 let chainIdW = base58'2W'
1111
1212 func mustAddress (i,address) = if ((i.caller == address))
1313 then true
1414 else throw("permission denied")
1515
1616
1717 func mustThis (i) = mustAddress(i, this)
1818
1919
2020 let SEP = "__"
2121
2222 let WAVES = "WAVES"
2323
2424 let contractFilename = "wxdao_calculator.ride"
2525
26+let mult8 = 100000000
27+
2628 func wrapErr (s) = ((contractFilename + ": ") + s)
2729
2830
2931 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)
3044
3145
3246 func keyPowerConfigAddress () = "%s__powerConfigAddress"
3347
3448
3549 func powerConfigAddress (factoryAddress) = valueOrErrorMessage(match getString(factoryAddress, keyPowerConfigAddress()) {
3650 case s: String =>
3751 addressFromString(s)
3852 case _: Unit =>
3953 unit
4054 case _ =>
4155 throw("Match error")
4256 }, wrapErr("invalid power config address"))
4357
4458
4559 func keyPowerAssetId () = "powerAssetId"
4660
4761
48-func powerAssetId (factoryAddress) = fromBase58String(valueOrErrorMessage(getString(powerConfigAddress(factoryAddress), keyPowerAssetId()), wrapErr("invalid power asset id")))
62+func getPowerAssetId (factoryAddress) = fromBase58String(valueOrErrorMessage(getString(powerConfigAddress(factoryAddress), keyPowerAssetId()), wrapErr("invalid power asset id")))
4963
5064
5165 func keyPowerContractAddress () = "%s__powerContractAddress"
5266
5367
5468 func powerContractAddress (factoryAddress) = valueOrErrorMessage(match getString(factoryAddress, keyPowerContractAddress()) {
5569 case s: String =>
5670 addressFromString(s)
5771 case _: Unit =>
5872 unit
5973 case _ =>
6074 throw("Match error")
6175 }, wrapErr("invalid power contract address"))
6276
6377
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+
64104 func keyAssets () = "%s__assets"
65105
66106
67107 func getAssetsStr (factoryAddress) = valueOrErrorMessage(getString(factoryAddress, keyAssets()), wrapErr("invalid assets"))
68108
69109
70110 func keyLpAssetId () = "%s__lpAssetId"
71111
72112
73113 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+ }
74333
75334
76335 @Callable(i)
77336 func withdraw (args) = {
78337 let recipient = addressFromStringValue(args[0])
79338 let amount = parseIntValue(args[1])
80339 let result = invoke(i.caller, "transferWaves", [recipient.bytes, amount], nil)
81340 $Tuple2(nil, result)
82341 }
83342
84343
85344
86345 @Callable(i)
87346 func setIntParam (args) = {
88347 let key = args[0]
89348 let val = parseIntValue(args[1])
90349 let result = invoke(i.caller, "integerEntry", [key, val], nil)
91350 $Tuple2(nil, result)
92351 }
93352
94353
95354
96355 @Callable(i)
97356 func swap (callerPublicKey,args) = {
98357 let factoryAddress = i.caller
99358 let userAddress = addressFromPublicKey(callerPublicKey)
100359 let payment = if ((size(i.payments) == 1))
101360 then i.payments[0]
102361 else throwErr("1 payment is required")
103362 let err = wrapErr("invalid payment asset id")
104363 let paymentAssetId = if ((valueOrErrorMessage(payment.assetId, err) == getLpAssetId(factoryAddress)))
105364 then value(payment.assetId)
106365 else throwErr(err)
107366 let pwrPrice = 100
108367 let pwrAmount = (payment.amount / pwrPrice)
109368 let assetsStr = split(getAssetsStr(factoryAddress), SEP)
110- let pwrBalance = assetBalance(factoryAddress, powerAssetId(factoryAddress))
369+ let pwrBalance = assetBalance(factoryAddress, getPowerAssetId(factoryAddress))
111370 if ((pwrBalance == pwrBalance))
112371 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
124382 }
125383
126384 let transfers = {
127385 let $l = assetsStr
128386 let $s = size($l)
129387 let $acc0 = $Tuple2(nil, nil)
130388 func $f0_1 ($a,$i) = if (($i >= $s))
131389 then $a
132390 else map($a, $l[$i])
133391
134392 func $f0_2 ($a,$i) = if (($i >= $s))
135393 then $a
136394 else throw("List size exceeds 6")
137395
138396 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
139397 }
140398 if ((transfers == transfers))
141399 then {
142400 let additionalLockRounds = 0
143- let factoryActions = ([invoke(factoryAddress, "commitAfterStartWithLockRoundFor", [toString(powerContractAddress(factoryAddress)), toString(factoryAddress), toString(userAddress), additionalLockRounds, powerAssetId(factoryAddress), pwrAmount], nil)] ++ (if ((size(transfers._1) == 0))
401+ let factoryActions = ([invoke(factoryAddress, "commitAfterStartWithLockRoundFor", [toString(powerContractAddress(factoryAddress)), toString(factoryAddress), toString(userAddress), additionalLockRounds, getPowerAssetId(factoryAddress), pwrAmount], nil)] ++ (if ((size(transfers._1) == 0))
144402 then nil
145403 else [invoke(factoryAddress, "transferAssets", [userAddress.bytes, transfers._1, transfers._2], nil)]))
146404 $Tuple2([Burn(paymentAssetId, payment.amount)], factoryActions)
147405 }
148406 else throw("Strict value is not equal to itself.")
149407 }
150408 else throw("Strict value is not equal to itself.")
151409 }
152410
153411
154412
155413 @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+ }
157438
158439
159440 @Verifier(tx)
160441 func verify () = (chainId == chainIdT)
161442

github/deemru/w8io/169f3d6 
45.28 ms