tx · Giyw1q6hLuPDZLqDt3nMLapgwknauap2V9A5L1719pyK

3NCGjbgqZVk7eaqrLMEnEnqRhozNm1KTG5z:  -0.02100000 Waves

2025.01.26 20:14 [3476337] smart account 3NCGjbgqZVk7eaqrLMEnEnqRhozNm1KTG5z > SELF 0.00000000 Waves

{ "type": 13, "id": "Giyw1q6hLuPDZLqDt3nMLapgwknauap2V9A5L1719pyK", "fee": 2100000, "feeAssetId": null, "timestamp": 1737911672661, "version": 2, "chainId": 84, "sender": "3NCGjbgqZVk7eaqrLMEnEnqRhozNm1KTG5z", "senderPublicKey": "5CoDbXxoqnvJpx9GrS6M4G5GYJXh9rcoiXJz7RYTPVkL", "proofs": [ "2YEDySoFUjJvnZQFSsHdpgkqWE4qKgGq5nS95ZK7jr3vbBArpojnSK9BDtmL9mgQbY8Q3LSb7QctSo5YgTBUaFku" ], "script": "base64:BgIzCAISCgoIAQgEAhEYFBISBQoDCAgIEgASAwoBARIAEgASABIDCgEBEgASAwoBCBIDCgEIPQADTTE2AICAhP6m3uERAA5TVEFLRVJTX0FNT1VOVACAgMHfybe4BAALVEVBTV9BTU9VTlQAgICapuqv4wEADU1BUktFVF9BTU9VTlQAgICc5f2e1AoAD1JFU0VSVkVEX0FNT1VOVACAgI2T9ddxAAtZRUFSX0JMT0NLUwkAaAIA7QIAoAsAE1RFQU1fVkVTVElOR19QRVJJT0QFC1lFQVJfQkxPQ0tTAAxTVEFLRV9QRVJJT0QJAGgCAAUFC1lFQVJfQkxPQ0tTAAtCTEVTU19QUklDRQCA0NvD9AIADUxPVFRFUllfUFJJQ0UAgNDbw/QCABNERUZBVUxUX0ZPTU9fUEVSSU9EADwAD01JTl9GT01PX1BFUklPRAACAAxSQU5ET01fREVMQVkAAgAUQ1VSUkVOVF9KQUNLUE9UX1BFUkMAMgARTkVYVF9KQUNLUE9UX1BFUkMAFAAJVEVBTV9QRVJDAAoADmdvcmNBc3NldElkS2V5Agtnb3JjQXNzZXRJZAALZ29yY0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoQgBBQ5nb3JjQXNzZXRJZEtleQIWR09SQyBpcyBub3QgaXNzdWVkIHlldAAMaXNzdWVUaW1lS2V5Aglpc3N1ZVRpbWUAEXRlYW1BbW91bnRMZWZ0S2V5Ag50ZWFtQW1vdW50TGVmdAAWbGFzdFRlYW1WZXN0aW5nVGltZUtleQITbGFzdFRlYW1WZXN0aW5nVGltZQAVc3Rha2Vyc0Ftb3VudFRvdGFsS2V5AhJzdGFrZXJzQW1vdW50VG90YWwAFHN0YWtlcnNBbW91bnRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAAUc3Rha2VkQW1vdW50VG90YWxLZXkCC3N0YWtlZFRvdGFsARVzdGFrZWRBbW91bnRCeVVzZXJLZXkBBGFkZHIJAKwCAgINc3Rha2VkQW1vdW50XwUEYWRkcgEWbGFzdENsYWltVGltZUJ5VXNlcktleQEEYWRkcgkArAICAg5sYXN0Q2xhaW1UaW1lXwUEYWRkcgAMZm9tb0Vwb2NoS2V5Aglmb21vRXBvY2gAEWN1cnJGb21vUGVyaW9kS2V5Ag5jdXJyRm9tb1BlcmlvZAAPbGFzdEZvbW9UaW1lS2V5AgxsYXN0Rm9tb1RpbWUAEmN1cnJGb21vSmFja3BvdEtleQIPY3VyckZvbW9KYWNrcG90ABJuZXh0Rm9tb0phY2twb3RLZXkCD25leHRGb21vSmFja3BvdAARbGFzdEZvbW9QbGF5ZXJLZXkCDmxhc3RGb21vUGxheWVyABFsYXN0Rm9tb1dpbm5lcktleQIObGFzdEZvbW9XaW5uZXIAF2xhc3RGb21vV2lubmVyQW1vdW50S2V5AhRsYXN0Rm9tb1dpbm5lckFtb3VudAAVbGFzdEZvbW9XaW5uZXJUaW1lS2V5AhJsYXN0Rm9tb1dpbm5lclRpbWUAEXRlYW1XYWxsZXRBZGRyS2V5Ag50ZWFtV2FsbGV0QWRkcgANYnJva2VyQWRkcktleQIKYnJva2VyQWRkcgAOcmVzZXJ2ZUFkZHJLZXkCC3Jlc2VydmVBZGRyAQlrZXlDb21taXQBB2FkZHJlc3MJAKwCAgIPZmluaXNoQmxvY2tGb3JfBQdhZGRyZXNzAQhrZXlHdWVzcwEHYWRkcmVzcwkArAICAglndWVzc0Zvcl8FB2FkZHJlc3MBB2tleVNhbHQBB2FkZHJlc3MJAKwCAgIIc2FsdEZvcl8FB2FkZHJlc3MAFWN1cnJMb3R0ZXJ5SmFja3BvdEtleQISY3VyckxvdHRlcnlKYWNrcG90ABVuZXh0TG90dGVyeUphY2twb3RLZXkCEm5leHRMb3R0ZXJ5SmFja3BvdAAUbGFzdExvdHRlcnlXaW5uZXJLZXkCEWxhc3RMb3R0ZXJ5V2lubmVyABpsYXN0TG90dGVyeVdpbm5lckFtb3VudEtleQIXbGFzdExvdHRlcnlXaW5uZXJBbW91bnQAGGxhc3RMb3R0ZXJ5V2lubmVyVGltZUtleQIVbGFzdExvdHRlcnlXaW5uZXJUaW1lABdmb21vTnVtVW5pcXVlUGxheWVyc0tleQIUZm9tb051bVVuaXF1ZVBsYXllcnMAFWZvbW9Ub3RhbE51bVN0YWtlc0tleQISZm9tb1RvdGFsTnVtU3Rha2VzABhmb21vVG90YWxTdGFrZWRBbW91bnRLZXkCFWZvbW9Ub3RhbFN0YWtlZEFtb3VudAEUZm9tb1VzZXJOdW1TdGFrZXNLZXkBB2FkZHJlc3MJAKwCAgISZm9tb1VzZXJOdW1TdGFrZXNfBQdhZGRyZXNzARdmb21vVXNlclN0YWtlZEFtb3VudEtleQEHYWRkcmVzcwkArAICAhVmb21vVXNlclN0YWtlZEFtb3VudF8FB2FkZHJlc3MBEmZvbW9Vc2VyTnVtV2luc0tleQEHYWRkcmVzcwkArAICAhBmb21vVXNlck51bVdpbnNfBQdhZGRyZXNzARRmb21vVXNlcldvbkFtb3VudEtleQEHYWRkcmVzcwkArAICAhJmb21vVXNlcldvbkFtb3VudF8FB2FkZHJlc3MAGWZvbW9GYXZvcml0ZUJ5TnVtR2FtZXNLZXkCFmZvbW9GYXZvcml0ZUJ5TnVtR2FtZXMAF2ZvbW9GYXZvcml0ZUJ5QW1vdW50S2V5AhRmb21vRmF2b3JpdGVCeUFtb3VudAEJZ29yY1N0YXRzAQt1c2VyQWRkck9wdAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUMaXNzdWVUaW1lS2V5AhZHT1JDIGlzIG5vdCBpc3N1ZWQgeWV0BBFub3dMaW1pdGVkVmVzdGluZwkAlwMBCQDMCAIFBmhlaWdodAkAzAgCCQBkAgUJaXNzdWVUaW1lBRNURUFNX1ZFU1RJTkdfUEVSSU9EBQNuaWwEE2xhc3RUZWFtVmVzdGluZ1RpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRZsYXN0VGVhbVZlc3RpbmdUaW1lS2V5Ah1Db25zdHJ1Y3RvciBpcyBub3QgY2FsbGVkIHlldAQNdmVzdGluZ0Ftb3VudAkAawMFC1RFQU1fQU1PVU5UCQBlAgURbm93TGltaXRlZFZlc3RpbmcFE2xhc3RUZWFtVmVzdGluZ1RpbWUFE1RFQU1fVkVTVElOR19QRVJJT0QEDnRlYW1BbW91bnRMZWZ0CQBlAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRF0ZWFtQW1vdW50TGVmdEtleQAABQ12ZXN0aW5nQW1vdW50BA9hbW91bnRMZWZ0VG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUc3Rha2Vyc0Ftb3VudExlZnRLZXkAAAQMbGFzdFVzZXJUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEJARZsYXN0Q2xhaW1UaW1lQnlVc2VyS2V5AQULdXNlckFkZHJPcHQA////////////AQMJAGYCAAAFDGxhc3RVc2VyVGltZQkAlgoEAAAFD2Ftb3VudExlZnRUb3RhbAUNdmVzdGluZ0Ftb3VudAUOdGVhbUFtb3VudExlZnQEEW5vd0xpbWl0ZWRTdGFraW5nCQCXAwEJAMwIAgUGaGVpZ2h0CQDMCAIJAGQCBQlpc3N1ZVRpbWUFDFNUQUtFX1BFUklPRAUDbmlsBAp1c2VyU2hhcmVzCQELdmFsdWVPckVsc2UCCQCfCAEJARVzdGFrZWRBbW91bnRCeVVzZXJLZXkBBQt1c2VyQWRkck9wdAAABAt0b3RhbFNoYXJlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRzdGFrZWRBbW91bnRUb3RhbEtleQAABBJzdGFrZXJzQW1vdW50VG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVc3Rha2Vyc0Ftb3VudFRvdGFsS2V5BQ5TVEFLRVJTX0FNT1VOVAQMdXNlclRlbXBvcmFsCQBrAwUSc3Rha2Vyc0Ftb3VudFRvdGFsCQBlAgURbm93TGltaXRlZFN0YWtpbmcFDGxhc3RVc2VyVGltZQUMU1RBS0VfUEVSSU9EBAp1c2VyQW1vdW50AwkBAiE9AgULdG90YWxTaGFyZXMAAAkAawMFDHVzZXJUZW1wb3JhbAUKdXNlclNoYXJlcwULdG90YWxTaGFyZXMAAAkAlgoEBQp1c2VyQW1vdW50CQBlAgUPYW1vdW50TGVmdFRvdGFsBQp1c2VyQW1vdW50BQ12ZXN0aW5nQW1vdW50BQ50ZWFtQW1vdW50TGVmdAEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQBDWdldE5ld0xlYWRlcnMDDW9sZExlYWRlcnNTdHIHbmV3QWRkcgluZXdBbW91bnQEDG5ld0NhbmRpZGF0ZQkArAICCQCsAgIFB25ld0FkZHICAV8JAKQDAQUJbmV3QW1vdW50AwkAAAIFDW9sZExlYWRlcnNTdHICAAkAzAgCBQxuZXdDYW5kaWRhdGUFA25pbAoBDHNvcnRCeUFtb3VudAIDYWNjAmVsBAthZGRyX2Ftb3VudAkAtQkCBQJlbAIBXwQEYWRkcgkAkQMCBQthZGRyX2Ftb3VudAAABAZhbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQthZGRyX2Ftb3VudAABAwgFA2FjYwJfMgMJAAACBQRhZGRyBQduZXdBZGRyBQNhY2MJAJQKAgkAzQgCCAUDYWNjAl8xBQJlbAYDCQAAAgUEYWRkcgUHbmV3QWRkcgkAlAoCCQDNCAIIBQNhY2MCXzEFDG5ld0NhbmRpZGF0ZQYDCQBmAgUGYW1vdW50BQluZXdBbW91bnQJAJQKAgkAzQgCCAUDYWNjAl8xBQJlbAcJAJQKAgkAzQgCCQDNCAIIBQNhY2MCXzEFDG5ld0NhbmRpZGF0ZQUCZWwGBAZyZXN1bHQKAAIkbAkAtQkCBQ1vbGRMZWFkZXJzU3RyAgE6CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxzb3J0QnlBbW91bnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMEA2FycggFBnJlc3VsdAJfMQMIBQZyZXN1bHQCXzIDCQBmAgkAkAMBBQNhcnIAAwkAzAgCCQCRAwIFA2FycgAACQDMCAIJAJEDAgUDYXJyAAEJAMwIAgkAkQMCBQNhcnIAAgUDbmlsBQNhcnIDCQBnAgkAkAMBBQNhcnIAAwUDYXJyCQDNCAIFA2FycgUMbmV3Q2FuZGlkYXRlAQxmb21vSW50ZXJuYWwBAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC2dvcmNBc3NldElkCQACAQITR09SQyBwYXltZW50cyBvbmx5IQQGY2hhbmdlCQBlAgUDYW10BQtCTEVTU19QUklDRQMJAGYCAAAFBmNoYW5nZQkAAgEJAKwCAgkArAICCQCsAgICFllvdSBuZWVkIHRvIHNhY3JpZmljZSAJAQpmaXhlZFBvaW50AgULQkxFU1NfUFJJQ0UACAIWIEdPUkMsIGJ1dCBJIHNlZSBvbmx5IAkBCmZpeGVkUG9pbnQCBQNhbXQACAQNY2hhbmdlQWN0aW9ucwMJAGYCBQZjaGFuZ2UAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmNoYW5nZQULZ29yY0Fzc2V0SWQFA25pbAUDbmlsBAxsYXN0Rm9tb1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPbGFzdEZvbW9UaW1lS2V5AAAEDmxhc3RGb21vUGxheWVyCQELdmFsdWVPckVsc2UCCQCiCAEFEWxhc3RGb21vUGxheWVyS2V5AgAEEmxhc3RGb21vTnVtV2luc0tleQkBEmZvbW9Vc2VyTnVtV2luc0tleQEFDmxhc3RGb21vUGxheWVyBBRsYXN0Rm9tb1dvbkFtb3VudEtleQkBFGZvbW9Vc2VyV29uQW1vdW50S2V5AQUObGFzdEZvbW9QbGF5ZXIED2xhc3RGb21vTnVtV2lucwkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJsYXN0Rm9tb051bVdpbnNLZXkAAAQRbGFzdEZvbW9Xb25BbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUbGFzdEZvbW9Xb25BbW91bnRLZXkAAAQQZGVsdGFDdXJySmFja3BvdAkAawMFC0JMRVNTX1BSSUNFBRRDVVJSRU5UX0pBQ0tQT1RfUEVSQwBkBBBkZWx0YU5leHRKYWNrcG90CQBrAwULQkxFU1NfUFJJQ0UFEU5FWFRfSkFDS1BPVF9QRVJDAGQED2RlbHRhVGVhbUFtb3VudAkAawMFC0JMRVNTX1BSSUNFBQlURUFNX1BFUkMAZAQSZGVsdGFTdGFrZXJzQW1vdW50CQBlAgkAZQIJAGUCBQtCTEVTU19QUklDRQUQZGVsdGFDdXJySmFja3BvdAUQZGVsdGFOZXh0SmFja3BvdAUPZGVsdGFUZWFtQW1vdW50BAlmb21vRXBvY2gJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUMZm9tb0Vwb2NoS2V5AAAEDmN1cnJGb21vUGVyaW9kCQELdmFsdWVPckVsc2UCCQCfCAEFEWN1cnJGb21vUGVyaW9kS2V5BRNERUZBVUxUX0ZPTU9fUEVSSU9EBA5uZXh0Rm9tb1BlcmlvZAkAlgMBCQDMCAIFD01JTl9GT01PX1BFUklPRAkAzAgCCQBlAgUOY3VyckZvbW9QZXJpb2QAAQUDbmlsBA9mb21vQ3VyckphY2twb3QJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSY3VyckZvbW9KYWNrcG90S2V5AAAED2ZvbW9OZXh0SmFja3BvdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJuZXh0Rm9tb0phY2twb3RLZXkAAAQPb2xkTGVhZGVyc0J5TnVtCQELdmFsdWVPckVsc2UCCQCiCAEFGWZvbW9GYXZvcml0ZUJ5TnVtR2FtZXNLZXkCAAQSb2xkTGVhZGVyc0J5QW1vdW50CQELdmFsdWVPckVsc2UCCQCiCAEFF2ZvbW9GYXZvcml0ZUJ5QW1vdW50S2V5AgAEC2ZvbW9BY3Rpb25zAwMDCQBmAgUGaGVpZ2h0CQBkAgUMbGFzdEZvbW9UaW1lBQ5jdXJyRm9tb1BlcmlvZAkAZgIFD2ZvbW9DdXJySmFja3BvdAAABwkBAiE9AgUObGFzdEZvbW9QbGF5ZXICAAcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUObGFzdEZvbW9QbGF5ZXIFD2ZvbW9DdXJySmFja3BvdAULZ29yY0Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgURbGFzdEZvbW9XaW5uZXJLZXkFDmxhc3RGb21vUGxheWVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRdsYXN0Rm9tb1dpbm5lckFtb3VudEtleQUPZm9tb0N1cnJKYWNrcG90CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVsYXN0Rm9tb1dpbm5lclRpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJjdXJyRm9tb0phY2twb3RLZXkJAGQCBQ9mb21vTmV4dEphY2twb3QFEGRlbHRhQ3VyckphY2twb3QJAMwIAgkBDEludGVnZXJFbnRyeQIFEm5leHRGb21vSmFja3BvdEtleQUQZGVsdGFOZXh0SmFja3BvdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUMZm9tb0Vwb2NoS2V5CQBkAgUJZm9tb0Vwb2NoAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFEWN1cnJGb21vUGVyaW9kS2V5BRNERUZBVUxUX0ZPTU9fUEVSSU9ECQDMCAIJAQtTdHJpbmdFbnRyeQIFGWZvbW9GYXZvcml0ZUJ5TnVtR2FtZXNLZXkJALkJAgkBDWdldE5ld0xlYWRlcnMDBQ9vbGRMZWFkZXJzQnlOdW0FDmxhc3RGb21vUGxheWVyCQBkAgUPbGFzdEZvbW9OdW1XaW5zAAECAToJAMwIAgkBC1N0cmluZ0VudHJ5AgUXZm9tb0Zhdm9yaXRlQnlBbW91bnRLZXkJALkJAgkBDWdldE5ld0xlYWRlcnMDBRJvbGRMZWFkZXJzQnlBbW91bnQFDmxhc3RGb21vUGxheWVyCQBkAgURbGFzdEZvbW9Xb25BbW91bnQFD2ZvbW9DdXJySmFja3BvdAIBOgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSbGFzdEZvbW9OdW1XaW5zS2V5CQBkAgUPbGFzdEZvbW9OdW1XaW5zAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFFGxhc3RGb21vV29uQW1vdW50S2V5CQBkAgURbGFzdEZvbW9Xb25BbW91bnQFD2ZvbW9DdXJySmFja3BvdAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJjdXJyRm9tb0phY2twb3RLZXkJAGQCBQ9mb21vQ3VyckphY2twb3QFEGRlbHRhQ3VyckphY2twb3QJAMwIAgkBDEludGVnZXJFbnRyeQIFEm5leHRGb21vSmFja3BvdEtleQkAZAIFD2ZvbW9OZXh0SmFja3BvdAUQZGVsdGFOZXh0SmFja3BvdAkAzAgCCQEMSW50ZWdlckVudHJ5AgURY3VyckZvbW9QZXJpb2RLZXkFDm5leHRGb21vUGVyaW9kBQNuaWwEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBBRmb21vTnVtVW5pcXVlUGxheWVycwkBC3ZhbHVlT3JFbHNlAgkAnwgBBRdmb21vTnVtVW5pcXVlUGxheWVyc0tleQAABBB1c2VyTnVtU3Rha2VzS2V5CQEUZm9tb1VzZXJOdW1TdGFrZXNLZXkBBQRhZGRyBBN1c2VyU3Rha2VkQW1vdW50S2V5CQEXZm9tb1VzZXJTdGFrZWRBbW91bnRLZXkBBQRhZGRyBA11c2VyTnVtU3Rha2VzCQCfCAEFEHVzZXJOdW1TdGFrZXNLZXkEDHN0YXRzQWN0aW9ucwkAzggCAwkBCWlzRGVmaW5lZAEFDXVzZXJOdW1TdGFrZXMJAMwIAgkBDEludGVnZXJFbnRyeQIFEHVzZXJOdW1TdGFrZXNLZXkJAGQCCQEFdmFsdWUBBQ11c2VyTnVtU3Rha2VzAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFE3VzZXJTdGFrZWRBbW91bnRLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFE3VzZXJTdGFrZWRBbW91bnRLZXkAAAULQkxFU1NfUFJJQ0UFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXZm9tb051bVVuaXF1ZVBsYXllcnNLZXkJAGQCBRRmb21vTnVtVW5pcXVlUGxheWVycwABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRB1c2VyTnVtU3Rha2VzS2V5AAEJAMwIAgkBDEludGVnZXJFbnRyeQIFE3VzZXJTdGFrZWRBbW91bnRLZXkFC0JMRVNTX1BSSUNFBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFFWZvbW9Ub3RhbE51bVN0YWtlc0tleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVZm9tb1RvdGFsTnVtU3Rha2VzS2V5AAAAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUYZm9tb1RvdGFsU3Rha2VkQW1vdW50S2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRhmb21vVG90YWxTdGFrZWRBbW91bnRLZXkAAAULQkxFU1NfUFJJQ0UFA25pbAkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUPbGFzdEZvbW9UaW1lS2V5BQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgURbGFzdEZvbW9QbGF5ZXJLZXkJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFEXRlYW1XYWxsZXRBZGRyS2V5BQ9kZWx0YVRlYW1BbW91bnQFC2dvcmNBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAZAIJARFAZXh0ck5hdGl2ZSgxMDU1KQEFFHN0YWtlcnNBbW91bnRMZWZ0S2V5BRJkZWx0YVN0YWtlcnNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFXN0YWtlcnNBbW91bnRUb3RhbEtleQkAZAIJARFAZXh0ck5hdGl2ZSgxMDU1KQEFFXN0YWtlcnNBbW91bnRUb3RhbEtleQUSZGVsdGFTdGFrZXJzQW1vdW50BQNuaWwFDWNoYW5nZUFjdGlvbnMFC2ZvbW9BY3Rpb25zBQxzdGF0c0FjdGlvbnMBD2dldFJhbmRvbU51bWJlcgMIbWF4VmFsdWUEc2FsdAdlbnRyb3B5AwkAZwIAAAUIbWF4VmFsdWUJAAIBAhZtYXhWYWx1ZSBzaG91bGQgYmUgPiAwBApyYW5kb21IYXNoCQDUFgEJAMsBAgUEc2FsdAUHZW50cm9weQkAagIJALEJAQUKcmFuZG9tSGFzaAUIbWF4VmFsdWUBDndhbGxldEludGVybmFsAQ51c2VyQWRkcmVzc09wdAQEYWRkcgkApggBBQ51c2VyQWRkcmVzc09wdAQHYmFsYW5jZQMJAQlpc0RlZmluZWQBBQRhZGRyCQDvBwEJAQV2YWx1ZQEFBGFkZHIJAQ5CYWxhbmNlRGV0YWlscwQAAAAAAAAAAAQLZ29yY0JhbGFuY2UDCQEJaXNEZWZpbmVkAQUEYWRkcgkA8AcCCQEFdmFsdWUBBQRhZGRyBQtnb3JjQXNzZXRJZAAABApzdGFrZWRHb3JjCQELdmFsdWVPckVsc2UCCQCfCAEJARVzdGFrZWRBbW91bnRCeVVzZXJLZXkBBQ51c2VyQWRkcmVzc09wdAAACQDMCAIJAKwCAgIUJXMlZF9fd2F2ZXNCYWxhbmNlX18JAKQDAQgFB2JhbGFuY2UJYXZhaWxhYmxlCQDMCAIJAKwCAgITJXMlZF9fZ29yY0JhbGFuY2VfXwkApAMBBQtnb3JjQmFsYW5jZQkAzAgCCQCsAgICEiVzJWRfX3N0YWtlZEdvcmNfXwkApAMBBQpzdGFrZWRHb3JjBQNuaWwLAWkBCHRlc3RBcmdzCAZpbnRWYWwGc3RyVmFsB2Jvb2xWYWwGYmluVmFsBmFyckludAZhcnJTdHIHYXJyQm9vbAZhcnJCaW4FA25pbAFpAQ1jb25zdHJ1Y3RvclYxAw50ZWFtV2FsbGV0QWRkcgpicm9rZXJBZGRyC3Jlc2VydmVBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDGlzc3VlZEFtb3VudAUDTTE2BAVpc3N1ZQkAwwgHAgRHT1JDArUBTWVtZSBjb2luIGJ5IEdvZCBvZiBSYW5kb20gQ2hhbmNlLiBWaXNpdCBodHRwczovL2dvcmMubWVtZSwgc2FjcmlmaWNlIHRvIHRoZSBHb2Qgb2YgUmFuZG9tIGFuZCB5b3Ugd2lsbCByZWNlaXZlIGFuIGFuc3dlciB0byBhbnkgcXVlc3Rpb24gb3IgYSBibGVzc2luZy4gTHVja3kgb25lIGdldHMgYSBHaWZ0IG9mIEdvZAUMaXNzdWVkQW1vdW50AAgHBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUFaXNzdWUJAMwIAgUFaXNzdWUJAMwIAgkBC0JpbmFyeUVudHJ5AgUOZ29yY0Fzc2V0SWRLZXkFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDGlzc3VlVGltZUtleQUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQUOU1RBS0VSU19BTU9VTlQJAMwIAgkBDEludGVnZXJFbnRyeQIFFXN0YWtlcnNBbW91bnRUb3RhbEtleQUOU1RBS0VSU19BTU9VTlQJAMwIAgkBDEludGVnZXJFbnRyeQIFEXRlYW1BbW91bnRMZWZ0S2V5BQtURUFNX0FNT1VOVAkAzAgCCQEMSW50ZWdlckVudHJ5AgUWbGFzdFRlYW1WZXN0aW5nVGltZUtleQUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIFEXRlYW1XYWxsZXRBZGRyS2V5BQ50ZWFtV2FsbGV0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ1icm9rZXJBZGRyS2V5BQpicm9rZXJBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDnJlc2VydmVBZGRyS2V5BQtyZXNlcnZlQWRkcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQtyZXNlcnZlQWRkcgUPUkVTRVJWRURfQU1PVU5UBQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCmJyb2tlckFkZHIFDU1BUktFVF9BTU9VTlQFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDGZvbW9FcG9jaEtleQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFjdXJyRm9tb1BlcmlvZEtleQUTREVGQVVMVF9GT01PX1BFUklPRAUDbmlsAWkBCXN0YWtlR29yYwADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC2dvcmNBc3NldElkCQACAQITR09SQyBwYXltZW50cyBvbmx5IQQEYWRkcgkApQgBCAUBaQZjYWxsZXIEDSR0MDEzOTE5MTQwMDEJAQlnb3JjU3RhdHMBBQRhZGRyBAp1c2VyQW1vdW50CAUNJHQwMTM5MTkxNDAwMQJfMQQPYW1vdW50TGVmdFRvdGFsCAUNJHQwMTM5MTkxNDAwMQJfMgQNdmVzdGluZ0Ftb3VudAgFDSR0MDEzOTE5MTQwMDECXzMEDnRlYW1BbW91bnRMZWZ0CAUNJHQwMTM5MTkxNDAwMQJfNAQNdXNlckFtb3VudEtleQkBFXN0YWtlZEFtb3VudEJ5VXNlcktleQEFBGFkZHIEDGNsYWltQWN0aW9ucwMJAGYCBQp1c2VyQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQp1c2VyQW1vdW50BQtnb3JjQXNzZXRJZAUDbmlsBQNuaWwEDnZlc3RpbmdBY3Rpb25zAwkAZgIFDXZlc3RpbmdBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRF0ZWFtV2FsbGV0QWRkcktleQUNdmVzdGluZ0Ftb3VudAULZ29yY0Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEXRlYW1BbW91bnRMZWZ0S2V5BQ50ZWFtQW1vdW50TGVmdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUWbGFzdFRlYW1WZXN0aW5nVGltZUtleQUGaGVpZ2h0BQNuaWwFA25pbAkAlAoCCQDOCAIJAM4IAgUMY2xhaW1BY3Rpb25zBQ52ZXN0aW5nQWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2VkQW1vdW50VG90YWxLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFFHN0YWtlZEFtb3VudFRvdGFsS2V5AAAFA2FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdXNlckFtb3VudEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNdXNlckFtb3VudEtleQAABQNhbXQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZsYXN0Q2xhaW1UaW1lQnlVc2VyS2V5AQUEYWRkcgUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQUPYW1vdW50TGVmdFRvdGFsBQNuaWwFCnVzZXJBbW91bnQBaQELdW5zdGFrZUdvcmMBBmFtb3VudAMJAGcCAAAFBmFtb3VudAkAAgECGUFtb3VudCBzaG91bGQgYmUgcG9zaXRpdmUEBGFkZHIJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEDXVzZXJBbW91bnRLZXkJARVzdGFrZWRBbW91bnRCeVVzZXJLZXkBBQRhZGRyBAlvbGRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNdXNlckFtb3VudEtleQAAAwkAZgIAAAkAZQIFCW9sZEFtb3VudAUGYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAQpmaXhlZFBvaW50AgUJb2xkQW1vdW50AAgCHyBHT1JDIHN0YWtlZCwgdHJpZWQgdG8gdW5zdGFrZSAJAQpmaXhlZFBvaW50AgUGYW1vdW50AAgEDSR0MDE1MjU2MTUzMzgJAQlnb3JjU3RhdHMBBQRhZGRyBAp1c2VyQW1vdW50CAUNJHQwMTUyNTYxNTMzOAJfMQQPYW1vdW50TGVmdFRvdGFsCAUNJHQwMTUyNTYxNTMzOAJfMgQNdmVzdGluZ0Ftb3VudAgFDSR0MDE1MjU2MTUzMzgCXzMEDnRlYW1BbW91bnRMZWZ0CAUNJHQwMTUyNTYxNTMzOAJfNAQMY2xhaW1BY3Rpb25zAwkAZgIFCnVzZXJBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCnVzZXJBbW91bnQFC2dvcmNBc3NldElkBQNuaWwFA25pbAQOdmVzdGluZ0FjdGlvbnMDCQBmAgUNdmVzdGluZ0Ftb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFEXRlYW1XYWxsZXRBZGRyS2V5BQ12ZXN0aW5nQW1vdW50BQtnb3JjQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURdGVhbUFtb3VudExlZnRLZXkFDnRlYW1BbW91bnRMZWZ0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZsYXN0VGVhbVZlc3RpbmdUaW1lS2V5BQZoZWlnaHQFA25pbAUDbmlsCQCUCgIJAM4IAgkAzggCBQxjbGFpbUFjdGlvbnMFDnZlc3RpbmdBY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZWRBbW91bnRUb3RhbEtleQkAZQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRRzdGFrZWRBbW91bnRUb3RhbEtleQIOTm8gR09SQyBzdGFrZWQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdXNlckFtb3VudEtleQkAZQIFCW9sZEFtb3VudAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWbGFzdENsYWltVGltZUJ5VXNlcktleQEFBGFkZHIFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkFD2Ftb3VudExlZnRUb3RhbAUDbmlsAAABaQEJY2xhaW1Hb3JjAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQNJHQwMTYxOTYxNjI3OAkBCWdvcmNTdGF0cwEFBGFkZHIECnVzZXJBbW91bnQIBQ0kdDAxNjE5NjE2Mjc4Al8xBA9hbW91bnRMZWZ0VG90YWwIBQ0kdDAxNjE5NjE2Mjc4Al8yBA12ZXN0aW5nQW1vdW50CAUNJHQwMTYxOTYxNjI3OAJfMwQOdGVhbUFtb3VudExlZnQIBQ0kdDAxNjE5NjE2Mjc4Al80BAxjbGFpbUFjdGlvbnMDCQBmAgUKdXNlckFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKdXNlckFtb3VudAULZ29yY0Fzc2V0SWQFA25pbAUDbmlsBA52ZXN0aW5nQWN0aW9ucwMJAGYCBQ12ZXN0aW5nQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQURdGVhbVdhbGxldEFkZHJLZXkFDXZlc3RpbmdBbW91bnQFC2dvcmNBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF0ZWFtQW1vdW50TGVmdEtleQUOdGVhbUFtb3VudExlZnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFmxhc3RUZWFtVmVzdGluZ1RpbWVLZXkFBmhlaWdodAUDbmlsBQNuaWwJAJQKAgkAzggCCQDOCAIFDGNsYWltQWN0aW9ucwUOdmVzdGluZ0FjdGlvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIJARZsYXN0Q2xhaW1UaW1lQnlVc2VyS2V5AQUEYWRkcgUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQUPYW1vdW50TGVmdFRvdGFsBQNuaWwFCnVzZXJBbW91bnQBaQEIYW5zd2VyTWUACQCUCgIJAQxmb21vSW50ZXJuYWwBBQFpCQCxCQEIBQFpDXRyYW5zYWN0aW9uSWQBaQEHYmxlc3NNZQAJAJQKAgkBDGZvbW9JbnRlcm5hbAEFAWkAKgFpAQtjb21taXRHdWVzcwEFZ3Vlc3MEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAlmaW5pc2hLZXkJAQlrZXlDb21taXQBBQRhZGRyBAhndWVzc0tleQkBCGtleUd1ZXNzAQUEYWRkcgMJAQlpc0RlZmluZWQBCQCfCAEFCWZpbmlzaEtleQkAAgECJVlvdSBhbHJlYWR5IG1hZGUgYSBiZXQsIHBsZWFzZSB1c2UgaXQDAwkAZgIAAAUFZ3Vlc3MGCQBmAgUFZ3Vlc3MACwkAAgECJVRoZSBudW1iZXIgc2hvdWxkIGJlIGJldHdlZW4gMCBhbmQgMTEDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC2dvcmNBc3NldElkCQACAQITR09SQyBwYXltZW50cyBvbmx5IQQGY2hhbmdlCQBlAgUDYW10BQ1MT1RURVJZX1BSSUNFAwkAZgIAAAUGY2hhbmdlCQACAQkArAICCQCsAgIJAKwCAgIWWW91IG5lZWQgdG8gc2FjcmlmaWNlIAkBCmZpeGVkUG9pbnQCBQ1MT1RURVJZX1BSSUNFAAgCFiBHT1JDLCBidXQgSSBzZWUgb25seSAJAQpmaXhlZFBvaW50AgUDYW10AAgEDWNoYW5nZUFjdGlvbnMDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZjaGFuZ2UFC2dvcmNBc3NldElkBQNuaWwFA25pbAQLZmluaXNoQmxvY2sJAGQCBQZoZWlnaHQFDFJBTkRPTV9ERUxBWQQQZGVsdGFDdXJySmFja3BvdAkAawMFDUxPVFRFUllfUFJJQ0UFFENVUlJFTlRfSkFDS1BPVF9QRVJDAGQEEGRlbHRhTmV4dEphY2twb3QJAGsDBQ1MT1RURVJZX1BSSUNFBRFORVhUX0pBQ0tQT1RfUEVSQwBkBA9kZWx0YVRlYW1BbW91bnQJAGsDBQ1MT1RURVJZX1BSSUNFBQlURUFNX1BFUkMAZAQSZGVsdGFTdGFrZXJzQW1vdW50CQBlAgkAZQIJAGUCBQ1MT1RURVJZX1BSSUNFBRBkZWx0YUN1cnJKYWNrcG90BRBkZWx0YU5leHRKYWNrcG90BQ9kZWx0YVRlYW1BbW91bnQJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlmaW5pc2hLZXkFC2ZpbmlzaEJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQhndWVzc0tleQUFZ3Vlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIFFWN1cnJMb3R0ZXJ5SmFja3BvdEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVY3VyckxvdHRlcnlKYWNrcG90S2V5AAAFEGRlbHRhQ3VyckphY2twb3QJAMwIAgkBDEludGVnZXJFbnRyeQIFFW5leHRMb3R0ZXJ5SmFja3BvdEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVbmV4dExvdHRlcnlKYWNrcG90S2V5AAAFEGRlbHRhTmV4dEphY2twb3QJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQURdGVhbVdhbGxldEFkZHJLZXkFD2RlbHRhVGVhbUFtb3VudAULZ29yY0Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFFHN0YWtlcnNBbW91bnRMZWZ0S2V5CQBkAgkBEUBleHRyTmF0aXZlKDEwNTUpAQUUc3Rha2Vyc0Ftb3VudExlZnRLZXkFEmRlbHRhU3Rha2Vyc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVc3Rha2Vyc0Ftb3VudFRvdGFsS2V5CQBkAgkBEUBleHRyTmF0aXZlKDEwNTUpAQUVc3Rha2Vyc0Ftb3VudFRvdGFsS2V5BRJkZWx0YVN0YWtlcnNBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVNhbHQBBQRhZGRyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFA25pbAUNY2hhbmdlQWN0aW9ucwULZmluaXNoQmxvY2sBaQEMZ3Vlc3NMb3R0ZXJ5AAQEYWRkcgkApQgBCAUBaQZjYWxsZXIECWZpbmlzaEtleQkBCWtleUNvbW1pdAEFBGFkZHIECGd1ZXNzS2V5CQEIa2V5R3Vlc3MBBQRhZGRyBAVndWVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFCGd1ZXNzS2V5AhdZb3UgaGF2ZSBub3QgbWFkZSBhIGJldAQLZmluaXNoQmxvY2sJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQlmaW5pc2hLZXkCF1lvdSBoYXZlIG5vdCBtYWRlIGEgYmV0AwkAZgIFC2ZpbmlzaEJsb2NrBQZoZWlnaHQJAAIBCQCsAgICNFJhbmRvbSBudW1iZXIgaXMgbm90IHJlYWR5IHlldCwgd2FpdCB1bnRpbCBoZWlnaHQgPSAJAKQDAQULZmluaXNoQmxvY2sEB2VudHJvcHkJAQV2YWx1ZQEICQEFdmFsdWUBCQDtBwEFC2ZpbmlzaEJsb2NrA3ZyZgQHc2FsdEtleQkBB2tleVNhbHQBBQRhZGRyBARzYWx0CQDZBAEJAQt2YWx1ZU9yRWxzZQIJAKIIAQUHc2FsdEtleQIHREVGQVVMVAQEcmFuZAkBD2dldFJhbmRvbU51bWJlcgMADAUEc2FsdAUHZW50cm9weQQLY3VyckphY2twb3QJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVY3VyckxvdHRlcnlKYWNrcG90S2V5AAAECndpbkFjdGlvbnMDCQAAAgUEcmFuZAUFZ3Vlc3MJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtjdXJySmFja3BvdAULZ29yY0Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUUbGFzdExvdHRlcnlXaW5uZXJLZXkFBGFkZHIJAMwIAgkBDEludGVnZXJFbnRyeQIFGmxhc3RMb3R0ZXJ5V2lubmVyQW1vdW50S2V5BQtjdXJySmFja3BvdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUYbGFzdExvdHRlcnlXaW5uZXJUaW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVY3VyckxvdHRlcnlKYWNrcG90S2V5CQELdmFsdWVPckVsc2UCCQCfCAEFFW5leHRMb3R0ZXJ5SmFja3BvdEtleQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVuZXh0TG90dGVyeUphY2twb3RLZXkAAAUDbmlsBQNuaWwJAJQKAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEFCWZpbmlzaEtleQkAzAgCCQELRGVsZXRlRW50cnkBBQhndWVzc0tleQkAzAgCCQELRGVsZXRlRW50cnkBBQdzYWx0S2V5BQNuaWwFCndpbkFjdGlvbnMFBHJhbmQBaQENc3RhdHNSRUFET05MWQELdXNlckFkZHJPcHQEDSR0MDIwOTIxMjEwMTAJAQlnb3JjU3RhdHMBBQt1c2VyQWRkck9wdAQKdXNlckFtb3VudAgFDSR0MDIwOTIxMjEwMTACXzEED2Ftb3VudExlZnRUb3RhbAgFDSR0MDIwOTIxMjEwMTACXzIEDXZlc3RpbmdBbW91bnQIBQ0kdDAyMDkyMTIxMDEwAl8zBA50ZWFtQW1vdW50TGVmdAgFDSR0MDIwOTIxMjEwMTACXzQED2N1cnJGb21vSmFja3BvdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJjdXJyRm9tb0phY2twb3RLZXkAAAQPbmV4dEZvbW9KYWNrcG90CQELdmFsdWVPckVsc2UCCQCfCAEFEm5leHRGb21vSmFja3BvdEtleQAABAxsYXN0Rm9tb1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPbGFzdEZvbW9UaW1lS2V5AAAEDmxhc3RGb21vUGxheWVyCQELdmFsdWVPckVsc2UCCQCiCAEFEWxhc3RGb21vUGxheWVyS2V5AgAECWZvbW9FcG9jaAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQxmb21vRXBvY2hLZXkAAAQOY3VyckZvbW9QZXJpb2QJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURY3VyckZvbW9QZXJpb2RLZXkFE0RFRkFVTFRfRk9NT19QRVJJT0QEEmN1cnJMb3R0ZXJ5SmFja3BvdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRVjdXJyTG90dGVyeUphY2twb3RLZXkAAAQSbmV4dExvdHRlcnlKYWNrcG90CQELdmFsdWVPckVsc2UCCQCfCAEFFW5leHRMb3R0ZXJ5SmFja3BvdEtleQAABAlmaW5pc2hLZXkJAQlrZXlDb21taXQBBQt1c2VyQWRkck9wdAQIZ3Vlc3NLZXkJAQhrZXlHdWVzcwEFC3VzZXJBZGRyT3B0BAVndWVzcwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQhndWVzc0tleQD///////////8BBAtmaW5pc2hCbG9jawkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlmaW5pc2hLZXkA////////////AQQObGFzdEZvbW9XaW5uZXIJAQt2YWx1ZU9yRWxzZQIJAKIIAQURbGFzdEZvbW9XaW5uZXJLZXkCAAQUbGFzdEZvbW9XaW5uZXJBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUXbGFzdEZvbW9XaW5uZXJBbW91bnRLZXkAAAQSbGFzdEZvbW9XaW5uZXJUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFFWxhc3RGb21vV2lubmVyVGltZUtleQAABBFsYXN0TG90dGVyeVdpbm5lcgkBC3ZhbHVlT3JFbHNlAgkAoggBBRRsYXN0TG90dGVyeVdpbm5lcktleQIABBdsYXN0TG90dGVyeVdpbm5lckFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRpsYXN0TG90dGVyeVdpbm5lckFtb3VudEtleQAABBVsYXN0TG90dGVyeVdpbm5lclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUYbGFzdExvdHRlcnlXaW5uZXJUaW1lS2V5AAAED2dvcmNTdGFrZWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRzdGFrZWRBbW91bnRUb3RhbEtleQAABBRmb21vTnVtVW5pcXVlUGxheWVycwkBC3ZhbHVlT3JFbHNlAgkAnwgBBRdmb21vTnVtVW5pcXVlUGxheWVyc0tleQAABBJmb21vVG90YWxOdW1TdGFrZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVZm9tb1RvdGFsTnVtU3Rha2VzS2V5AAAEFWZvbW9Ub3RhbFN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRhmb21vVG90YWxTdGFrZWRBbW91bnRLZXkAAAQRZm9tb1VzZXJOdW1TdGFrZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGZvbW9Vc2VyTnVtU3Rha2VzS2V5AQULdXNlckFkZHJPcHQAAAQUZm9tb1VzZXJTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBF2ZvbW9Vc2VyU3Rha2VkQW1vdW50S2V5AQULdXNlckFkZHJPcHQAAAQPZm9tb1VzZXJOdW1XaW5zCQELdmFsdWVPckVsc2UCCQCfCAEJARJmb21vVXNlck51bVdpbnNLZXkBBQt1c2VyQWRkck9wdAAABBFmb21vVXNlcldvbkFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUZm9tb1VzZXJXb25BbW91bnRLZXkBBQt1c2VyQWRkck9wdAAABBZmb21vRmF2b3JpdGVCeU51bUdhbWVzCQELdmFsdWVPckVsc2UCCQCiCAEFGWZvbW9GYXZvcml0ZUJ5TnVtR2FtZXNLZXkCAAQUZm9tb0Zhdm9yaXRlQnlBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAKIIAQUXZm9tb0Zhdm9yaXRlQnlBbW91bnRLZXkCAAkAlAoCBQNuaWwJAMwIAgkArAICAhclcyVkX190ZWFtQXZhaWxUb1Zlc3RfXwkApAMBBQ12ZXN0aW5nQW1vdW50CQDMCAIJAKwCAgIWJXMlZF9fdGVhbUFtb3VudExlZnRfXwkApAMBBQ50ZWFtQW1vdW50TGVmdAkAzAgCCQCsAgICGCVzJWRfX2dvcmNBdmFpbFRvQ2xhaW1fXwkApAMBBQp1c2VyQW1vdW50CQDMCAIJAKwCAgIRJXMlZF9fZm9tb0Vwb2NoX18JAKQDAQUJZm9tb0Vwb2NoCQDMCAIJAKwCAgIWJXMlZF9fY3VyckZvbW9QZXJpb2RfXwkApAMBBQ5jdXJyRm9tb1BlcmlvZAkAzAgCCQCsAgICHSVzJWRfX2N1cnJGb21vSmFja3BvdEFtb3VudF9fCQCkAwEFD2N1cnJGb21vSmFja3BvdAkAzAgCCQCsAgICHSVzJWRfX25leHRGb21vSmFja3BvdEFtb3VudF9fCQCkAwEFD25leHRGb21vSmFja3BvdAkAzAgCCQCsAgICICVzJWRfX2N1cnJMb3R0ZXJ5SmFja3BvdEFtb3VudF9fCQCkAwEFEmN1cnJMb3R0ZXJ5SmFja3BvdAkAzAgCCQCsAgICICVzJWRfX25leHRMb3R0ZXJ5SmFja3BvdEFtb3VudF9fCQCkAwEFEm5leHRMb3R0ZXJ5SmFja3BvdAkAzAgCCQCsAgICFCVzJWRfX2xhc3RGb21vVGltZV9fCQCkAwEFDGxhc3RGb21vVGltZQkAzAgCCQCsAgICFiVzJXNfX2xhc3RGb21vUGxheWVyX18FDmxhc3RGb21vUGxheWVyCQDMCAIJAKwCAgIXJXMlZF9fYW1vdW50TGVmdFRvdGFsX18JAKQDAQUPYW1vdW50TGVmdFRvdGFsCQDMCAIJAKwCAgITJXMlZF9fZmluaXNoQmxvY2tfXwkApAMBBQtmaW5pc2hCbG9jawkAzAgCCQCsAgICDSVzJWRfX2d1ZXNzX18JAKQDAQUFZ3Vlc3MJAMwIAgkArAICAhYlcyVzX19sYXN0Rm9tb1dpbm5lcl9fBQ5sYXN0Rm9tb1dpbm5lcgkAzAgCCQCsAgICHCVzJWRfX2xhc3RGb21vV2lubmVyQW1vdW50X18JAKQDAQUUbGFzdEZvbW9XaW5uZXJBbW91bnQJAMwIAgkArAICAholcyVkX19sYXN0Rm9tb1dpbm5lclRpbWVfXwkApAMBBRJsYXN0Rm9tb1dpbm5lclRpbWUJAMwIAgkArAICAhklcyVzX19sYXN0TG90dGVyeVdpbm5lcl9fBRFsYXN0TG90dGVyeVdpbm5lcgkAzAgCCQCsAgICHyVzJWRfX2xhc3RMb3R0ZXJ5V2lubmVyQW1vdW50X18JAKQDAQUXbGFzdExvdHRlcnlXaW5uZXJBbW91bnQJAMwIAgkArAICAh0lcyVkX19sYXN0TG90dGVyeVdpbm5lclRpbWVfXwkApAMBBRVsYXN0TG90dGVyeVdpbm5lclRpbWUJAMwIAgkArAICAhIlcyVkX19nb3JjSXNzdWVkX18JAKQDAQUDTTE2CQDMCAIJAKwCAgIXJXMlZF9fZ29yY1N0YWtlZFRvdGFsX18JAKQDAQUPZ29yY1N0YWtlZFRvdGFsCQDMCAIJAKwCAgIcJXMlZF9fZm9tb051bVVuaXF1ZVBsYXllcnNfXwkApAMBBRRmb21vTnVtVW5pcXVlUGxheWVycwkAzAgCCQCsAgICGiVzJWRfX2ZvbW9Ub3RhbE51bVN0YWtlc19fCQCkAwEFEmZvbW9Ub3RhbE51bVN0YWtlcwkAzAgCCQCsAgICHSVzJWRfX2ZvbW9Ub3RhbFN0YWtlZEFtb3VudF9fCQCkAwEFFWZvbW9Ub3RhbFN0YWtlZEFtb3VudAkAzAgCCQCsAgICGSVzJWRfX2ZvbW9Vc2VyTnVtU3Rha2VzX18JAKQDAQURZm9tb1VzZXJOdW1TdGFrZXMJAMwIAgkArAICAhwlcyVkX19mb21vVXNlclN0YWtlZEFtb3VudF9fCQCkAwEFFGZvbW9Vc2VyU3Rha2VkQW1vdW50CQDMCAIJAKwCAgIXJXMlZF9fZm9tb1VzZXJOdW1XaW5zX18JAKQDAQUPZm9tb1VzZXJOdW1XaW5zCQDMCAIJAKwCAgIZJXMlZF9fZm9tb1VzZXJXb25BbW91bnRfXwkApAMBBRFmb21vVXNlcldvbkFtb3VudAkAzAgCCQCsAgICHiVzJXNfX2ZvbW9GYXZvcml0ZUJ5TnVtR2FtZXNfXwUWZm9tb0Zhdm9yaXRlQnlOdW1HYW1lcwkAzAgCCQCsAgICHCVzJXNfX2ZvbW9GYXZvcml0ZUJ5QW1vdW50X18FFGZvbW9GYXZvcml0ZUJ5QW1vdW50BQNuaWwBaQESd2FsbGV0SW5mb1JFQURPTkxZAQ51c2VyQWRkcmVzc09wdAkAlAoCBQNuaWwJAQ53YWxsZXRJbnRlcm5hbAEFDnVzZXJBZGRyZXNzT3B0ANKsOT4=", "height": 3476337, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9SBX3dfcNRaE1YYScpjBKmgUbjb6gj997RL4P9e5TZyD Next: none Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let M16 = 10000000000000000
55
6-let STAKERS_AMOUNT = 3000000000000000
6+let STAKERS_AMOUNT = 2500000000000000
77
88 let TEAM_AMOUNT = 1000000000000000
99
1010 let MARKET_AMOUNT = 6000000000000000
1111
12+let RESERVED_AMOUNT = 500000000000000
13+
1214 let YEAR_BLOCKS = (365 * 1440)
15+
16+let TEAM_VESTING_PERIOD = YEAR_BLOCKS
1317
1418 let STAKE_PERIOD = (5 * YEAR_BLOCKS)
1519
3438 let gorcAssetId = valueOrErrorMessage(getBinary(gorcAssetIdKey), "GORC is not issued yet")
3539
3640 let issueTimeKey = "issueTime"
41+
42+let teamAmountLeftKey = "teamAmountLeft"
43+
44+let lastTeamVestingTimeKey = "lastTeamVestingTime"
3745
3846 let stakersAmountTotalKey = "stakersAmountTotal"
3947
6876 let teamWalletAddrKey = "teamWalletAddr"
6977
7078 let brokerAddrKey = "brokerAddr"
79+
80+let reserveAddrKey = "reserveAddr"
7181
7282 func keyCommit (address) = ("finishBlockFor_" + address)
7383
111121 let fomoFavoriteByAmountKey = "fomoFavoriteByAmount"
112122
113123 func gorcStats (userAddrOpt) = {
124+ let issueTime = valueOrErrorMessage(getInteger(issueTimeKey), "GORC is not issued yet")
125+ let nowLimitedVesting = min([height, (issueTime + TEAM_VESTING_PERIOD)])
126+ let lastTeamVestingTime = valueOrErrorMessage(getInteger(lastTeamVestingTimeKey), "Constructor is not called yet")
127+ let vestingAmount = fraction(TEAM_AMOUNT, (nowLimitedVesting - lastTeamVestingTime), TEAM_VESTING_PERIOD)
128+ let teamAmountLeft = (valueOrElse(getInteger(teamAmountLeftKey), 0) - vestingAmount)
114129 let amountLeftTotal = valueOrElse(getInteger(stakersAmountLeftKey), 0)
115130 let lastUserTime = valueOrElse(getInteger(lastClaimTimeByUserKey(userAddrOpt)), -1)
116131 if ((0 > lastUserTime))
117- then $Tuple2(0, amountLeftTotal)
132+ then $Tuple4(0, amountLeftTotal, vestingAmount, teamAmountLeft)
118133 else {
119- let issueTime = valueOrErrorMessage(getInteger(issueTimeKey), "GORC is not issued yet")
120- let nowLimited = min([height, (issueTime + STAKE_PERIOD)])
134+ let nowLimitedStaking = min([height, (issueTime + STAKE_PERIOD)])
121135 let userShares = valueOrElse(getInteger(stakedAmountByUserKey(userAddrOpt)), 0)
122136 let totalShares = valueOrElse(getInteger(stakedAmountTotalKey), 0)
123137 let stakersAmountTotal = valueOrElse(getInteger(stakersAmountTotalKey), STAKERS_AMOUNT)
124- let userTemporal = fraction(stakersAmountTotal, (nowLimited - lastUserTime), STAKE_PERIOD)
138+ let userTemporal = fraction(stakersAmountTotal, (nowLimitedStaking - lastUserTime), STAKE_PERIOD)
125139 let userAmount = if ((totalShares != 0))
126140 then fraction(userTemporal, userShares, totalShares)
127141 else 0
128- $Tuple2(userAmount, (amountLeftTotal - userAmount))
142+ $Tuple4(userAmount, (amountLeftTotal - userAmount), vestingAmount, teamAmountLeft)
129143 }
130144 }
131145
266280
267281
268282 @Callable(i)
269-func constructorV1 (teamWalletAddr,brokerAddr) = if ((i.caller != this))
283+func constructorV1 (teamWalletAddr,brokerAddr,reserveAddr) = if ((i.caller != this))
270284 then throw("Permission denied")
271285 else {
272286 let issuedAmount = M16
273287 let issue = Issue("GORC", "Meme coin by God of Random Chance. Visit https://gorc.meme, sacrifice to the God of Random and you will receive an answer to any question or a blessing. Lucky one gets a Gift of God", issuedAmount, 8, false, unit, 0)
274288 let assetId = calculateAssetId(issue)
275-[issue, BinaryEntry(gorcAssetIdKey, assetId), IntegerEntry(issueTimeKey, height), IntegerEntry(stakersAmountLeftKey, STAKERS_AMOUNT), IntegerEntry(stakersAmountTotalKey, STAKERS_AMOUNT), StringEntry(teamWalletAddrKey, teamWalletAddr), StringEntry(brokerAddrKey, brokerAddr), ScriptTransfer(addressFromStringValue(teamWalletAddr), TEAM_AMOUNT, assetId), ScriptTransfer(addressFromStringValue(brokerAddr), MARKET_AMOUNT, assetId), IntegerEntry(fomoEpochKey, 0), IntegerEntry(currFomoPeriodKey, DEFAULT_FOMO_PERIOD)]
289+[issue, BinaryEntry(gorcAssetIdKey, assetId), IntegerEntry(issueTimeKey, height), IntegerEntry(stakersAmountLeftKey, STAKERS_AMOUNT), IntegerEntry(stakersAmountTotalKey, STAKERS_AMOUNT), IntegerEntry(teamAmountLeftKey, TEAM_AMOUNT), IntegerEntry(lastTeamVestingTimeKey, height), StringEntry(teamWalletAddrKey, teamWalletAddr), StringEntry(brokerAddrKey, brokerAddr), StringEntry(reserveAddrKey, reserveAddr), ScriptTransfer(addressFromStringValue(reserveAddr), RESERVED_AMOUNT, assetId), ScriptTransfer(addressFromStringValue(brokerAddr), MARKET_AMOUNT, assetId), IntegerEntry(fomoEpochKey, 0), IntegerEntry(currFomoPeriodKey, DEFAULT_FOMO_PERIOD)]
276290 }
277291
278292
289303 then throw("GORC payments only!")
290304 else {
291305 let addr = toString(i.caller)
292- let $t01216812219 = gorcStats(addr)
293- let userAmount = $t01216812219._1
294- let amountLeftTotal = $t01216812219._2
306+ let $t01391914001 = gorcStats(addr)
307+ let userAmount = $t01391914001._1
308+ let amountLeftTotal = $t01391914001._2
309+ let vestingAmount = $t01391914001._3
310+ let teamAmountLeft = $t01391914001._4
295311 let userAmountKey = stakedAmountByUserKey(addr)
296312 let claimActions = if ((userAmount > 0))
297313 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
298314 else nil
299- $Tuple2((claimActions ++ [IntegerEntry(stakedAmountTotalKey, (valueOrElse(getInteger(stakedAmountTotalKey), 0) + amt)), IntegerEntry(userAmountKey, (valueOrElse(getInteger(userAmountKey), 0) + amt)), IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), userAmount)
315+ let vestingActions = if ((vestingAmount > 0))
316+ then [ScriptTransfer(addressFromStringValue(getStringValue(teamWalletAddrKey)), vestingAmount, gorcAssetId), IntegerEntry(teamAmountLeftKey, teamAmountLeft), IntegerEntry(lastTeamVestingTimeKey, height)]
317+ else nil
318+ $Tuple2(((claimActions ++ vestingActions) ++ [IntegerEntry(stakedAmountTotalKey, (valueOrElse(getInteger(stakedAmountTotalKey), 0) + amt)), IntegerEntry(userAmountKey, (valueOrElse(getInteger(userAmountKey), 0) + amt)), IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), userAmount)
300319 }
301320 }
302321
315334 if ((0 > (oldAmount - amount)))
316335 then throw(((("You have only " + fixedPoint(oldAmount, 8)) + " GORC staked, tried to unstake ") + fixedPoint(amount, 8)))
317336 else {
318- let $t01318013231 = gorcStats(addr)
319- let userAmount = $t01318013231._1
320- let amountLeftTotal = $t01318013231._2
337+ let $t01525615338 = gorcStats(addr)
338+ let userAmount = $t01525615338._1
339+ let amountLeftTotal = $t01525615338._2
340+ let vestingAmount = $t01525615338._3
341+ let teamAmountLeft = $t01525615338._4
321342 let claimActions = if ((userAmount > 0))
322343 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
323344 else nil
324- $Tuple2((claimActions ++ [IntegerEntry(stakedAmountTotalKey, (valueOrErrorMessage(getInteger(stakedAmountTotalKey), "No GORC staked") - amount)), IntegerEntry(userAmountKey, (oldAmount - amount)), IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), 0)
345+ let vestingActions = if ((vestingAmount > 0))
346+ then [ScriptTransfer(addressFromStringValue(getStringValue(teamWalletAddrKey)), vestingAmount, gorcAssetId), IntegerEntry(teamAmountLeftKey, teamAmountLeft), IntegerEntry(lastTeamVestingTimeKey, height)]
347+ else nil
348+ $Tuple2(((claimActions ++ vestingActions) ++ [IntegerEntry(stakedAmountTotalKey, (valueOrErrorMessage(getInteger(stakedAmountTotalKey), "No GORC staked") - amount)), IntegerEntry(userAmountKey, (oldAmount - amount)), IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), 0)
325349 }
326350 }
327351 }
333357 then throw("No payments required")
334358 else {
335359 let addr = toString(i.caller)
336- let $t01379513846 = gorcStats(addr)
337- let userAmount = $t01379513846._1
338- let amountLeftTotal = $t01379513846._2
360+ let $t01619616278 = gorcStats(addr)
361+ let userAmount = $t01619616278._1
362+ let amountLeftTotal = $t01619616278._2
363+ let vestingAmount = $t01619616278._3
364+ let teamAmountLeft = $t01619616278._4
339365 let claimActions = if ((userAmount > 0))
340366 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
341367 else nil
342- $Tuple2((claimActions ++ [IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), userAmount)
368+ let vestingActions = if ((vestingAmount > 0))
369+ then [ScriptTransfer(addressFromStringValue(getStringValue(teamWalletAddrKey)), vestingAmount, gorcAssetId), IntegerEntry(teamAmountLeftKey, teamAmountLeft), IntegerEntry(lastTeamVestingTimeKey, height)]
370+ else nil
371+ $Tuple2(((claimActions ++ vestingActions) ++ [IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), userAmount)
343372 }
344373
345374
421450
422451 @Callable(i)
423452 func statsREADONLY (userAddrOpt) = {
424- let $t01819518253 = gorcStats(userAddrOpt)
425- let userAmount = $t01819518253._1
426- let amountLeftTotal = $t01819518253._2
453+ let $t02092121010 = gorcStats(userAddrOpt)
454+ let userAmount = $t02092121010._1
455+ let amountLeftTotal = $t02092121010._2
456+ let vestingAmount = $t02092121010._3
457+ let teamAmountLeft = $t02092121010._4
427458 let currFomoJackpot = valueOrElse(getInteger(currFomoJackpotKey), 0)
428459 let nextFomoJackpot = valueOrElse(getInteger(nextFomoJackpotKey), 0)
429460 let lastFomoTime = valueOrElse(getInteger(lastFomoTimeKey), 0)
452483 let fomoUserWonAmount = valueOrElse(getInteger(fomoUserWonAmountKey(userAddrOpt)), 0)
453484 let fomoFavoriteByNumGames = valueOrElse(getString(fomoFavoriteByNumGamesKey), "")
454485 let fomoFavoriteByAmount = valueOrElse(getString(fomoFavoriteByAmountKey), "")
455- $Tuple2(nil, [("%s%d__gorcAvailToClaim__" + toString(userAmount)), ("%s%d__fomoEpoch__" + toString(fomoEpoch)), ("%s%d__currFomoPeriod__" + toString(currFomoPeriod)), ("%s%d__currFomoJackpotAmount__" + toString(currFomoJackpot)), ("%s%d__nextFomoJackpotAmount__" + toString(nextFomoJackpot)), ("%s%d__currLotteryJackpotAmount__" + toString(currLotteryJackpot)), ("%s%d__nextLotteryJackpotAmount__" + toString(nextLotteryJackpot)), ("%s%d__lastFomoTime__" + toString(lastFomoTime)), ("%s%s__lastFomoPlayer__" + lastFomoPlayer), ("%s%d__amountLeftTotal__" + toString(amountLeftTotal)), ("%s%d__finishBlock__" + toString(finishBlock)), ("%s%d__guess__" + toString(guess)), ("%s%s__lastFomoWinner__" + lastFomoWinner), ("%s%d__lastFomoWinnerAmount__" + toString(lastFomoWinnerAmount)), ("%s%d__lastFomoWinnerTime__" + toString(lastFomoWinnerTime)), ("%s%s__lastLotteryWinner__" + lastLotteryWinner), ("%s%d__lastLotteryWinnerAmount__" + toString(lastLotteryWinnerAmount)), ("%s%d__lastLotteryWinnerTime__" + toString(lastLotteryWinnerTime)), ("%s%d__gorcIssued__" + toString(M16)), ("%s%d__gorcStakedTotal__" + toString(gorcStakedTotal)), ("%s%d__fomoNumUniquePlayers__" + toString(fomoNumUniquePlayers)), ("%s%d__fomoTotalNumStakes__" + toString(fomoTotalNumStakes)), ("%s%d__fomoTotalStakedAmount__" + toString(fomoTotalStakedAmount)), ("%s%d__fomoUserNumStakes__" + toString(fomoUserNumStakes)), ("%s%d__fomoUserStakedAmount__" + toString(fomoUserStakedAmount)), ("%s%d__fomoUserNumWins__" + toString(fomoUserNumWins)), ("%s%d__fomoUserWonAmount__" + toString(fomoUserWonAmount)), ("%s%s__fomoFavoriteByNumGames__" + fomoFavoriteByNumGames), ("%s%s__fomoFavoriteByAmount__" + fomoFavoriteByAmount)])
486+ $Tuple2(nil, [("%s%d__teamAvailToVest__" + toString(vestingAmount)), ("%s%d__teamAmountLeft__" + toString(teamAmountLeft)), ("%s%d__gorcAvailToClaim__" + toString(userAmount)), ("%s%d__fomoEpoch__" + toString(fomoEpoch)), ("%s%d__currFomoPeriod__" + toString(currFomoPeriod)), ("%s%d__currFomoJackpotAmount__" + toString(currFomoJackpot)), ("%s%d__nextFomoJackpotAmount__" + toString(nextFomoJackpot)), ("%s%d__currLotteryJackpotAmount__" + toString(currLotteryJackpot)), ("%s%d__nextLotteryJackpotAmount__" + toString(nextLotteryJackpot)), ("%s%d__lastFomoTime__" + toString(lastFomoTime)), ("%s%s__lastFomoPlayer__" + lastFomoPlayer), ("%s%d__amountLeftTotal__" + toString(amountLeftTotal)), ("%s%d__finishBlock__" + toString(finishBlock)), ("%s%d__guess__" + toString(guess)), ("%s%s__lastFomoWinner__" + lastFomoWinner), ("%s%d__lastFomoWinnerAmount__" + toString(lastFomoWinnerAmount)), ("%s%d__lastFomoWinnerTime__" + toString(lastFomoWinnerTime)), ("%s%s__lastLotteryWinner__" + lastLotteryWinner), ("%s%d__lastLotteryWinnerAmount__" + toString(lastLotteryWinnerAmount)), ("%s%d__lastLotteryWinnerTime__" + toString(lastLotteryWinnerTime)), ("%s%d__gorcIssued__" + toString(M16)), ("%s%d__gorcStakedTotal__" + toString(gorcStakedTotal)), ("%s%d__fomoNumUniquePlayers__" + toString(fomoNumUniquePlayers)), ("%s%d__fomoTotalNumStakes__" + toString(fomoTotalNumStakes)), ("%s%d__fomoTotalStakedAmount__" + toString(fomoTotalStakedAmount)), ("%s%d__fomoUserNumStakes__" + toString(fomoUserNumStakes)), ("%s%d__fomoUserStakedAmount__" + toString(fomoUserStakedAmount)), ("%s%d__fomoUserNumWins__" + toString(fomoUserNumWins)), ("%s%d__fomoUserWonAmount__" + toString(fomoUserWonAmount)), ("%s%s__fomoFavoriteByNumGames__" + fomoFavoriteByNumGames), ("%s%s__fomoFavoriteByAmount__" + fomoFavoriteByAmount)])
456487 }
457488
458489
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let M16 = 10000000000000000
55
6-let STAKERS_AMOUNT = 3000000000000000
6+let STAKERS_AMOUNT = 2500000000000000
77
88 let TEAM_AMOUNT = 1000000000000000
99
1010 let MARKET_AMOUNT = 6000000000000000
1111
12+let RESERVED_AMOUNT = 500000000000000
13+
1214 let YEAR_BLOCKS = (365 * 1440)
15+
16+let TEAM_VESTING_PERIOD = YEAR_BLOCKS
1317
1418 let STAKE_PERIOD = (5 * YEAR_BLOCKS)
1519
1620 let BLESS_PRICE = 100000000000
1721
1822 let LOTTERY_PRICE = 100000000000
1923
2024 let DEFAULT_FOMO_PERIOD = 60
2125
2226 let MIN_FOMO_PERIOD = 2
2327
2428 let RANDOM_DELAY = 2
2529
2630 let CURRENT_JACKPOT_PERC = 50
2731
2832 let NEXT_JACKPOT_PERC = 20
2933
3034 let TEAM_PERC = 10
3135
3236 let gorcAssetIdKey = "gorcAssetId"
3337
3438 let gorcAssetId = valueOrErrorMessage(getBinary(gorcAssetIdKey), "GORC is not issued yet")
3539
3640 let issueTimeKey = "issueTime"
41+
42+let teamAmountLeftKey = "teamAmountLeft"
43+
44+let lastTeamVestingTimeKey = "lastTeamVestingTime"
3745
3846 let stakersAmountTotalKey = "stakersAmountTotal"
3947
4048 let stakersAmountLeftKey = "stakersAmountLeft"
4149
4250 let stakedAmountTotalKey = "stakedTotal"
4351
4452 func stakedAmountByUserKey (addr) = ("stakedAmount_" + addr)
4553
4654
4755 func lastClaimTimeByUserKey (addr) = ("lastClaimTime_" + addr)
4856
4957
5058 let fomoEpochKey = "fomoEpoch"
5159
5260 let currFomoPeriodKey = "currFomoPeriod"
5361
5462 let lastFomoTimeKey = "lastFomoTime"
5563
5664 let currFomoJackpotKey = "currFomoJackpot"
5765
5866 let nextFomoJackpotKey = "nextFomoJackpot"
5967
6068 let lastFomoPlayerKey = "lastFomoPlayer"
6169
6270 let lastFomoWinnerKey = "lastFomoWinner"
6371
6472 let lastFomoWinnerAmountKey = "lastFomoWinnerAmount"
6573
6674 let lastFomoWinnerTimeKey = "lastFomoWinnerTime"
6775
6876 let teamWalletAddrKey = "teamWalletAddr"
6977
7078 let brokerAddrKey = "brokerAddr"
79+
80+let reserveAddrKey = "reserveAddr"
7181
7282 func keyCommit (address) = ("finishBlockFor_" + address)
7383
7484
7585 func keyGuess (address) = ("guessFor_" + address)
7686
7787
7888 func keySalt (address) = ("saltFor_" + address)
7989
8090
8191 let currLotteryJackpotKey = "currLotteryJackpot"
8292
8393 let nextLotteryJackpotKey = "nextLotteryJackpot"
8494
8595 let lastLotteryWinnerKey = "lastLotteryWinner"
8696
8797 let lastLotteryWinnerAmountKey = "lastLotteryWinnerAmount"
8898
8999 let lastLotteryWinnerTimeKey = "lastLotteryWinnerTime"
90100
91101 let fomoNumUniquePlayersKey = "fomoNumUniquePlayers"
92102
93103 let fomoTotalNumStakesKey = "fomoTotalNumStakes"
94104
95105 let fomoTotalStakedAmountKey = "fomoTotalStakedAmount"
96106
97107 func fomoUserNumStakesKey (address) = ("fomoUserNumStakes_" + address)
98108
99109
100110 func fomoUserStakedAmountKey (address) = ("fomoUserStakedAmount_" + address)
101111
102112
103113 func fomoUserNumWinsKey (address) = ("fomoUserNumWins_" + address)
104114
105115
106116 func fomoUserWonAmountKey (address) = ("fomoUserWonAmount_" + address)
107117
108118
109119 let fomoFavoriteByNumGamesKey = "fomoFavoriteByNumGames"
110120
111121 let fomoFavoriteByAmountKey = "fomoFavoriteByAmount"
112122
113123 func gorcStats (userAddrOpt) = {
124+ let issueTime = valueOrErrorMessage(getInteger(issueTimeKey), "GORC is not issued yet")
125+ let nowLimitedVesting = min([height, (issueTime + TEAM_VESTING_PERIOD)])
126+ let lastTeamVestingTime = valueOrErrorMessage(getInteger(lastTeamVestingTimeKey), "Constructor is not called yet")
127+ let vestingAmount = fraction(TEAM_AMOUNT, (nowLimitedVesting - lastTeamVestingTime), TEAM_VESTING_PERIOD)
128+ let teamAmountLeft = (valueOrElse(getInteger(teamAmountLeftKey), 0) - vestingAmount)
114129 let amountLeftTotal = valueOrElse(getInteger(stakersAmountLeftKey), 0)
115130 let lastUserTime = valueOrElse(getInteger(lastClaimTimeByUserKey(userAddrOpt)), -1)
116131 if ((0 > lastUserTime))
117- then $Tuple2(0, amountLeftTotal)
132+ then $Tuple4(0, amountLeftTotal, vestingAmount, teamAmountLeft)
118133 else {
119- let issueTime = valueOrErrorMessage(getInteger(issueTimeKey), "GORC is not issued yet")
120- let nowLimited = min([height, (issueTime + STAKE_PERIOD)])
134+ let nowLimitedStaking = min([height, (issueTime + STAKE_PERIOD)])
121135 let userShares = valueOrElse(getInteger(stakedAmountByUserKey(userAddrOpt)), 0)
122136 let totalShares = valueOrElse(getInteger(stakedAmountTotalKey), 0)
123137 let stakersAmountTotal = valueOrElse(getInteger(stakersAmountTotalKey), STAKERS_AMOUNT)
124- let userTemporal = fraction(stakersAmountTotal, (nowLimited - lastUserTime), STAKE_PERIOD)
138+ let userTemporal = fraction(stakersAmountTotal, (nowLimitedStaking - lastUserTime), STAKE_PERIOD)
125139 let userAmount = if ((totalShares != 0))
126140 then fraction(userTemporal, userShares, totalShares)
127141 else 0
128- $Tuple2(userAmount, (amountLeftTotal - userAmount))
142+ $Tuple4(userAmount, (amountLeftTotal - userAmount), vestingAmount, teamAmountLeft)
129143 }
130144 }
131145
132146
133147 func fixedPoint (val,decimals) = {
134148 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
135149 let lowPart = toString((val % tenPow))
136150 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
137151 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
138152 }
139153
140154
141155 func getNewLeaders (oldLeadersStr,newAddr,newAmount) = {
142156 let newCandidate = ((newAddr + "_") + toString(newAmount))
143157 if ((oldLeadersStr == ""))
144158 then [newCandidate]
145159 else {
146160 func sortByAmount (acc,el) = {
147161 let addr_amount = split(el, "_")
148162 let addr = addr_amount[0]
149163 let amount = parseIntValue(addr_amount[1])
150164 if (acc._2)
151165 then if ((addr == newAddr))
152166 then acc
153167 else $Tuple2((acc._1 :+ el), true)
154168 else if ((addr == newAddr))
155169 then $Tuple2((acc._1 :+ newCandidate), true)
156170 else if ((amount > newAmount))
157171 then $Tuple2((acc._1 :+ el), false)
158172 else $Tuple2(((acc._1 :+ newCandidate) :+ el), true)
159173 }
160174
161175 let result = {
162176 let $l = split(oldLeadersStr, ":")
163177 let $s = size($l)
164178 let $acc0 = $Tuple2(nil, false)
165179 func $f0_1 ($a,$i) = if (($i >= $s))
166180 then $a
167181 else sortByAmount($a, $l[$i])
168182
169183 func $f0_2 ($a,$i) = if (($i >= $s))
170184 then $a
171185 else throw("List size exceeds 3")
172186
173187 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
174188 }
175189 let arr = result._1
176190 if (result._2)
177191 then if ((size(arr) > 3))
178192 then [arr[0], arr[1], arr[2]]
179193 else arr
180194 else if ((size(arr) >= 3))
181195 then arr
182196 else (arr :+ newCandidate)
183197 }
184198 }
185199
186200
187201 func fomoInternal (i) = if ((size(i.payments) != 1))
188202 then throw("exactly 1 payment must be attached")
189203 else {
190204 let pmt = i.payments[0]
191205 let amt = pmt.amount
192206 if (if (!(isDefined(pmt.assetId)))
193207 then true
194208 else (value(pmt.assetId) != gorcAssetId))
195209 then throw("GORC payments only!")
196210 else {
197211 let change = (amt - BLESS_PRICE)
198212 if ((0 > change))
199213 then throw(((("You need to sacrifice " + fixedPoint(BLESS_PRICE, 8)) + " GORC, but I see only ") + fixedPoint(amt, 8)))
200214 else {
201215 let changeActions = if ((change > 0))
202216 then [ScriptTransfer(i.caller, change, gorcAssetId)]
203217 else nil
204218 let lastFomoTime = valueOrElse(getInteger(lastFomoTimeKey), 0)
205219 let lastFomoPlayer = valueOrElse(getString(lastFomoPlayerKey), "")
206220 let lastFomoNumWinsKey = fomoUserNumWinsKey(lastFomoPlayer)
207221 let lastFomoWonAmountKey = fomoUserWonAmountKey(lastFomoPlayer)
208222 let lastFomoNumWins = valueOrElse(getInteger(lastFomoNumWinsKey), 0)
209223 let lastFomoWonAmount = valueOrElse(getInteger(lastFomoWonAmountKey), 0)
210224 let deltaCurrJackpot = fraction(BLESS_PRICE, CURRENT_JACKPOT_PERC, 100)
211225 let deltaNextJackpot = fraction(BLESS_PRICE, NEXT_JACKPOT_PERC, 100)
212226 let deltaTeamAmount = fraction(BLESS_PRICE, TEAM_PERC, 100)
213227 let deltaStakersAmount = (((BLESS_PRICE - deltaCurrJackpot) - deltaNextJackpot) - deltaTeamAmount)
214228 let fomoEpoch = valueOrElse(getInteger(fomoEpochKey), 0)
215229 let currFomoPeriod = valueOrElse(getInteger(currFomoPeriodKey), DEFAULT_FOMO_PERIOD)
216230 let nextFomoPeriod = max([MIN_FOMO_PERIOD, (currFomoPeriod - 1)])
217231 let fomoCurrJackpot = valueOrElse(getInteger(currFomoJackpotKey), 0)
218232 let fomoNextJackpot = valueOrElse(getInteger(nextFomoJackpotKey), 0)
219233 let oldLeadersByNum = valueOrElse(getString(fomoFavoriteByNumGamesKey), "")
220234 let oldLeadersByAmount = valueOrElse(getString(fomoFavoriteByAmountKey), "")
221235 let fomoActions = if (if (if ((height > (lastFomoTime + currFomoPeriod)))
222236 then (fomoCurrJackpot > 0)
223237 else false)
224238 then (lastFomoPlayer != "")
225239 else false)
226240 then [ScriptTransfer(addressFromStringValue(lastFomoPlayer), fomoCurrJackpot, gorcAssetId), StringEntry(lastFomoWinnerKey, lastFomoPlayer), IntegerEntry(lastFomoWinnerAmountKey, fomoCurrJackpot), IntegerEntry(lastFomoWinnerTimeKey, lastBlock.timestamp), IntegerEntry(currFomoJackpotKey, (fomoNextJackpot + deltaCurrJackpot)), IntegerEntry(nextFomoJackpotKey, deltaNextJackpot), IntegerEntry(fomoEpochKey, (fomoEpoch + 1)), IntegerEntry(currFomoPeriodKey, DEFAULT_FOMO_PERIOD), StringEntry(fomoFavoriteByNumGamesKey, makeString(getNewLeaders(oldLeadersByNum, lastFomoPlayer, (lastFomoNumWins + 1)), ":")), StringEntry(fomoFavoriteByAmountKey, makeString(getNewLeaders(oldLeadersByAmount, lastFomoPlayer, (lastFomoWonAmount + fomoCurrJackpot)), ":")), IntegerEntry(lastFomoNumWinsKey, (lastFomoNumWins + 1)), IntegerEntry(lastFomoWonAmountKey, (lastFomoWonAmount + fomoCurrJackpot))]
227241 else [IntegerEntry(currFomoJackpotKey, (fomoCurrJackpot + deltaCurrJackpot)), IntegerEntry(nextFomoJackpotKey, (fomoNextJackpot + deltaNextJackpot)), IntegerEntry(currFomoPeriodKey, nextFomoPeriod)]
228242 let addr = toString(i.caller)
229243 let fomoNumUniquePlayers = valueOrElse(getInteger(fomoNumUniquePlayersKey), 0)
230244 let userNumStakesKey = fomoUserNumStakesKey(addr)
231245 let userStakedAmountKey = fomoUserStakedAmountKey(addr)
232246 let userNumStakes = getInteger(userNumStakesKey)
233247 let statsActions = ((if (isDefined(userNumStakes))
234248 then [IntegerEntry(userNumStakesKey, (value(userNumStakes) + 1)), IntegerEntry(userStakedAmountKey, (valueOrElse(getInteger(userStakedAmountKey), 0) + BLESS_PRICE))]
235249 else [IntegerEntry(fomoNumUniquePlayersKey, (fomoNumUniquePlayers + 1)), IntegerEntry(userNumStakesKey, 1), IntegerEntry(userStakedAmountKey, BLESS_PRICE)]) ++ [IntegerEntry(fomoTotalNumStakesKey, (valueOrElse(getInteger(fomoTotalNumStakesKey), 0) + 1)), IntegerEntry(fomoTotalStakedAmountKey, (valueOrElse(getInteger(fomoTotalStakedAmountKey), 0) + BLESS_PRICE))])
236250 ((([IntegerEntry(lastFomoTimeKey, height), StringEntry(lastFomoPlayerKey, toString(i.caller)), ScriptTransfer(addressFromStringValue(getStringValue(teamWalletAddrKey)), deltaTeamAmount, gorcAssetId), IntegerEntry(stakersAmountLeftKey, (getIntegerValue(stakersAmountLeftKey) + deltaStakersAmount)), IntegerEntry(stakersAmountTotalKey, (getIntegerValue(stakersAmountTotalKey) + deltaStakersAmount))] ++ changeActions) ++ fomoActions) ++ statsActions)
237251 }
238252 }
239253 }
240254
241255
242256 func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
243257 then throw("maxValue should be > 0")
244258 else {
245259 let randomHash = sha256_16Kb((salt + entropy))
246260 (toInt(randomHash) % maxValue)
247261 }
248262
249263
250264 func walletInternal (userAddressOpt) = {
251265 let addr = addressFromString(userAddressOpt)
252266 let balance = if (isDefined(addr))
253267 then wavesBalance(value(addr))
254268 else BalanceDetails(0, 0, 0, 0)
255269 let gorcBalance = if (isDefined(addr))
256270 then assetBalance(value(addr), gorcAssetId)
257271 else 0
258272 let stakedGorc = valueOrElse(getInteger(stakedAmountByUserKey(userAddressOpt)), 0)
259273 [("%s%d__wavesBalance__" + toString(balance.available)), ("%s%d__gorcBalance__" + toString(gorcBalance)), ("%s%d__stakedGorc__" + toString(stakedGorc))]
260274 }
261275
262276
263277 @Callable(i)
264278 func testArgs (intVal,strVal,boolVal,binVal,arrInt,arrStr,arrBool,arrBin) = nil
265279
266280
267281
268282 @Callable(i)
269-func constructorV1 (teamWalletAddr,brokerAddr) = if ((i.caller != this))
283+func constructorV1 (teamWalletAddr,brokerAddr,reserveAddr) = if ((i.caller != this))
270284 then throw("Permission denied")
271285 else {
272286 let issuedAmount = M16
273287 let issue = Issue("GORC", "Meme coin by God of Random Chance. Visit https://gorc.meme, sacrifice to the God of Random and you will receive an answer to any question or a blessing. Lucky one gets a Gift of God", issuedAmount, 8, false, unit, 0)
274288 let assetId = calculateAssetId(issue)
275-[issue, BinaryEntry(gorcAssetIdKey, assetId), IntegerEntry(issueTimeKey, height), IntegerEntry(stakersAmountLeftKey, STAKERS_AMOUNT), IntegerEntry(stakersAmountTotalKey, STAKERS_AMOUNT), StringEntry(teamWalletAddrKey, teamWalletAddr), StringEntry(brokerAddrKey, brokerAddr), ScriptTransfer(addressFromStringValue(teamWalletAddr), TEAM_AMOUNT, assetId), ScriptTransfer(addressFromStringValue(brokerAddr), MARKET_AMOUNT, assetId), IntegerEntry(fomoEpochKey, 0), IntegerEntry(currFomoPeriodKey, DEFAULT_FOMO_PERIOD)]
289+[issue, BinaryEntry(gorcAssetIdKey, assetId), IntegerEntry(issueTimeKey, height), IntegerEntry(stakersAmountLeftKey, STAKERS_AMOUNT), IntegerEntry(stakersAmountTotalKey, STAKERS_AMOUNT), IntegerEntry(teamAmountLeftKey, TEAM_AMOUNT), IntegerEntry(lastTeamVestingTimeKey, height), StringEntry(teamWalletAddrKey, teamWalletAddr), StringEntry(brokerAddrKey, brokerAddr), StringEntry(reserveAddrKey, reserveAddr), ScriptTransfer(addressFromStringValue(reserveAddr), RESERVED_AMOUNT, assetId), ScriptTransfer(addressFromStringValue(brokerAddr), MARKET_AMOUNT, assetId), IntegerEntry(fomoEpochKey, 0), IntegerEntry(currFomoPeriodKey, DEFAULT_FOMO_PERIOD)]
276290 }
277291
278292
279293
280294 @Callable(i)
281295 func stakeGorc () = if ((size(i.payments) != 1))
282296 then throw("exactly 1 payment must be attached")
283297 else {
284298 let pmt = i.payments[0]
285299 let amt = pmt.amount
286300 if (if (!(isDefined(pmt.assetId)))
287301 then true
288302 else (value(pmt.assetId) != gorcAssetId))
289303 then throw("GORC payments only!")
290304 else {
291305 let addr = toString(i.caller)
292- let $t01216812219 = gorcStats(addr)
293- let userAmount = $t01216812219._1
294- let amountLeftTotal = $t01216812219._2
306+ let $t01391914001 = gorcStats(addr)
307+ let userAmount = $t01391914001._1
308+ let amountLeftTotal = $t01391914001._2
309+ let vestingAmount = $t01391914001._3
310+ let teamAmountLeft = $t01391914001._4
295311 let userAmountKey = stakedAmountByUserKey(addr)
296312 let claimActions = if ((userAmount > 0))
297313 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
298314 else nil
299- $Tuple2((claimActions ++ [IntegerEntry(stakedAmountTotalKey, (valueOrElse(getInteger(stakedAmountTotalKey), 0) + amt)), IntegerEntry(userAmountKey, (valueOrElse(getInteger(userAmountKey), 0) + amt)), IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), userAmount)
315+ let vestingActions = if ((vestingAmount > 0))
316+ then [ScriptTransfer(addressFromStringValue(getStringValue(teamWalletAddrKey)), vestingAmount, gorcAssetId), IntegerEntry(teamAmountLeftKey, teamAmountLeft), IntegerEntry(lastTeamVestingTimeKey, height)]
317+ else nil
318+ $Tuple2(((claimActions ++ vestingActions) ++ [IntegerEntry(stakedAmountTotalKey, (valueOrElse(getInteger(stakedAmountTotalKey), 0) + amt)), IntegerEntry(userAmountKey, (valueOrElse(getInteger(userAmountKey), 0) + amt)), IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), userAmount)
300319 }
301320 }
302321
303322
304323
305324 @Callable(i)
306325 func unstakeGorc (amount) = if ((0 >= amount))
307326 then throw("Amount should be positive")
308327 else {
309328 let addr = toString(i.caller)
310329 if ((size(i.payments) != 0))
311330 then throw("No payments required")
312331 else {
313332 let userAmountKey = stakedAmountByUserKey(addr)
314333 let oldAmount = valueOrElse(getInteger(userAmountKey), 0)
315334 if ((0 > (oldAmount - amount)))
316335 then throw(((("You have only " + fixedPoint(oldAmount, 8)) + " GORC staked, tried to unstake ") + fixedPoint(amount, 8)))
317336 else {
318- let $t01318013231 = gorcStats(addr)
319- let userAmount = $t01318013231._1
320- let amountLeftTotal = $t01318013231._2
337+ let $t01525615338 = gorcStats(addr)
338+ let userAmount = $t01525615338._1
339+ let amountLeftTotal = $t01525615338._2
340+ let vestingAmount = $t01525615338._3
341+ let teamAmountLeft = $t01525615338._4
321342 let claimActions = if ((userAmount > 0))
322343 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
323344 else nil
324- $Tuple2((claimActions ++ [IntegerEntry(stakedAmountTotalKey, (valueOrErrorMessage(getInteger(stakedAmountTotalKey), "No GORC staked") - amount)), IntegerEntry(userAmountKey, (oldAmount - amount)), IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), 0)
345+ let vestingActions = if ((vestingAmount > 0))
346+ then [ScriptTransfer(addressFromStringValue(getStringValue(teamWalletAddrKey)), vestingAmount, gorcAssetId), IntegerEntry(teamAmountLeftKey, teamAmountLeft), IntegerEntry(lastTeamVestingTimeKey, height)]
347+ else nil
348+ $Tuple2(((claimActions ++ vestingActions) ++ [IntegerEntry(stakedAmountTotalKey, (valueOrErrorMessage(getInteger(stakedAmountTotalKey), "No GORC staked") - amount)), IntegerEntry(userAmountKey, (oldAmount - amount)), IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), 0)
325349 }
326350 }
327351 }
328352
329353
330354
331355 @Callable(i)
332356 func claimGorc () = if ((size(i.payments) != 0))
333357 then throw("No payments required")
334358 else {
335359 let addr = toString(i.caller)
336- let $t01379513846 = gorcStats(addr)
337- let userAmount = $t01379513846._1
338- let amountLeftTotal = $t01379513846._2
360+ let $t01619616278 = gorcStats(addr)
361+ let userAmount = $t01619616278._1
362+ let amountLeftTotal = $t01619616278._2
363+ let vestingAmount = $t01619616278._3
364+ let teamAmountLeft = $t01619616278._4
339365 let claimActions = if ((userAmount > 0))
340366 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
341367 else nil
342- $Tuple2((claimActions ++ [IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), userAmount)
368+ let vestingActions = if ((vestingAmount > 0))
369+ then [ScriptTransfer(addressFromStringValue(getStringValue(teamWalletAddrKey)), vestingAmount, gorcAssetId), IntegerEntry(teamAmountLeftKey, teamAmountLeft), IntegerEntry(lastTeamVestingTimeKey, height)]
370+ else nil
371+ $Tuple2(((claimActions ++ vestingActions) ++ [IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), userAmount)
343372 }
344373
345374
346375
347376 @Callable(i)
348377 func answerMe () = $Tuple2(fomoInternal(i), toInt(i.transactionId))
349378
350379
351380
352381 @Callable(i)
353382 func blessMe () = $Tuple2(fomoInternal(i), 42)
354383
355384
356385
357386 @Callable(i)
358387 func commitGuess (guess) = {
359388 let addr = toString(i.caller)
360389 let finishKey = keyCommit(addr)
361390 let guessKey = keyGuess(addr)
362391 if (isDefined(getInteger(finishKey)))
363392 then throw("You already made a bet, please use it")
364393 else if (if ((0 > guess))
365394 then true
366395 else (guess > 11))
367396 then throw("The number should be between 0 and 11")
368397 else if ((size(i.payments) != 1))
369398 then throw("exactly 1 payment must be attached")
370399 else {
371400 let pmt = i.payments[0]
372401 let amt = pmt.amount
373402 if (if (!(isDefined(pmt.assetId)))
374403 then true
375404 else (value(pmt.assetId) != gorcAssetId))
376405 then throw("GORC payments only!")
377406 else {
378407 let change = (amt - LOTTERY_PRICE)
379408 if ((0 > change))
380409 then throw(((("You need to sacrifice " + fixedPoint(LOTTERY_PRICE, 8)) + " GORC, but I see only ") + fixedPoint(amt, 8)))
381410 else {
382411 let changeActions = if ((change > 0))
383412 then [ScriptTransfer(i.caller, change, gorcAssetId)]
384413 else nil
385414 let finishBlock = (height + RANDOM_DELAY)
386415 let deltaCurrJackpot = fraction(LOTTERY_PRICE, CURRENT_JACKPOT_PERC, 100)
387416 let deltaNextJackpot = fraction(LOTTERY_PRICE, NEXT_JACKPOT_PERC, 100)
388417 let deltaTeamAmount = fraction(LOTTERY_PRICE, TEAM_PERC, 100)
389418 let deltaStakersAmount = (((LOTTERY_PRICE - deltaCurrJackpot) - deltaNextJackpot) - deltaTeamAmount)
390419 $Tuple2(([IntegerEntry(finishKey, finishBlock), IntegerEntry(guessKey, guess), IntegerEntry(currLotteryJackpotKey, (valueOrElse(getInteger(currLotteryJackpotKey), 0) + deltaCurrJackpot)), IntegerEntry(nextLotteryJackpotKey, (valueOrElse(getInteger(nextLotteryJackpotKey), 0) + deltaNextJackpot)), ScriptTransfer(addressFromStringValue(getStringValue(teamWalletAddrKey)), deltaTeamAmount, gorcAssetId), IntegerEntry(stakersAmountLeftKey, (getIntegerValue(stakersAmountLeftKey) + deltaStakersAmount)), IntegerEntry(stakersAmountTotalKey, (getIntegerValue(stakersAmountTotalKey) + deltaStakersAmount)), StringEntry(keySalt(addr), toBase58String(i.transactionId))] ++ changeActions), finishBlock)
391420 }
392421 }
393422 }
394423 }
395424
396425
397426
398427 @Callable(i)
399428 func guessLottery () = {
400429 let addr = toString(i.caller)
401430 let finishKey = keyCommit(addr)
402431 let guessKey = keyGuess(addr)
403432 let guess = valueOrErrorMessage(getInteger(guessKey), "You have not made a bet")
404433 let finishBlock = valueOrErrorMessage(getInteger(finishKey), "You have not made a bet")
405434 if ((finishBlock > height))
406435 then throw(("Random number is not ready yet, wait until height = " + toString(finishBlock)))
407436 else {
408437 let entropy = value(value(blockInfoByHeight(finishBlock)).vrf)
409438 let saltKey = keySalt(addr)
410439 let salt = fromBase58String(valueOrElse(getString(saltKey), "DEFAULT"))
411440 let rand = getRandomNumber(12, salt, entropy)
412441 let currJackpot = valueOrElse(getInteger(currLotteryJackpotKey), 0)
413442 let winActions = if ((rand == guess))
414443 then [ScriptTransfer(i.caller, currJackpot, gorcAssetId), StringEntry(lastLotteryWinnerKey, addr), IntegerEntry(lastLotteryWinnerAmountKey, currJackpot), IntegerEntry(lastLotteryWinnerTimeKey, lastBlock.timestamp), IntegerEntry(currLotteryJackpotKey, valueOrElse(getInteger(nextLotteryJackpotKey), 0)), IntegerEntry(nextLotteryJackpotKey, 0)]
415444 else nil
416445 $Tuple2(([DeleteEntry(finishKey), DeleteEntry(guessKey), DeleteEntry(saltKey)] ++ winActions), rand)
417446 }
418447 }
419448
420449
421450
422451 @Callable(i)
423452 func statsREADONLY (userAddrOpt) = {
424- let $t01819518253 = gorcStats(userAddrOpt)
425- let userAmount = $t01819518253._1
426- let amountLeftTotal = $t01819518253._2
453+ let $t02092121010 = gorcStats(userAddrOpt)
454+ let userAmount = $t02092121010._1
455+ let amountLeftTotal = $t02092121010._2
456+ let vestingAmount = $t02092121010._3
457+ let teamAmountLeft = $t02092121010._4
427458 let currFomoJackpot = valueOrElse(getInteger(currFomoJackpotKey), 0)
428459 let nextFomoJackpot = valueOrElse(getInteger(nextFomoJackpotKey), 0)
429460 let lastFomoTime = valueOrElse(getInteger(lastFomoTimeKey), 0)
430461 let lastFomoPlayer = valueOrElse(getString(lastFomoPlayerKey), "")
431462 let fomoEpoch = valueOrElse(getInteger(fomoEpochKey), 0)
432463 let currFomoPeriod = valueOrElse(getInteger(currFomoPeriodKey), DEFAULT_FOMO_PERIOD)
433464 let currLotteryJackpot = valueOrElse(getInteger(currLotteryJackpotKey), 0)
434465 let nextLotteryJackpot = valueOrElse(getInteger(nextLotteryJackpotKey), 0)
435466 let finishKey = keyCommit(userAddrOpt)
436467 let guessKey = keyGuess(userAddrOpt)
437468 let guess = valueOrElse(getInteger(guessKey), -1)
438469 let finishBlock = valueOrElse(getInteger(finishKey), -1)
439470 let lastFomoWinner = valueOrElse(getString(lastFomoWinnerKey), "")
440471 let lastFomoWinnerAmount = valueOrElse(getInteger(lastFomoWinnerAmountKey), 0)
441472 let lastFomoWinnerTime = valueOrElse(getInteger(lastFomoWinnerTimeKey), 0)
442473 let lastLotteryWinner = valueOrElse(getString(lastLotteryWinnerKey), "")
443474 let lastLotteryWinnerAmount = valueOrElse(getInteger(lastLotteryWinnerAmountKey), 0)
444475 let lastLotteryWinnerTime = valueOrElse(getInteger(lastLotteryWinnerTimeKey), 0)
445476 let gorcStakedTotal = valueOrElse(getInteger(stakedAmountTotalKey), 0)
446477 let fomoNumUniquePlayers = valueOrElse(getInteger(fomoNumUniquePlayersKey), 0)
447478 let fomoTotalNumStakes = valueOrElse(getInteger(fomoTotalNumStakesKey), 0)
448479 let fomoTotalStakedAmount = valueOrElse(getInteger(fomoTotalStakedAmountKey), 0)
449480 let fomoUserNumStakes = valueOrElse(getInteger(fomoUserNumStakesKey(userAddrOpt)), 0)
450481 let fomoUserStakedAmount = valueOrElse(getInteger(fomoUserStakedAmountKey(userAddrOpt)), 0)
451482 let fomoUserNumWins = valueOrElse(getInteger(fomoUserNumWinsKey(userAddrOpt)), 0)
452483 let fomoUserWonAmount = valueOrElse(getInteger(fomoUserWonAmountKey(userAddrOpt)), 0)
453484 let fomoFavoriteByNumGames = valueOrElse(getString(fomoFavoriteByNumGamesKey), "")
454485 let fomoFavoriteByAmount = valueOrElse(getString(fomoFavoriteByAmountKey), "")
455- $Tuple2(nil, [("%s%d__gorcAvailToClaim__" + toString(userAmount)), ("%s%d__fomoEpoch__" + toString(fomoEpoch)), ("%s%d__currFomoPeriod__" + toString(currFomoPeriod)), ("%s%d__currFomoJackpotAmount__" + toString(currFomoJackpot)), ("%s%d__nextFomoJackpotAmount__" + toString(nextFomoJackpot)), ("%s%d__currLotteryJackpotAmount__" + toString(currLotteryJackpot)), ("%s%d__nextLotteryJackpotAmount__" + toString(nextLotteryJackpot)), ("%s%d__lastFomoTime__" + toString(lastFomoTime)), ("%s%s__lastFomoPlayer__" + lastFomoPlayer), ("%s%d__amountLeftTotal__" + toString(amountLeftTotal)), ("%s%d__finishBlock__" + toString(finishBlock)), ("%s%d__guess__" + toString(guess)), ("%s%s__lastFomoWinner__" + lastFomoWinner), ("%s%d__lastFomoWinnerAmount__" + toString(lastFomoWinnerAmount)), ("%s%d__lastFomoWinnerTime__" + toString(lastFomoWinnerTime)), ("%s%s__lastLotteryWinner__" + lastLotteryWinner), ("%s%d__lastLotteryWinnerAmount__" + toString(lastLotteryWinnerAmount)), ("%s%d__lastLotteryWinnerTime__" + toString(lastLotteryWinnerTime)), ("%s%d__gorcIssued__" + toString(M16)), ("%s%d__gorcStakedTotal__" + toString(gorcStakedTotal)), ("%s%d__fomoNumUniquePlayers__" + toString(fomoNumUniquePlayers)), ("%s%d__fomoTotalNumStakes__" + toString(fomoTotalNumStakes)), ("%s%d__fomoTotalStakedAmount__" + toString(fomoTotalStakedAmount)), ("%s%d__fomoUserNumStakes__" + toString(fomoUserNumStakes)), ("%s%d__fomoUserStakedAmount__" + toString(fomoUserStakedAmount)), ("%s%d__fomoUserNumWins__" + toString(fomoUserNumWins)), ("%s%d__fomoUserWonAmount__" + toString(fomoUserWonAmount)), ("%s%s__fomoFavoriteByNumGames__" + fomoFavoriteByNumGames), ("%s%s__fomoFavoriteByAmount__" + fomoFavoriteByAmount)])
486+ $Tuple2(nil, [("%s%d__teamAvailToVest__" + toString(vestingAmount)), ("%s%d__teamAmountLeft__" + toString(teamAmountLeft)), ("%s%d__gorcAvailToClaim__" + toString(userAmount)), ("%s%d__fomoEpoch__" + toString(fomoEpoch)), ("%s%d__currFomoPeriod__" + toString(currFomoPeriod)), ("%s%d__currFomoJackpotAmount__" + toString(currFomoJackpot)), ("%s%d__nextFomoJackpotAmount__" + toString(nextFomoJackpot)), ("%s%d__currLotteryJackpotAmount__" + toString(currLotteryJackpot)), ("%s%d__nextLotteryJackpotAmount__" + toString(nextLotteryJackpot)), ("%s%d__lastFomoTime__" + toString(lastFomoTime)), ("%s%s__lastFomoPlayer__" + lastFomoPlayer), ("%s%d__amountLeftTotal__" + toString(amountLeftTotal)), ("%s%d__finishBlock__" + toString(finishBlock)), ("%s%d__guess__" + toString(guess)), ("%s%s__lastFomoWinner__" + lastFomoWinner), ("%s%d__lastFomoWinnerAmount__" + toString(lastFomoWinnerAmount)), ("%s%d__lastFomoWinnerTime__" + toString(lastFomoWinnerTime)), ("%s%s__lastLotteryWinner__" + lastLotteryWinner), ("%s%d__lastLotteryWinnerAmount__" + toString(lastLotteryWinnerAmount)), ("%s%d__lastLotteryWinnerTime__" + toString(lastLotteryWinnerTime)), ("%s%d__gorcIssued__" + toString(M16)), ("%s%d__gorcStakedTotal__" + toString(gorcStakedTotal)), ("%s%d__fomoNumUniquePlayers__" + toString(fomoNumUniquePlayers)), ("%s%d__fomoTotalNumStakes__" + toString(fomoTotalNumStakes)), ("%s%d__fomoTotalStakedAmount__" + toString(fomoTotalStakedAmount)), ("%s%d__fomoUserNumStakes__" + toString(fomoUserNumStakes)), ("%s%d__fomoUserStakedAmount__" + toString(fomoUserStakedAmount)), ("%s%d__fomoUserNumWins__" + toString(fomoUserNumWins)), ("%s%d__fomoUserWonAmount__" + toString(fomoUserWonAmount)), ("%s%s__fomoFavoriteByNumGames__" + fomoFavoriteByNumGames), ("%s%s__fomoFavoriteByAmount__" + fomoFavoriteByAmount)])
456487 }
457488
458489
459490
460491 @Callable(i)
461492 func walletInfoREADONLY (userAddressOpt) = $Tuple2(nil, walletInternal(userAddressOpt))
462493
463494

github/deemru/w8io/169f3d6 
75.96 ms