tx · 87Sj2PST2V6vM3iSsXysFdCSDN7umXNL4Fwm9Zaz5CV4

3PB2QFfWWEcUmGfsrbaBh8oGS7NsBeobmxd:  -0.04500000 Waves

2023.08.04 11:16 [3761217] smart account 3PB2QFfWWEcUmGfsrbaBh8oGS7NsBeobmxd > SELF 0.00000000 Waves

{ "type": 13, "id": "87Sj2PST2V6vM3iSsXysFdCSDN7umXNL4Fwm9Zaz5CV4", "fee": 4500000, "feeAssetId": null, "timestamp": 1691137039799, "version": 2, "chainId": 87, "sender": "3PB2QFfWWEcUmGfsrbaBh8oGS7NsBeobmxd", "senderPublicKey": "B1huFgsztnhqqDXa4XcopsWWCvwHZTbpTtcyjatULjVB", "proofs": [ "6A1QLUuGYqAb7wXgCd2u3kSTNiCeca75CLf7ZxmBdr6RYsgibkJPQCeBpfPLZWGTYyDrXvSxVoReChW3S2XqSHa" ], "script": "base64:BgI1CAISABIAEgMKAQESBQoDAQEBEgkKBwEBCAgBAQESBAoCAQESBAoCAQESABIAEgASABIAEgA+AAxrX2Jhc2VPcmFjbGUCDGtfYmFzZU9yYWNsZQANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAIa19wYXVzZWQCCGtfcGF1c2VkAAVrX2ZlZQIFa19mZWUAEGtfbWF4UHJpY2VJbXBhY3QCEGtfbWF4UHJpY2VJbXBhY3QAEGtfbWF4UHJpY2VTcHJlYWQCEGtfbWF4UHJpY2VTcHJlYWQAEGtfbWF4T3JhY2xlRGVsYXkCEGtfbWF4T3JhY2xlRGVsYXkAE2tfcXVvdGVBc3NldFJlc2VydmUCCGtfcXRBc3RSABJrX2Jhc2VBc3NldFJlc2VydmUCCGtfYnNBc3RSABJrX3F1b3RlQXNzZXRXZWlnaHQCCGtfcXRBc3RXABFrX2Jhc2VBc3NldFdlaWdodAIIa19ic0FzdFcAE2tfdG90YWxQb3NpdGlvblNpemUCE2tfdG90YWxQb3NpdGlvblNpemUACGtfbGFzdFR4AghrX2xhc3RUeAAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzAA9rX3ZhdWx0X2FkZHJlc3MCD2tfdmF1bHRfYWRkcmVzcwAPa19hZG1pbl9hZGRyZXNzAg9rX2FkbWluX2FkZHJlc3MADWtfcXVvdGVfYXNzZXQCDWtfcXVvdGVfYXNzZXQADmtfc3BvdF9hZGRyZXNzAg5rX3Nwb3RfYWRkcmVzcwEOdG9Db21wb3NpdGVLZXkCBF9rZXkIX2FkZHJlc3MJAKwCAgkArAICBQRfa2V5AgFfBQhfYWRkcmVzcwELY29vcmRpbmF0b3IACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MCE0Nvb3JkaW5hdG9yIG5vdCBzZXQBDGFkbWluQWRkcmVzcwAJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUPa19hZG1pbl9hZGRyZXNzAQpxdW90ZUFzc2V0AAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ1rX3F1b3RlX2Fzc2V0AQtzcG90QWRkcmVzcwAJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQtjb29yZGluYXRvcgAFDmtfc3BvdF9hZGRyZXNzAhRTcG90IGFkZHJlc3Mgbm90IHNldAAPREVDSU1BTF9OVU1CRVJTAAYADERFQ0lNQUxfVU5JVAkAaAIAAQkAaAIJAGgCCQBoAgkAaAIJAGgCAAoACgAKAAoACgAKAQFzAQJfeAkArAICCQCkAwEFAl94AgEsAQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BBWJkaXZkAgJfeAJfeQkAvQIEBQJfeAkAtgIBBQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEFYm11bGQCAl94Al95CQC9AgQFAl94BQJfeQkAtgIBBQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAQNhYnMBAl94AwkAZgIFAl94AAAFAl94CQEBLQEFAl94AQNpbnQBAWsJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQFrCQCsAgICDW5vIHZhbHVlIGZvciAFAWsBBWludE9yAgFrA2RlZgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFrBQNkZWYBBGludEECCF9hZGRyZXNzBF9rZXkEA3ZhbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCF9hZGRyZXNzBQRfa2V5CQCsAgICEU5vIHZhbHVlIGZvciBrZXkgBQRfa2V5BQN2YWwBA2ZlZQAJAQNpbnQBBQVrX2ZlZQEGcXRBc3RSAAkBA2ludAEFE2tfcXVvdGVBc3NldFJlc2VydmUBBmJzQXN0UgAJAQNpbnQBBRJrX2Jhc2VBc3NldFJlc2VydmUBBnF0QXN0VwAJAQVpbnRPcgIFEmtfcXVvdGVBc3NldFdlaWdodAUMREVDSU1BTF9VTklUAQZic0FzdFcACQEFaW50T3ICBRFrX2Jhc2VBc3NldFdlaWdodAUMREVDSU1BTF9VTklUARF0b3RhbFBvc2l0aW9uU2l6ZQAJAQNpbnQBBRNrX3RvdGFsUG9zaXRpb25TaXplAQ5tYXhQcmljZUltcGFjdAAJAQNpbnQBBRBrX21heFByaWNlSW1wYWN0AQ5tYXhQcmljZVNwcmVhZAAJAQNpbnQBBRBrX21heFByaWNlU3ByZWFkAQ5tYXhPcmFjbGVEZWxheQAJAQNpbnQBBRBrX21heE9yYWNsZURlbGF5AQ1sYXN0VGltZXN0YW1wAAgFCWxhc3RCbG9jawl0aW1lc3RhbXABDWdldE9yYWNsZURhdGEBA2tleQQNb3JhY2xlRGF0YVN0cgkAnQgCBQR0aGlzBQNrZXkDAwkBCWlzRGVmaW5lZAEFDW9yYWNsZURhdGFTdHIJAQIhPQIJAQV2YWx1ZQEFDW9yYWNsZURhdGFTdHICAAcECm9yYWNsZURhdGEJALUJAgkBBXZhbHVlAQUNb3JhY2xlRGF0YVN0cgIBLAQNb3JhY2xlQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKb3JhY2xlRGF0YQAACQCsAgICG0ludmFsaWQgb3JhY2xlIGFkZHJlc3MgaW46IAkBBXZhbHVlAQUNb3JhY2xlRGF0YVN0cgQIcHJpY2VLZXkJAJEDAgUKb3JhY2xlRGF0YQABBAhibG9ja0tleQkAkQMCBQpvcmFjbGVEYXRhAAIEB29wZW5LZXkJAJEDAgUKb3JhY2xlRGF0YQADCQCWCgQFDW9yYWNsZUFkZHJlc3MFCHByaWNlS2V5BQhibG9ja0tleQUHb3BlbktleQUEdW5pdAELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHAQZwYXVzZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFCGtfcGF1c2VkBwENdXBkYXRlUmVzZXJ2ZQMGX2lzQWRkEV9xdW90ZUFzc2V0QW1vdW50EF9iYXNlQXNzZXRBbW91bnQDBQZfaXNBZGQEB25ld0Jhc2UJAGUCCQEGYnNBc3RSAAUQX2Jhc2VBc3NldEFtb3VudAMJAGcCAAAFB25ld0Jhc2UJAAIBAipUeCBsZWFkIHRvIGJhc2UgYXNzZXQgcmVzZXJ2ZSA8PSAwLCByZXZlcnQJAJUKAwkAZAIJAQZxdEFzdFIABRFfcXVvdGVBc3NldEFtb3VudAUHbmV3QmFzZQkAZAIJARF0b3RhbFBvc2l0aW9uU2l6ZQAFEF9iYXNlQXNzZXRBbW91bnQECG5ld1F1b3RlCQBlAgkBBnF0QXN0UgAFEV9xdW90ZUFzc2V0QW1vdW50AwkAZwIAAAUIbmV3UXVvdGUJAAIBAipUeCBsZWFkIHRvIGJhc2UgcXVvdGUgcmVzZXJ2ZSA8PSAwLCByZXZlcnQJAJUKAwUIbmV3UXVvdGUJAGQCCQEGYnNBc3RSAAUQX2Jhc2VBc3NldEFtb3VudAkAZQIJARF0b3RhbFBvc2l0aW9uU2l6ZQAFEF9iYXNlQXNzZXRBbW91bnQBDWNhbGNJbnZhcmlhbnQCB19xdEFzdFIHX2JzQXN0UgQHYnF0QXN0UgkAtgIBBQdfcXRBc3RSBAdiYnNBc3RSCQC2AgEFB19ic0FzdFIJAQVibXVsZAIFB2JxdEFzdFIFB2Jic0FzdFIBCXN3YXBJbnB1dAIGX2lzQWRkEV9xdW90ZUFzc2V0QW1vdW50BAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEB19xdEFzdFcJAQZxdEFzdFcABAdfYnNBc3RXCQEGYnNBc3RXAAQYcXVvdGVBc3NldEFtb3VudEFkanVzdGVkCQEEZGl2ZAIFEV9xdW90ZUFzc2V0QW1vdW50BQdfcXRBc3RXBAFrCQENY2FsY0ludmFyaWFudAIFB19xdEFzdFIFB19ic0FzdFIEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIDBQZfaXNBZGQJAGQCBQdfcXRBc3RSBRhxdW90ZUFzc2V0QW1vdW50QWRqdXN0ZWQJAGUCBQdfcXRBc3RSBRhxdW90ZUFzc2V0QW1vdW50QWRqdXN0ZWQEFWJhc2VBc3NldFJlc2VydmVBZnRlcgkAoAMBCQEFYmRpdmQCBQFrCQC2AgEFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIEGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwkBA2FicwEJAGUCBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFB19ic0FzdFIEFWFtb3VudEJhc2VBc3NldEJvdWdodAMFBl9pc0FkZAUYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzCQEBLQEFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQLJHQwNjQwMzY1NzMJAQ11cGRhdGVSZXNlcnZlAwUGX2lzQWRkBRhxdW90ZUFzc2V0QW1vdW50QWRqdXN0ZWQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEIBQskdDA2NDAzNjU3MwJfMQQWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFCyR0MDY0MDM2NTczAl8yBBd0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyMQgFCyR0MDY0MDM2NTczAl8zBAtwcmljZUJlZm9yZQkBBGRpdmQCCQEEbXVsZAIFB19xdEFzdFIFB19xdEFzdFcJAQRtdWxkAgUHX2JzQXN0UgUHX2JzQXN0VwQLbWFya2V0UHJpY2UJAQRkaXZkAgURX3F1b3RlQXNzZXRBbW91bnQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQJcHJpY2VEaWZmCQEDYWJzAQkAZQIFC3ByaWNlQmVmb3JlBQttYXJrZXRQcmljZQQLcHJpY2VJbXBhY3QJAGUCBQxERUNJTUFMX1VOSVQJAQRkaXZkAgULcHJpY2VCZWZvcmUJAGQCBQtwcmljZUJlZm9yZQUJcHJpY2VEaWZmBBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QAAwkAZgIFC3ByaWNlSW1wYWN0BRNtYXhQcmljZUltcGFjdFZhbHVlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1QcmljZSBpbXBhY3QgCQCkAwEFC3ByaWNlSW1wYWN0AhQgPiBtYXggcHJpY2UgaW1wYWN0IAkApAMBBRNtYXhQcmljZUltcGFjdFZhbHVlAhUgYmVmb3JlIHF1b3RlIGFzc2V0OiAJAKQDAQUHX3F0QXN0UgIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQUHX2JzQXN0UgIhIHF1b3RlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEV9xdW90ZUFzc2V0QW1vdW50Ag8gcHJpY2UgYmVmb3JlOiAJAKQDAQULcHJpY2VCZWZvcmUCDiBtYXJrZXRQcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCWCgQFFWFtb3VudEJhc2VBc3NldEJvdWdodAUXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEFFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBwZfaXNBZGQQX2Jhc2VBc3NldEFtb3VudBRfY2hlY2tNYXhQcmljZUltcGFjdBJfcXVvdGVBc3NldFJlc2VydmURX3F1b3RlQXNzZXRXZWlnaHQRX2Jhc2VBc3NldFJlc2VydmUQX2Jhc2VBc3NldFdlaWdodAQLcHJpY2VCZWZvcmUJAQRkaXZkAgkBBG11bGQCBRJfcXVvdGVBc3NldFJlc2VydmUFEV9xdW90ZUFzc2V0V2VpZ2h0CQEEbXVsZAIFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0V2VpZ2h0AwkAAAIFEF9iYXNlQXNzZXRBbW91bnQAAAkAAgECGUludmFsaWQgYmFzZSBhc3NldCBhbW91bnQEAWsJAQ1jYWxjSW52YXJpYW50AgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQQYYmFzZUFzc2V0UG9vbEFtb3VudEFmdGVyAwUGX2lzQWRkCQBkAgURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRBbW91bnQJAGUCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUQX2Jhc2VBc3NldEFtb3VudAQPcXVvdGVBc3NldEFmdGVyCQCgAwEJAQViZGl2ZAIFAWsJALYCAQUYYmFzZUFzc2V0UG9vbEFtb3VudEFmdGVyBA9xdW90ZUFzc2V0RGVsdGEJAQNhYnMBCQBlAgUPcXVvdGVBc3NldEFmdGVyBRJfcXVvdGVBc3NldFJlc2VydmUEDnF1b3RlQXNzZXRTb2xkCQEEbXVsZAIFD3F1b3RlQXNzZXREZWx0YQURX3F1b3RlQXNzZXRXZWlnaHQEE21heFByaWNlSW1wYWN0VmFsdWUJAQ5tYXhQcmljZUltcGFjdAAECyR0MDg2ODg4ODUwCQENdXBkYXRlUmVzZXJ2ZQMJAQEhAQUGX2lzQWRkBQ9xdW90ZUFzc2V0RGVsdGEFEF9iYXNlQXNzZXRBbW91bnQEF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxCAULJHQwODY4ODg4NTACXzEEFmJhc2VBc3NldFJlc2VydmVBZnRlcjEIBQskdDA4Njg4ODg1MAJfMgQXdG90YWxQb3NpdGlvblNpemVBZnRlcjEIBQskdDA4Njg4ODg1MAJfMwQLbWFya2V0UHJpY2UJAQRkaXZkAgUOcXVvdGVBc3NldFNvbGQFEF9iYXNlQXNzZXRBbW91bnQECXByaWNlRGlmZgkBA2FicwEJAGUCBQtwcmljZUJlZm9yZQULbWFya2V0UHJpY2UEC3ByaWNlSW1wYWN0CQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIFC3ByaWNlQmVmb3JlCQBkAgULcHJpY2VCZWZvcmUFCXByaWNlRGlmZgMDCQBmAgULcHJpY2VJbXBhY3QFE21heFByaWNlSW1wYWN0VmFsdWUFFF9jaGVja01heFByaWNlSW1wYWN0BwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgINUHJpY2UgaW1wYWN0IAkApAMBBQtwcmljZUltcGFjdAIUID4gbWF4IHByaWNlIGltcGFjdCAJAKQDAQUTbWF4UHJpY2VJbXBhY3RWYWx1ZQIVIGJlZm9yZSBxdW90ZSBhc3NldDogCQCkAwEFEl9xdW90ZUFzc2V0UmVzZXJ2ZQIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQURX2Jhc2VBc3NldFJlc2VydmUCICBiYXNlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEF9iYXNlQXNzZXRBbW91bnQCDyBwcmljZSBiZWZvcmU6IAkApAMBBQtwcmljZUJlZm9yZQIPIG1hcmtldCBwcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCXCgUFDnF1b3RlQXNzZXRTb2xkBRdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQUWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQUXdG90YWxQb3NpdGlvblNpemVBZnRlcjEFC3ByaWNlSW1wYWN0AQpzd2FwT3V0cHV0AwZfaXNBZGQQX2Jhc2VBc3NldEFtb3VudBRfY2hlY2tNYXhQcmljZUltcGFjdAkBFnN3YXBPdXRwdXRXaXRoUmVzZXJ2ZXMHBQZfaXNBZGQFEF9iYXNlQXNzZXRBbW91bnQFFF9jaGVja01heFByaWNlSW1wYWN0CQEGcXRBc3RSAAkBBnF0QXN0VwAJAQZic0FzdFIACQEGYnNBc3RXAAETZ2V0T3JhY2xlUHJpY2VWYWx1ZQMGb3JhY2xlCHByaWNlS2V5CGJsb2NrS2V5BAlsYXN0VmFsdWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQZvcmFjbGUFCHByaWNlS2V5CQCsAgIJAKwCAgkArAICAiJDYW4gbm90IGdldCBvcmFjbGUgcHJpY2UuIE9yYWNsZTogCQClCAEFBm9yYWNsZQIGIGtleTogBQhwcmljZUtleQMJAQIhPQIFCGJsb2NrS2V5AgAEDGN1cnJlbnRCbG9jawgFCWxhc3RCbG9jawZoZWlnaHQED2xhc3RPcmFjbGVCbG9jawkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBm9yYWNsZQUIYmxvY2tLZXkJAKwCAgkArAICCQCsAgICIkNhbiBub3QgZ2V0IG9yYWNsZSBibG9jay4gT3JhY2xlOiAJAKUIAQUGb3JhY2xlAgYga2V5OiAFCGJsb2NrS2V5AwkAZgIJAGUCBQxjdXJyZW50QmxvY2sFD2xhc3RPcmFjbGVCbG9jawkBDm1heE9yYWNsZURlbGF5AAkAAgEJAKwCAgkArAICCQCsAgICJk9yYWNsZSBzdGFsZSBkYXRhLiBMYXN0IG9yYWNsZSBibG9jazogCQCkAwEFD2xhc3RPcmFjbGVCbG9jawIQIGN1cnJlbnQgYmxvY2s6IAkApAMBBQxjdXJyZW50QmxvY2sFCWxhc3RWYWx1ZQUJbGFzdFZhbHVlAQ5nZXRPcmFjbGVQcmljZQAECmJhc2VPcmFjbGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDWdldE9yYWNsZURhdGEBBQxrX2Jhc2VPcmFjbGUCGU5vIGJhc2UgYXNzZXQgb3JhY2xlIGRhdGEED2Jhc2VPcmFjbGVQcmljZQkBE2dldE9yYWNsZVByaWNlVmFsdWUDCAUKYmFzZU9yYWNsZQJfMQgFCmJhc2VPcmFjbGUCXzIIBQpiYXNlT3JhY2xlAl8zBBBxdW90ZU9yYWNsZVByaWNlBQxERUNJTUFMX1VOSVQJAQRkaXZkAgUPYmFzZU9yYWNsZVByaWNlBRBxdW90ZU9yYWNsZVByaWNlAQxnZXRTcG90UHJpY2UABBJfcXVvdGVBc3NldFJlc2VydmUJAQZxdEFzdFIABBFfYmFzZUFzc2V0UmVzZXJ2ZQkBBmJzQXN0UgAEB19xdEFzdFcJAQZxdEFzdFcABAdfYnNBc3RXCQEGYnNBc3RXAAkBBGRpdmQCCQEEbXVsZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQUHX3F0QXN0VwkBBG11bGQCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUHX2JzQXN0VwETZ2V0VGVybWluYWxBbW1TdGF0ZQAEDV9wb3NpdGlvblNpemUJARF0b3RhbFBvc2l0aW9uU2l6ZQADCQAAAgUNX3Bvc2l0aW9uU2l6ZQAACQCUCgIJAQZxdEFzdFIACQEGYnNBc3RSAAQJZGlyZWN0aW9uCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABA0kdDAxMTc5ODExOTc3CQEKc3dhcE91dHB1dAMFCWRpcmVjdGlvbgkBA2FicwEFDV9wb3NpdGlvblNpemUHBBVjdXJyZW50TmV0TWFya2V0VmFsdWUIBQ0kdDAxMTc5ODExOTc3Al8xBBl0ZXJtaW5hbFF1b3RlQXNzZXRSZXNlcnZlCAUNJHQwMTE3OTgxMTk3NwJfMgQYdGVybWluYWxCYXNlQXNzZXRSZXNlcnZlCAUNJHQwMTE3OTgxMTk3NwJfMwkAlAoCBRl0ZXJtaW5hbFF1b3RlQXNzZXRSZXNlcnZlBRh0ZXJtaW5hbEJhc2VBc3NldFJlc2VydmUBE2dldFF1b3RlQXNzZXRXZWlnaHQEEGJhc2VBc3NldFJlc2VydmURdG90YWxQb3NpdGlvblNpemURcXVvdGVBc3NldFJlc2VydmULdGFyZ2V0UHJpY2UEAWIJALYCAQUQYmFzZUFzc2V0UmVzZXJ2ZQQCc3oJALYCAQURdG90YWxQb3NpdGlvblNpemUEAXEJALYCAQURcXVvdGVBc3NldFJlc2VydmUEAXAJALYCAQULdGFyZ2V0UHJpY2UEAWsJAQVibXVsZAIFAXEFAWIEBG5ld0IJALcCAgUBYgUCc3oEBG5ld1EJAQViZGl2ZAIFAWsFBG5ld0IEAXoJAQViZGl2ZAIFBG5ld1EFBG5ld0IEBnJlc3VsdAkBBWJkaXZkAgUBcAUBegkAoAMBBQZyZXN1bHQBFGdldFN5bmNUZXJtaW5hbFByaWNlAw5fdGVybWluYWxQcmljZQdfcXRBc3RSB19ic0FzdFIEDV9wb3NpdGlvblNpemUJARF0b3RhbFBvc2l0aW9uU2l6ZQADCQAAAgUNX3Bvc2l0aW9uU2l6ZQAABAluZXdRdEFzdFcJAQRkaXZkAgkBBG11bGQCBQ5fdGVybWluYWxQcmljZQUHX2JzQXN0UgUHX3F0QXN0UgkAlAoCBQluZXdRdEFzdFcFDERFQ0lNQUxfVU5JVAQJbmV3UXRBc3RXCQETZ2V0UXVvdGVBc3NldFdlaWdodAQFB19ic0FzdFIFDV9wb3NpdGlvblNpemUFB19xdEFzdFIFDl90ZXJtaW5hbFByaWNlBAluZXdCc0FzdFcFDERFQ0lNQUxfVU5JVAkAlAoCBQluZXdRdEFzdFcFCW5ld0JzQXN0VwEOdXBkYXRlU2V0dGluZ3MDD19tYXhQcmljZUltcGFjdA9fbWF4UHJpY2VTcHJlYWQPX21heE9yYWNsZURlbGF5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrX21heFByaWNlSW1wYWN0BQ9fbWF4UHJpY2VJbXBhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbWF4UHJpY2VTcHJlYWQFD19tYXhQcmljZVNwcmVhZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa19tYXhPcmFjbGVEZWxheQUPX21heE9yYWNsZURlbGF5BQNuaWwBEXVwZGF0ZUFtbVJlc2VydmVzAgdfcXRBc3RSB19ic0FzdFIDAwkAZwIAAAUHX3F0QXN0UgYJAGcCAAAFB19ic0FzdFIJAAIBAjdDYW4gbm90IHVwZGF0ZUFtbVJlc2VydmVzOiBfcXRBc3RSIDw9IDAgfHwgX2JzQXN0UiA8PSAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrX3F1b3RlQXNzZXRSZXNlcnZlBQdfcXRBc3RSCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX2Jhc2VBc3NldFJlc2VydmUFB19ic0FzdFIFA25pbAEQdXBkYXRlQW1tV2VpZ2h0cwIHX3F0QXN0VwdfYnNBc3RXCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX3F1b3RlQXNzZXRXZWlnaHQFB19xdEFzdFcJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtfYmFzZUFzc2V0V2VpZ2h0BQdfYnNBc3RXBQNuaWwBCXVwZGF0ZUFtbQMHX3F0QXN0UgdfYnNBc3RSF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBAdfcXRBc3RXCQEGcXRBc3RXAAQHX2JzQXN0VwkBBmJzQXN0VwAJAM4IAgkBEXVwZGF0ZUFtbVJlc2VydmVzAgUHX3F0QXN0UgUHX2JzQXN0UgkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa190b3RhbFBvc2l0aW9uU2l6ZQUXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIFA25pbA0BaQEFcGF1c2UAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECFEludmFsaWQgcGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAYFA25pbAFpAQd1bnBhdXNlAAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhZJbnZhbGlkIHVucGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAcFA25pbAFpAQ9jaGFuZ2VMaXF1aWRpdHkBEV9xdW90ZUFzc2V0QW1vdW50AwkBASEBAwkAAAIIBQFpBmNhbGxlcgkBC3Nwb3RBZGRyZXNzAAYJAAACCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIeSW52YWxpZCBjaGFuZ2VMaXF1aWRpdHkgcGFyYW1zBAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEB19xdEFzdFcJAQZxdEFzdFcABAdfYnNBc3RXCQEGYnNBc3RXAAQFcHJpY2UJAQRkaXZkAgkBBG11bGQCBQdfcXRBc3RSBQdfcXRBc3RXCQEEbXVsZAIFB19ic0FzdFIFB19ic0FzdFcEC3F0QXN0UkFmdGVyCQBkAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEFGJhc2VBc3NldEFtb3VudFRvQWRkCQBlAgkBBGRpdmQCCQEEbXVsZAIFC3F0QXN0UkFmdGVyBQdfcXRBc3RXBQVwcmljZQUHX2JzQXN0UgQLYnNBc3RSQWZ0ZXIJAGQCBQdfYnNBc3RSBRRiYXNlQXNzZXRBbW91bnRUb0FkZAQNJHQwMTUzNjIxNTQ5MgkBFGdldFN5bmNUZXJtaW5hbFByaWNlAwkBDmdldE9yYWNsZVByaWNlAAULcXRBc3RSQWZ0ZXIFC2JzQXN0UkFmdGVyBBNuZXdRdW90ZUFzc2V0V2VpZ2h0CAUNJHQwMTUzNjIxNTQ5MgJfMQQSbmV3QmFzZUFzc2V0V2VpZ2h0CAUNJHQwMTUzNjIxNTQ5MgJfMgkAzggCCQERdXBkYXRlQW1tUmVzZXJ2ZXMCBQtxdEFzdFJBZnRlcgULYnNBc3RSQWZ0ZXIJARB1cGRhdGVBbW1XZWlnaHRzAgUTbmV3UXVvdGVBc3NldFdlaWdodAUSbmV3QmFzZUFzc2V0V2VpZ2h0AWkBDmNoYW5nZVNldHRpbmdzAw9fbWF4UHJpY2VJbXBhY3QPX21heFByaWNlU3ByZWFkD19tYXhPcmFjbGVEZWxheQMDAwMDCQBnAgAABQ9fbWF4UHJpY2VJbXBhY3QGCQBnAgAABQ9fbWF4UHJpY2VTcHJlYWQGCQBnAgAABQ9fbWF4T3JhY2xlRGVsYXkGCQEBIQEJAQtpbml0aWFsaXplZAAGCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIdSW52YWxpZCBjaGFuZ2VTZXR0aW5ncyBwYXJhbXMJAQ51cGRhdGVTZXR0aW5ncwMFD19tYXhQcmljZUltcGFjdAUPX21heFByaWNlU3ByZWFkBQ9fbWF4T3JhY2xlRGVsYXkBaQEKaW5pdGlhbGl6ZQcHX3F0QXN0UgdfYnNBc3RSD19iYXNlT3JhY2xlRGF0YQxfY29vcmRpbmF0b3IPX21heFByaWNlSW1wYWN0D19tYXhQcmljZVNwcmVhZA9fbWF4T3JhY2xlRGVsYXkDAwMDAwMDCQBnAgAABQdfcXRBc3RSBgkAZwIAAAUHX2JzQXN0UgYJAGcCAAAFD19tYXhQcmljZUltcGFjdAYJAGcCAAAFD19tYXhQcmljZVNwcmVhZAYJAGcCAAAFD19tYXhPcmFjbGVEZWxheQYJAQtpbml0aWFsaXplZAAGCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAh1JbnZhbGlkIGluaXRpYWxpemUgcGFyYW1ldGVycwkAzggCCQDOCAIJAQl1cGRhdGVBbW0DBQdfcXRBc3RSBQdfYnNBc3RSAAAJAQ51cGRhdGVTZXR0aW5ncwMFD19tYXhQcmljZUltcGFjdAUPX21heFByaWNlU3ByZWFkBQ9fbWF4T3JhY2xlRGVsYXkJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtfaW5pdGlhbGl6ZWQGCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtfYmFzZU9yYWNsZQUPX2Jhc2VPcmFjbGVEYXRhCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzCQClCAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDF9jb29yZGluYXRvcgUDbmlsAWkBCnN3YXBUb0Jhc2UCB19hbW91bnQTX21pbkJhc2VBc3NldEFtb3VudAQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBBBlbnN1cmVDYWxsZWRPbmNlCQD8BwQFBHRoaXMCEGVuc3VyZUNhbGxlZE9uY2UFA25pbAUDbmlsAwkAAAIFEGVuc3VyZUNhbGxlZE9uY2UFEGVuc3VyZUNhbGxlZE9uY2UDAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQABgkBAiE9AggFAWkGY2FsbGVyCQELc3BvdEFkZHJlc3MACQACAQIdSW52YWxpZCBzd2FwVG9CYXNlIHBhcmFtZXRlcnMEDSR0MDE4MDM5MTgxOTYJAQlzd2FwSW5wdXQCBgUHX2Ftb3VudAQVYW1vdW50QmFzZUFzc2V0Qm91Z2h0CAUNJHQwMTgwMzkxODE5NgJfMQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDE4MDM5MTgxOTYCXzIEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDE4MDM5MTgxOTYCXzMEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDAxODAzOTE4MTk2Al80BAZ1cGRhdGUJAQl1cGRhdGVBbW0DBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAJQKAgUGdXBkYXRlBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc3dhcFRvUXVvdGUCB19hbW91bnQUX21pblF1b3RlQXNzZXRBbW91bnQEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQQZW5zdXJlQ2FsbGVkT25jZQkA/AcEBQR0aGlzAhBlbnN1cmVDYWxsZWRPbmNlBQNuaWwFA25pbAMJAAACBRBlbnN1cmVDYWxsZWRPbmNlBRBlbnN1cmVDYWxsZWRPbmNlAwMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAYJAQIhPQIIBQFpBmNhbGxlcgkBC3Nwb3RBZGRyZXNzAAkAAgECHkludmFsaWQgc3dhcFRvUXVvdGUgcGFyYW1ldGVycwQNJHQwMTg3NDExODg5OQkBCnN3YXBPdXRwdXQDBgUHX2Ftb3VudAYEFmFtb3VudFF1b3RlQXNzZXRCb3VnaHQIBQ0kdDAxODc0MTE4ODk5Al8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMTg3NDExODg5OQJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMTg3NDExODg5OQJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcgkAZQIJARF0b3RhbFBvc2l0aW9uU2l6ZQAFB19hbW91bnQEBnVwZGF0ZQkBCXVwZGF0ZUFtbQMFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgkAlAoCBQZ1cGRhdGUFFmFtb3VudFF1b3RlQXNzZXRCb3VnaHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQAEB19xdEFzdFIJAQZxdEFzdFIABAdfYnNBc3RSCQEGYnNBc3RSAAQNJHQwMTk1NDUxOTY2MQkBFGdldFN5bmNUZXJtaW5hbFByaWNlAwkBDmdldE9yYWNsZVByaWNlAAUHX3F0QXN0UgUHX2JzQXN0UgQTbmV3UXVvdGVBc3NldFdlaWdodAgFDSR0MDE5NTQ1MTk2NjECXzEEEm5ld0Jhc2VBc3NldFdlaWdodAgFDSR0MDE5NTQ1MTk2NjECXzIJARB1cGRhdGVBbW1XZWlnaHRzAgUTbmV3UXVvdGVBc3NldFdlaWdodAUSbmV3QmFzZUFzc2V0V2VpZ2h0AWkBEGVuc3VyZUNhbGxlZE9uY2UAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIiSW52YWxpZCBzYXZlQ3VycmVudFR4SWQgcGFyYW1ldGVycwQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAZsYXN0VHgJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUIa19sYXN0VHgCAAMJAQIhPQIFBmxhc3RUeAUEdHhJZAkAzAgCCQELU3RyaW5nRW50cnkCBQhrX2xhc3RUeAUEdHhJZAUDbmlsCQACAQIpQ2FuIG5vdCBjYWxsIHZBTU0gbWV0aG9kcyB0d2ljZSBpbiBvbmUgdHgBaQEYdmlld19nZXRUZXJtaW5hbEFtbVByaWNlAAQNJHQwMjA0MTUyMDQ5NgkBE2dldFRlcm1pbmFsQW1tU3RhdGUABBl0ZXJtaW5hbFF1b3RlQXNzZXRSZXNlcnZlCAUNJHQwMjA0MTUyMDQ5NgJfMQQYdGVybWluYWxCYXNlQXNzZXRSZXNlcnZlCAUNJHQwMjA0MTUyMDQ5NgJfMgQFcHJpY2UJAQRkaXZkAgkBBG11bGQCBRl0ZXJtaW5hbFF1b3RlQXNzZXRSZXNlcnZlCQEGcXRBc3RXAAkBBG11bGQCBRh0ZXJtaW5hbEJhc2VBc3NldFJlc2VydmUJAQZic0FzdFcACQACAQkApAMBBQVwcmljZQFpAQ52aWV3X2dldFByaWNlcwAEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQNJHQwMjA4MTYyMDg5NwkBE2dldFRlcm1pbmFsQW1tU3RhdGUABBl0ZXJtaW5hbFF1b3RlQXNzZXRSZXNlcnZlCAUNJHQwMjA4MTYyMDg5NwJfMQQYdGVybWluYWxCYXNlQXNzZXRSZXNlcnZlCAUNJHQwMjA4MTYyMDg5NwJfMgQNdGVybWluYWxQcmljZQkBBGRpdmQCCQEEbXVsZAIFGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUJAQZxdEFzdFcACQEEbXVsZAIFGHRlcm1pbmFsQmFzZUFzc2V0UmVzZXJ2ZQkBBmJzQXN0VwAECXNwb3RQcmljZQkBDGdldFNwb3RQcmljZQAJAAIBCQCsAgIJAKwCAgkApAMBBQ10ZXJtaW5hbFByaWNlAgEsCQCkAwEFCXNwb3RQcmljZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjb21wdXRlU3BvdFByaWNlAAQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBAZyZXN1bHQJAQxnZXRTcG90UHJpY2UACQCUCgIFA25pbAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF2NvbXB1dGVUZXJtaW5hbEFtbVByaWNlAAQNJHQwMjE2NDgyMTcyOQkBE2dldFRlcm1pbmFsQW1tU3RhdGUABBl0ZXJtaW5hbFF1b3RlQXNzZXRSZXNlcnZlCAUNJHQwMjE2NDgyMTcyOQJfMQQYdGVybWluYWxCYXNlQXNzZXRSZXNlcnZlCAUNJHQwMjE2NDgyMTcyOQJfMgQFcHJpY2UJAQRkaXZkAgkBBG11bGQCBRl0ZXJtaW5hbFF1b3RlQXNzZXRSZXNlcnZlCQEGcXRBc3RXAAkBBG11bGQCBRh0ZXJtaW5hbEJhc2VBc3NldFJlc2VydmUJAQZic0FzdFcACQCUCgIFA25pbAUFcHJpY2UBAnR4AQZ2ZXJpZnkABA5jb29yZGluYXRvclN0cgkAnQgCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwMJAQlpc0RlZmluZWQBBQ5jb29yZGluYXRvclN0cgQFYWRtaW4JAJ0IAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUOY29vcmRpbmF0b3JTdHIFD2tfYWRtaW5fYWRkcmVzcwMJAQlpc0RlZmluZWQBBQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQVhZG1pbgkArAICCQCsAgIJAKwCAgIHc3RhdHVzXwkApQgBBQR0aGlzAgFfCQDYBAEIBQJ0eAJpZAcJAAIBAi51bmFibGUgdG8gdmVyaWZ5OiBhZG1pbiBub3Qgc2V0IGluIGNvb3JkaW5hdG9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5y7flPw==", "height": 3761217, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Am6dAjDRjf5sHBqDZnTbmVkfPXcRVCzWbzCD7qA5c7qo Next: FVxuHoVry7CwQDg92srBKvhCviK6wLZjWe4X6XpbAG3z Diff:
OldNewDifferences
485485
486486
487487 @Callable(i)
488+func view_getPrices () = {
489+ let sync = invoke(this, "syncTerminalPriceToOracle", nil, nil)
490+ if ((sync == sync))
491+ then {
492+ let $t02081620897 = getTerminalAmmState()
493+ let terminalQuoteAssetReserve = $t02081620897._1
494+ let terminalBaseAssetReserve = $t02081620897._2
495+ let terminalPrice = divd(muld(terminalQuoteAssetReserve, qtAstW()), muld(terminalBaseAssetReserve, bsAstW()))
496+ let spotPrice = getSpotPrice()
497+ throw(((toString(terminalPrice) + ",") + toString(spotPrice)))
498+ }
499+ else throw("Strict value is not equal to itself.")
500+ }
501+
502+
503+
504+@Callable(i)
488505 func computeSpotPrice () = {
489506 let sync = invoke(this, "syncTerminalPriceToOracle", nil, nil)
490507 if ((sync == sync))
499516
500517 @Callable(i)
501518 func computeTerminalAmmPrice () = {
502- let $t02116921250 = getTerminalAmmState()
503- let terminalQuoteAssetReserve = $t02116921250._1
504- let terminalBaseAssetReserve = $t02116921250._2
519+ let $t02164821729 = getTerminalAmmState()
520+ let terminalQuoteAssetReserve = $t02164821729._1
521+ let terminalBaseAssetReserve = $t02164821729._2
505522 let price = divd(muld(terminalQuoteAssetReserve, qtAstW()), muld(terminalBaseAssetReserve, bsAstW()))
506523 $Tuple2(nil, price)
507524 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_baseOracle = "k_baseOracle"
55
66 let k_initialized = "k_initialized"
77
88 let k_paused = "k_paused"
99
1010 let k_fee = "k_fee"
1111
1212 let k_maxPriceImpact = "k_maxPriceImpact"
1313
1414 let k_maxPriceSpread = "k_maxPriceSpread"
1515
1616 let k_maxOracleDelay = "k_maxOracleDelay"
1717
1818 let k_quoteAssetReserve = "k_qtAstR"
1919
2020 let k_baseAssetReserve = "k_bsAstR"
2121
2222 let k_quoteAssetWeight = "k_qtAstW"
2323
2424 let k_baseAssetWeight = "k_bsAstW"
2525
2626 let k_totalPositionSize = "k_totalPositionSize"
2727
2828 let k_lastTx = "k_lastTx"
2929
3030 let k_coordinatorAddress = "k_coordinatorAddress"
3131
3232 let k_vault_address = "k_vault_address"
3333
3434 let k_admin_address = "k_admin_address"
3535
3636 let k_quote_asset = "k_quote_asset"
3737
3838 let k_spot_address = "k_spot_address"
3939
4040 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
4141
4242
4343 func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
4444
4545
4646 func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address))
4747
4848
4949 func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
5050
5151
5252 func spotAddress () = addressFromString(valueOrErrorMessage(getString(coordinator(), k_spot_address), "Spot address not set"))
5353
5454
5555 let DECIMAL_NUMBERS = 6
5656
5757 let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
5858
5959 func s (_x) = (toString(_x) + ",")
6060
6161
6262 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
6363
6464
6565 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
6666
6767
6868 func bdivd (_x,_y) = fraction(_x, toBigInt(DECIMAL_UNIT), _y, HALFEVEN)
6969
7070
7171 func bmuld (_x,_y) = fraction(_x, _y, toBigInt(DECIMAL_UNIT), HALFEVEN)
7272
7373
7474 func abs (_x) = if ((_x > 0))
7575 then _x
7676 else -(_x)
7777
7878
7979 func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
8080
8181
8282 func intOr (k,def) = valueOrElse(getInteger(this, k), def)
8383
8484
8585 func intA (_address,_key) = {
8686 let val = valueOrErrorMessage(getInteger(_address, _key), ("No value for key " + _key))
8787 val
8888 }
8989
9090
9191 func fee () = int(k_fee)
9292
9393
9494 func qtAstR () = int(k_quoteAssetReserve)
9595
9696
9797 func bsAstR () = int(k_baseAssetReserve)
9898
9999
100100 func qtAstW () = intOr(k_quoteAssetWeight, DECIMAL_UNIT)
101101
102102
103103 func bsAstW () = intOr(k_baseAssetWeight, DECIMAL_UNIT)
104104
105105
106106 func totalPositionSize () = int(k_totalPositionSize)
107107
108108
109109 func maxPriceImpact () = int(k_maxPriceImpact)
110110
111111
112112 func maxPriceSpread () = int(k_maxPriceSpread)
113113
114114
115115 func maxOracleDelay () = int(k_maxOracleDelay)
116116
117117
118118 func lastTimestamp () = lastBlock.timestamp
119119
120120
121121 func getOracleData (key) = {
122122 let oracleDataStr = getString(this, key)
123123 if (if (isDefined(oracleDataStr))
124124 then (value(oracleDataStr) != "")
125125 else false)
126126 then {
127127 let oracleData = split(value(oracleDataStr), ",")
128128 let oracleAddress = valueOrErrorMessage(addressFromString(oracleData[0]), ("Invalid oracle address in: " + value(oracleDataStr)))
129129 let priceKey = oracleData[1]
130130 let blockKey = oracleData[2]
131131 let openKey = oracleData[3]
132132 $Tuple4(oracleAddress, priceKey, blockKey, openKey)
133133 }
134134 else unit
135135 }
136136
137137
138138 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
139139
140140
141141 func paused () = valueOrElse(getBoolean(this, k_paused), false)
142142
143143
144144 func updateReserve (_isAdd,_quoteAssetAmount,_baseAssetAmount) = if (_isAdd)
145145 then {
146146 let newBase = (bsAstR() - _baseAssetAmount)
147147 if ((0 >= newBase))
148148 then throw("Tx lead to base asset reserve <= 0, revert")
149149 else $Tuple3((qtAstR() + _quoteAssetAmount), newBase, (totalPositionSize() + _baseAssetAmount))
150150 }
151151 else {
152152 let newQuote = (qtAstR() - _quoteAssetAmount)
153153 if ((0 >= newQuote))
154154 then throw("Tx lead to base quote reserve <= 0, revert")
155155 else $Tuple3(newQuote, (bsAstR() + _baseAssetAmount), (totalPositionSize() - _baseAssetAmount))
156156 }
157157
158158
159159 func calcInvariant (_qtAstR,_bsAstR) = {
160160 let bqtAstR = toBigInt(_qtAstR)
161161 let bbsAstR = toBigInt(_bsAstR)
162162 bmuld(bqtAstR, bbsAstR)
163163 }
164164
165165
166166 func swapInput (_isAdd,_quoteAssetAmount) = {
167167 let _qtAstR = qtAstR()
168168 let _bsAstR = bsAstR()
169169 let _qtAstW = qtAstW()
170170 let _bsAstW = bsAstW()
171171 let quoteAssetAmountAdjusted = divd(_quoteAssetAmount, _qtAstW)
172172 let k = calcInvariant(_qtAstR, _bsAstR)
173173 let quoteAssetReserveAfter = if (_isAdd)
174174 then (_qtAstR + quoteAssetAmountAdjusted)
175175 else (_qtAstR - quoteAssetAmountAdjusted)
176176 let baseAssetReserveAfter = toInt(bdivd(k, toBigInt(quoteAssetReserveAfter)))
177177 let amountBaseAssetBoughtAbs = abs((baseAssetReserveAfter - _bsAstR))
178178 let amountBaseAssetBought = if (_isAdd)
179179 then amountBaseAssetBoughtAbs
180180 else -(amountBaseAssetBoughtAbs)
181181 let $t064036573 = updateReserve(_isAdd, quoteAssetAmountAdjusted, amountBaseAssetBoughtAbs)
182182 let quoteAssetReserveAfter1 = $t064036573._1
183183 let baseAssetReserveAfter1 = $t064036573._2
184184 let totalPositionSizeAfter1 = $t064036573._3
185185 let priceBefore = divd(muld(_qtAstR, _qtAstW), muld(_bsAstR, _bsAstW))
186186 let marketPrice = divd(_quoteAssetAmount, amountBaseAssetBoughtAbs)
187187 let priceDiff = abs((priceBefore - marketPrice))
188188 let priceImpact = (DECIMAL_UNIT - divd(priceBefore, (priceBefore + priceDiff)))
189189 let maxPriceImpactValue = maxPriceImpact()
190190 if ((priceImpact > maxPriceImpactValue))
191191 then throw(((((((((((((("Price impact " + toString(priceImpact)) + " > max price impact ") + toString(maxPriceImpactValue)) + " before quote asset: ") + toString(_qtAstR)) + " before base asset: ") + toString(_bsAstR)) + " quote asset amount to exchange: ") + toString(_quoteAssetAmount)) + " price before: ") + toString(priceBefore)) + " marketPrice: ") + toString(marketPrice)))
192192 else $Tuple4(amountBaseAssetBought, quoteAssetReserveAfter1, baseAssetReserveAfter1, totalPositionSizeAfter1)
193193 }
194194
195195
196196 func swapOutputWithReserves (_isAdd,_baseAssetAmount,_checkMaxPriceImpact,_quoteAssetReserve,_quoteAssetWeight,_baseAssetReserve,_baseAssetWeight) = {
197197 let priceBefore = divd(muld(_quoteAssetReserve, _quoteAssetWeight), muld(_baseAssetReserve, _baseAssetWeight))
198198 if ((_baseAssetAmount == 0))
199199 then throw("Invalid base asset amount")
200200 else {
201201 let k = calcInvariant(_quoteAssetReserve, _baseAssetReserve)
202202 let baseAssetPoolAmountAfter = if (_isAdd)
203203 then (_baseAssetReserve + _baseAssetAmount)
204204 else (_baseAssetReserve - _baseAssetAmount)
205205 let quoteAssetAfter = toInt(bdivd(k, toBigInt(baseAssetPoolAmountAfter)))
206206 let quoteAssetDelta = abs((quoteAssetAfter - _quoteAssetReserve))
207207 let quoteAssetSold = muld(quoteAssetDelta, _quoteAssetWeight)
208208 let maxPriceImpactValue = maxPriceImpact()
209209 let $t086888850 = updateReserve(!(_isAdd), quoteAssetDelta, _baseAssetAmount)
210210 let quoteAssetReserveAfter1 = $t086888850._1
211211 let baseAssetReserveAfter1 = $t086888850._2
212212 let totalPositionSizeAfter1 = $t086888850._3
213213 let marketPrice = divd(quoteAssetSold, _baseAssetAmount)
214214 let priceDiff = abs((priceBefore - marketPrice))
215215 let priceImpact = (DECIMAL_UNIT - divd(priceBefore, (priceBefore + priceDiff)))
216216 if (if ((priceImpact > maxPriceImpactValue))
217217 then _checkMaxPriceImpact
218218 else false)
219219 then throw(((((((((((((("Price impact " + toString(priceImpact)) + " > max price impact ") + toString(maxPriceImpactValue)) + " before quote asset: ") + toString(_quoteAssetReserve)) + " before base asset: ") + toString(_baseAssetReserve)) + " base asset amount to exchange: ") + toString(_baseAssetAmount)) + " price before: ") + toString(priceBefore)) + " market price: ") + toString(marketPrice)))
220220 else $Tuple5(quoteAssetSold, quoteAssetReserveAfter1, baseAssetReserveAfter1, totalPositionSizeAfter1, priceImpact)
221221 }
222222 }
223223
224224
225225 func swapOutput (_isAdd,_baseAssetAmount,_checkMaxPriceImpact) = swapOutputWithReserves(_isAdd, _baseAssetAmount, _checkMaxPriceImpact, qtAstR(), qtAstW(), bsAstR(), bsAstW())
226226
227227
228228 func getOraclePriceValue (oracle,priceKey,blockKey) = {
229229 let lastValue = valueOrErrorMessage(getInteger(oracle, priceKey), ((("Can not get oracle price. Oracle: " + toString(oracle)) + " key: ") + priceKey))
230230 if ((blockKey != ""))
231231 then {
232232 let currentBlock = lastBlock.height
233233 let lastOracleBlock = valueOrErrorMessage(getInteger(oracle, blockKey), ((("Can not get oracle block. Oracle: " + toString(oracle)) + " key: ") + blockKey))
234234 if (((currentBlock - lastOracleBlock) > maxOracleDelay()))
235235 then throw(((("Oracle stale data. Last oracle block: " + toString(lastOracleBlock)) + " current block: ") + toString(currentBlock)))
236236 else lastValue
237237 }
238238 else lastValue
239239 }
240240
241241
242242 func getOraclePrice () = {
243243 let baseOracle = valueOrErrorMessage(getOracleData(k_baseOracle), "No base asset oracle data")
244244 let baseOraclePrice = getOraclePriceValue(baseOracle._1, baseOracle._2, baseOracle._3)
245245 let quoteOraclePrice = DECIMAL_UNIT
246246 divd(baseOraclePrice, quoteOraclePrice)
247247 }
248248
249249
250250 func getSpotPrice () = {
251251 let _quoteAssetReserve = qtAstR()
252252 let _baseAssetReserve = bsAstR()
253253 let _qtAstW = qtAstW()
254254 let _bsAstW = bsAstW()
255255 divd(muld(_quoteAssetReserve, _qtAstW), muld(_baseAssetReserve, _bsAstW))
256256 }
257257
258258
259259 func getTerminalAmmState () = {
260260 let _positionSize = totalPositionSize()
261261 if ((_positionSize == 0))
262262 then $Tuple2(qtAstR(), bsAstR())
263263 else {
264264 let direction = (_positionSize > 0)
265265 let $t01179811977 = swapOutput(direction, abs(_positionSize), false)
266266 let currentNetMarketValue = $t01179811977._1
267267 let terminalQuoteAssetReserve = $t01179811977._2
268268 let terminalBaseAssetReserve = $t01179811977._3
269269 $Tuple2(terminalQuoteAssetReserve, terminalBaseAssetReserve)
270270 }
271271 }
272272
273273
274274 func getQuoteAssetWeight (baseAssetReserve,totalPositionSize,quoteAssetReserve,targetPrice) = {
275275 let b = toBigInt(baseAssetReserve)
276276 let sz = toBigInt(totalPositionSize)
277277 let q = toBigInt(quoteAssetReserve)
278278 let p = toBigInt(targetPrice)
279279 let k = bmuld(q, b)
280280 let newB = (b + sz)
281281 let newQ = bdivd(k, newB)
282282 let z = bdivd(newQ, newB)
283283 let result = bdivd(p, z)
284284 toInt(result)
285285 }
286286
287287
288288 func getSyncTerminalPrice (_terminalPrice,_qtAstR,_bsAstR) = {
289289 let _positionSize = totalPositionSize()
290290 if ((_positionSize == 0))
291291 then {
292292 let newQtAstW = divd(muld(_terminalPrice, _bsAstR), _qtAstR)
293293 $Tuple2(newQtAstW, DECIMAL_UNIT)
294294 }
295295 else {
296296 let newQtAstW = getQuoteAssetWeight(_bsAstR, _positionSize, _qtAstR, _terminalPrice)
297297 let newBsAstW = DECIMAL_UNIT
298298 $Tuple2(newQtAstW, newBsAstW)
299299 }
300300 }
301301
302302
303303 func updateSettings (_maxPriceImpact,_maxPriceSpread,_maxOracleDelay) = [IntegerEntry(k_maxPriceImpact, _maxPriceImpact), IntegerEntry(k_maxPriceSpread, _maxPriceSpread), IntegerEntry(k_maxOracleDelay, _maxOracleDelay)]
304304
305305
306306 func updateAmmReserves (_qtAstR,_bsAstR) = if (if ((0 >= _qtAstR))
307307 then true
308308 else (0 >= _bsAstR))
309309 then throw("Can not updateAmmReserves: _qtAstR <= 0 || _bsAstR <= 0")
310310 else [IntegerEntry(k_quoteAssetReserve, _qtAstR), IntegerEntry(k_baseAssetReserve, _bsAstR)]
311311
312312
313313 func updateAmmWeights (_qtAstW,_bsAstW) = [IntegerEntry(k_quoteAssetWeight, _qtAstW), IntegerEntry(k_baseAssetWeight, _bsAstW)]
314314
315315
316316 func updateAmm (_qtAstR,_bsAstR,_totalPositionSizeAfter) = {
317317 let _qtAstW = qtAstW()
318318 let _bsAstW = bsAstW()
319319 (updateAmmReserves(_qtAstR, _bsAstR) ++ [IntegerEntry(k_totalPositionSize, _totalPositionSizeAfter)])
320320 }
321321
322322
323323 @Callable(i)
324324 func pause () = if ((i.caller != adminAddress()))
325325 then throw("Invalid pause params")
326326 else [BooleanEntry(k_paused, true)]
327327
328328
329329
330330 @Callable(i)
331331 func unpause () = if ((i.caller != adminAddress()))
332332 then throw("Invalid unpause params")
333333 else [BooleanEntry(k_paused, false)]
334334
335335
336336
337337 @Callable(i)
338338 func changeLiquidity (_quoteAssetAmount) = if (!(if ((i.caller == spotAddress()))
339339 then true
340340 else (i.caller == adminAddress())))
341341 then throw("Invalid changeLiquidity params")
342342 else {
343343 let _qtAstR = qtAstR()
344344 let _bsAstR = bsAstR()
345345 let _qtAstW = qtAstW()
346346 let _bsAstW = bsAstW()
347347 let price = divd(muld(_qtAstR, _qtAstW), muld(_bsAstR, _bsAstW))
348348 let qtAstRAfter = (_qtAstR + _quoteAssetAmount)
349349 let baseAssetAmountToAdd = (divd(muld(qtAstRAfter, _qtAstW), price) - _bsAstR)
350350 let bsAstRAfter = (_bsAstR + baseAssetAmountToAdd)
351351 let $t01536215492 = getSyncTerminalPrice(getOraclePrice(), qtAstRAfter, bsAstRAfter)
352352 let newQuoteAssetWeight = $t01536215492._1
353353 let newBaseAssetWeight = $t01536215492._2
354354 (updateAmmReserves(qtAstRAfter, bsAstRAfter) ++ updateAmmWeights(newQuoteAssetWeight, newBaseAssetWeight))
355355 }
356356
357357
358358
359359 @Callable(i)
360360 func changeSettings (_maxPriceImpact,_maxPriceSpread,_maxOracleDelay) = if (if (if (if (if ((0 >= _maxPriceImpact))
361361 then true
362362 else (0 >= _maxPriceSpread))
363363 then true
364364 else (0 >= _maxOracleDelay))
365365 then true
366366 else !(initialized()))
367367 then true
368368 else (i.caller != adminAddress()))
369369 then throw("Invalid changeSettings params")
370370 else updateSettings(_maxPriceImpact, _maxPriceSpread, _maxOracleDelay)
371371
372372
373373
374374 @Callable(i)
375375 func initialize (_qtAstR,_bsAstR,_baseOracleData,_coordinator,_maxPriceImpact,_maxPriceSpread,_maxOracleDelay) = if (if (if (if (if (if (if ((0 >= _qtAstR))
376376 then true
377377 else (0 >= _bsAstR))
378378 then true
379379 else (0 >= _maxPriceImpact))
380380 then true
381381 else (0 >= _maxPriceSpread))
382382 then true
383383 else (0 >= _maxOracleDelay))
384384 then true
385385 else initialized())
386386 then true
387387 else (i.caller != this))
388388 then throw("Invalid initialize parameters")
389389 else ((updateAmm(_qtAstR, _bsAstR, 0) ++ updateSettings(_maxPriceImpact, _maxPriceSpread, _maxOracleDelay)) ++ [BooleanEntry(k_initialized, true), StringEntry(k_baseOracle, _baseOracleData), StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator)))])
390390
391391
392392
393393 @Callable(i)
394394 func swapToBase (_amount,_minBaseAssetAmount) = {
395395 let sync = invoke(this, "syncTerminalPriceToOracle", nil, nil)
396396 if ((sync == sync))
397397 then {
398398 let ensureCalledOnce = invoke(this, "ensureCalledOnce", nil, nil)
399399 if ((ensureCalledOnce == ensureCalledOnce))
400400 then if (if (if (!(initialized()))
401401 then true
402402 else paused())
403403 then true
404404 else (i.caller != spotAddress()))
405405 then throw("Invalid swapToBase parameters")
406406 else {
407407 let $t01803918196 = swapInput(true, _amount)
408408 let amountBaseAssetBought = $t01803918196._1
409409 let quoteAssetReserveAfter = $t01803918196._2
410410 let baseAssetReserveAfter = $t01803918196._3
411411 let totalPositionSizeAfter = $t01803918196._4
412412 let update = updateAmm(quoteAssetReserveAfter, baseAssetReserveAfter, totalPositionSizeAfter)
413413 $Tuple2(update, amountBaseAssetBought)
414414 }
415415 else throw("Strict value is not equal to itself.")
416416 }
417417 else throw("Strict value is not equal to itself.")
418418 }
419419
420420
421421
422422 @Callable(i)
423423 func swapToQuote (_amount,_minQuoteAssetAmount) = {
424424 let sync = invoke(this, "syncTerminalPriceToOracle", nil, nil)
425425 if ((sync == sync))
426426 then {
427427 let ensureCalledOnce = invoke(this, "ensureCalledOnce", nil, nil)
428428 if ((ensureCalledOnce == ensureCalledOnce))
429429 then if (if (if (!(initialized()))
430430 then true
431431 else paused())
432432 then true
433433 else (i.caller != spotAddress()))
434434 then throw("Invalid swapToQuote parameters")
435435 else {
436436 let $t01874118899 = swapOutput(true, _amount, true)
437437 let amountQuoteAssetBought = $t01874118899._1
438438 let quoteAssetReserveAfter = $t01874118899._2
439439 let baseAssetReserveAfter = $t01874118899._3
440440 let totalPositionSizeAfter = (totalPositionSize() - _amount)
441441 let update = updateAmm(quoteAssetReserveAfter, baseAssetReserveAfter, totalPositionSizeAfter)
442442 $Tuple2(update, amountQuoteAssetBought)
443443 }
444444 else throw("Strict value is not equal to itself.")
445445 }
446446 else throw("Strict value is not equal to itself.")
447447 }
448448
449449
450450
451451 @Callable(i)
452452 func syncTerminalPriceToOracle () = {
453453 let _qtAstR = qtAstR()
454454 let _bsAstR = bsAstR()
455455 let $t01954519661 = getSyncTerminalPrice(getOraclePrice(), _qtAstR, _bsAstR)
456456 let newQuoteAssetWeight = $t01954519661._1
457457 let newBaseAssetWeight = $t01954519661._2
458458 updateAmmWeights(newQuoteAssetWeight, newBaseAssetWeight)
459459 }
460460
461461
462462
463463 @Callable(i)
464464 func ensureCalledOnce () = if ((i.caller != this))
465465 then throw("Invalid saveCurrentTxId parameters")
466466 else {
467467 let txId = toBase58String(i.transactionId)
468468 let lastTx = valueOrElse(getString(this, k_lastTx), "")
469469 if ((lastTx != txId))
470470 then [StringEntry(k_lastTx, txId)]
471471 else throw("Can not call vAMM methods twice in one tx")
472472 }
473473
474474
475475
476476 @Callable(i)
477477 func view_getTerminalAmmPrice () = {
478478 let $t02041520496 = getTerminalAmmState()
479479 let terminalQuoteAssetReserve = $t02041520496._1
480480 let terminalBaseAssetReserve = $t02041520496._2
481481 let price = divd(muld(terminalQuoteAssetReserve, qtAstW()), muld(terminalBaseAssetReserve, bsAstW()))
482482 throw(toString(price))
483483 }
484484
485485
486486
487487 @Callable(i)
488+func view_getPrices () = {
489+ let sync = invoke(this, "syncTerminalPriceToOracle", nil, nil)
490+ if ((sync == sync))
491+ then {
492+ let $t02081620897 = getTerminalAmmState()
493+ let terminalQuoteAssetReserve = $t02081620897._1
494+ let terminalBaseAssetReserve = $t02081620897._2
495+ let terminalPrice = divd(muld(terminalQuoteAssetReserve, qtAstW()), muld(terminalBaseAssetReserve, bsAstW()))
496+ let spotPrice = getSpotPrice()
497+ throw(((toString(terminalPrice) + ",") + toString(spotPrice)))
498+ }
499+ else throw("Strict value is not equal to itself.")
500+ }
501+
502+
503+
504+@Callable(i)
488505 func computeSpotPrice () = {
489506 let sync = invoke(this, "syncTerminalPriceToOracle", nil, nil)
490507 if ((sync == sync))
491508 then {
492509 let result = getSpotPrice()
493510 $Tuple2(nil, result)
494511 }
495512 else throw("Strict value is not equal to itself.")
496513 }
497514
498515
499516
500517 @Callable(i)
501518 func computeTerminalAmmPrice () = {
502- let $t02116921250 = getTerminalAmmState()
503- let terminalQuoteAssetReserve = $t02116921250._1
504- let terminalBaseAssetReserve = $t02116921250._2
519+ let $t02164821729 = getTerminalAmmState()
520+ let terminalQuoteAssetReserve = $t02164821729._1
521+ let terminalBaseAssetReserve = $t02164821729._2
505522 let price = divd(muld(terminalQuoteAssetReserve, qtAstW()), muld(terminalBaseAssetReserve, bsAstW()))
506523 $Tuple2(nil, price)
507524 }
508525
509526
510527 @Verifier(tx)
511528 func verify () = {
512529 let coordinatorStr = getString(this, k_coordinatorAddress)
513530 if (isDefined(coordinatorStr))
514531 then {
515532 let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
516533 if (isDefined(admin))
517534 then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
518535 else throw("unable to verify: admin not set in coordinator")
519536 }
520537 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
521538 }
522539

github/deemru/w8io/873ac7e 
66.58 ms