tx · 6ozQ3mkGfpZQNF9Jy1XBNJVvR2c33mQKVpvSyFMXm2uq

3NCGjbgqZVk7eaqrLMEnEnqRhozNm1KTG5z:  -0.01200000 Waves

2025.01.03 20:45 [3443337] smart account 3NCGjbgqZVk7eaqrLMEnEnqRhozNm1KTG5z > SELF 0.00000000 Waves

{ "type": 13, "id": "6ozQ3mkGfpZQNF9Jy1XBNJVvR2c33mQKVpvSyFMXm2uq", "fee": 1200000, "feeAssetId": null, "timestamp": 1735926333522, "version": 2, "chainId": 84, "sender": "3NCGjbgqZVk7eaqrLMEnEnqRhozNm1KTG5z", "senderPublicKey": "5CoDbXxoqnvJpx9GrS6M4G5GYJXh9rcoiXJz7RYTPVkL", "proofs": [ "38fE3FaDYmbGYhb7NbPiG67WJTpXmbjZZQMWEP8JMCHe1U5yqwUbn5JhRWCt8hpP4gSSUhqtdFrpNAEHpVy8WzoY" ], "script": "base64:BgItCAISCgoIAQgEAhEYFBISBAoCCAgSABIDCgEBEgASABIAEgMKAQESABIDCgEIJQADTTE2AICAhP6m3uERAA5TVEFLRVJTX0FNT1VOVACAgM7yvo+qBQALVEVBTV9BTU9VTlQAgICapuqv4wEADU1BUktFVF9BTU9VTlQAgICc5f2e1AoAC1lFQVJfQkxPQ0tTCQBoAgDtAgCgCwAMU1RBS0VfUEVSSU9ECQBoAgAFBQtZRUFSX0JMT0NLUwALQkxFU1NfUFJJQ0UAgNDbw/QCAA1MT1RURVJZX1BSSUNFAIDQ28P0AgALRk9NT19QRVJJT0QAPAAMUkFORE9NX0RFTEFZAAIAFENVUlJFTlRfSkFDS1BPVF9QRVJDADIAEU5FWFRfSkFDS1BPVF9QRVJDABQADFNUQUtFUlNfUEVSQwAUAAlURUFNX1BFUkMACgAOZ29yY0Fzc2V0SWRLZXkCC2dvcmNBc3NldElkAAtnb3JjQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQChCAEFDmdvcmNBc3NldElkS2V5AhZHT1JDIGlzIG5vdCBpc3N1ZWQgeWV0AAxpc3N1ZVRpbWVLZXkCCWlzc3VlVGltZQAVc3Rha2Vyc0Ftb3VudFRvdGFsS2V5AhJzdGFrZXJzQW1vdW50VG90YWwAFHN0YWtlcnNBbW91bnRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAAUc3Rha2VkQW1vdW50VG90YWxLZXkCC3N0YWtlZFRvdGFsARVzdGFrZWRBbW91bnRCeVVzZXJLZXkBBGFkZHIJAKwCAgINc3Rha2VkQW1vdW50XwUEYWRkcgEWbGFzdENsYWltVGltZUJ5VXNlcktleQEEYWRkcgkArAICAg5sYXN0Q2xhaW1UaW1lXwUEYWRkcgAPbGFzdEZvbW9UaW1lS2V5AgxsYXN0Rm9tb1RpbWUAEmN1cnJGb21vSmFja3BvdEtleQIPY3VyckZvbW9KYWNrcG90ABJuZXh0Rm9tb0phY2twb3RLZXkCD25leHRGb21vSmFja3BvdAARbGFzdEZvbW9QbGF5ZXJLZXkCDmxhc3RGb21vUGxheWVyABF0ZWFtV2FsbGV0QWRkcktleQIOdGVhbVdhbGxldEFkZHIADWJyb2tlckFkZHJLZXkCCmJyb2tlckFkZHIBCWtleUNvbW1pdAEHYWRkcmVzcwkArAICAg9maW5pc2hCbG9ja0Zvcl8FB2FkZHJlc3MBCGtleUd1ZXNzAQdhZGRyZXNzCQCsAgICCWd1ZXNzRm9yXwUHYWRkcmVzcwEHa2V5U2FsdAEHYWRkcmVzcwkArAICAghzYWx0Rm9yXwUHYWRkcmVzcwAVY3VyckxvdHRlcnlKYWNrcG90S2V5AhJjdXJyTG90dGVyeUphY2twb3QAFW5leHRMb3R0ZXJ5SmFja3BvdEtleQISbmV4dExvdHRlcnlKYWNrcG90AQlnb3JjU3RhdHMBC3VzZXJBZGRyT3B0BA9hbW91bnRMZWZ0VG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUc3Rha2Vyc0Ftb3VudExlZnRLZXkAAAQMbGFzdFVzZXJUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEJARZsYXN0Q2xhaW1UaW1lQnlVc2VyS2V5AQULdXNlckFkZHJPcHQA////////////AQMJAGYCAAAFDGxhc3RVc2VyVGltZQkAlAoCAAAFD2Ftb3VudExlZnRUb3RhbAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUMaXNzdWVUaW1lS2V5AhZHT1JDIGlzIG5vdCBpc3N1ZWQgeWV0BApub3dMaW1pdGVkCQCXAwEJAMwIAgUGaGVpZ2h0CQDMCAIJAGQCBQlpc3N1ZVRpbWUFDFNUQUtFX1BFUklPRAUDbmlsBAp1c2VyU2hhcmVzCQELdmFsdWVPckVsc2UCCQCfCAEJARVzdGFrZWRBbW91bnRCeVVzZXJLZXkBBQt1c2VyQWRkck9wdAAABAt0b3RhbFNoYXJlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRzdGFrZWRBbW91bnRUb3RhbEtleQAABBJzdGFrZXJzQW1vdW50VG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVc3Rha2Vyc0Ftb3VudFRvdGFsS2V5BQ5TVEFLRVJTX0FNT1VOVAQMdXNlclRlbXBvcmFsCQBrAwUSc3Rha2Vyc0Ftb3VudFRvdGFsCQBlAgUKbm93TGltaXRlZAUMbGFzdFVzZXJUaW1lBQxTVEFLRV9QRVJJT0QECnVzZXJBbW91bnQDCQECIT0CBQt0b3RhbFNoYXJlcwAACQBrAwUMdXNlclRlbXBvcmFsBQp1c2VyU2hhcmVzBQt0b3RhbFNoYXJlcwAACQCUCgIFCnVzZXJBbW91bnQJAGUCBQ9hbW91bnRMZWZ0VG90YWwFCnVzZXJBbW91bnQBCmZpeGVkUG9pbnQCA3ZhbAhkZWNpbWFscwQGdGVuUG93CQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgQHbG93UGFydAkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cEBnplcm9lcwkAsAICCQCkAwEFBnRlblBvdwkAZAIAAQkAsQIBBQdsb3dQYXJ0CQCsAgIJAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgUGemVyb2VzBQdsb3dQYXJ0AQxmb21vSW50ZXJuYWwBAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC2dvcmNBc3NldElkCQACAQITR09SQyBwYXltZW50cyBvbmx5IQQGY2hhbmdlCQBlAgUDYW10BQtCTEVTU19QUklDRQMJAGYCAAAFBmNoYW5nZQkAAgEJAKwCAgkArAICCQCsAgICFllvdSBuZWVkIHRvIHNhY3JpZmljZSAJAQpmaXhlZFBvaW50AgULQkxFU1NfUFJJQ0UACAIWIEdPUkMsIGJ1dCBJIHNlZSBvbmx5IAkBCmZpeGVkUG9pbnQCBQNhbXQACAQNY2hhbmdlQWN0aW9ucwMJAGYCBQZjaGFuZ2UAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmNoYW5nZQULZ29yY0Fzc2V0SWQFA25pbAUDbmlsBAxsYXN0Rm9tb1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPbGFzdEZvbW9UaW1lS2V5AAAEDmxhc3RGb21vUGxheWVyCQELdmFsdWVPckVsc2UCCQCiCAEFEWxhc3RGb21vUGxheWVyS2V5AgAEEGRlbHRhQ3VyckphY2twb3QJAGsDBQtCTEVTU19QUklDRQUUQ1VSUkVOVF9KQUNLUE9UX1BFUkMAZAQQZGVsdGFOZXh0SmFja3BvdAkAawMFC0JMRVNTX1BSSUNFBRFORVhUX0pBQ0tQT1RfUEVSQwBkBA9kZWx0YVRlYW1BbW91bnQJAGsDBQtCTEVTU19QUklDRQUJVEVBTV9QRVJDAGQEEmRlbHRhU3Rha2Vyc0Ftb3VudAkAZQIJAGUCCQBlAgULQkxFU1NfUFJJQ0UFEGRlbHRhQ3VyckphY2twb3QFEGRlbHRhTmV4dEphY2twb3QFD2RlbHRhVGVhbUFtb3VudAQPZm9tb0N1cnJKYWNrcG90CQELdmFsdWVPckVsc2UCCQCfCAEFEmN1cnJGb21vSmFja3BvdEtleQAABA9mb21vTmV4dEphY2twb3QJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSbmV4dEZvbW9KYWNrcG90S2V5AAAEC2ZvbW9BY3Rpb25zAwMDCQBmAgUGaGVpZ2h0CQBkAgUMbGFzdEZvbW9UaW1lBQtGT01PX1BFUklPRAkAZgIFD2ZvbW9DdXJySmFja3BvdAAABwkBAiE9AgUObGFzdEZvbW9QbGF5ZXICAAcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUObGFzdEZvbW9QbGF5ZXIFD2ZvbW9DdXJySmFja3BvdAULZ29yY0Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEmN1cnJGb21vSmFja3BvdEtleQkAZAIFD2ZvbW9OZXh0SmFja3BvdAUQZGVsdGFDdXJySmFja3BvdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSbmV4dEZvbW9KYWNrcG90S2V5BRBkZWx0YU5leHRKYWNrcG90BQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEmN1cnJGb21vSmFja3BvdEtleQkAZAIFD2ZvbW9DdXJySmFja3BvdAUQZGVsdGFDdXJySmFja3BvdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSbmV4dEZvbW9KYWNrcG90S2V5CQBkAgUPZm9tb05leHRKYWNrcG90BRBkZWx0YU5leHRKYWNrcG90BQNuaWwJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9sYXN0Rm9tb1RpbWVLZXkFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCBRFsYXN0Rm9tb1BsYXllcktleQkApQgBCAUBaQZjYWxsZXIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQURdGVhbVdhbGxldEFkZHJLZXkFD2RlbHRhVGVhbUFtb3VudAULZ29yY0Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFFHN0YWtlcnNBbW91bnRMZWZ0S2V5CQBkAgkBEUBleHRyTmF0aXZlKDEwNTUpAQUUc3Rha2Vyc0Ftb3VudExlZnRLZXkFEmRlbHRhU3Rha2Vyc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVc3Rha2Vyc0Ftb3VudFRvdGFsS2V5CQBkAgkBEUBleHRyTmF0aXZlKDEwNTUpAQUVc3Rha2Vyc0Ftb3VudFRvdGFsS2V5BRJkZWx0YVN0YWtlcnNBbW91bnQFA25pbAUNY2hhbmdlQWN0aW9ucwULZm9tb0FjdGlvbnMBD2dldFJhbmRvbU51bWJlcgMIbWF4VmFsdWUEc2FsdAdlbnRyb3B5AwkAZwIAAAUIbWF4VmFsdWUJAAIBAhZtYXhWYWx1ZSBzaG91bGQgYmUgPiAwBApyYW5kb21IYXNoCQDUFgEJAMsBAgUEc2FsdAUHZW50cm9weQkAagIJALEJAQUKcmFuZG9tSGFzaAUIbWF4VmFsdWUKAWkBCHRlc3RBcmdzCAZpbnRWYWwGc3RyVmFsB2Jvb2xWYWwGYmluVmFsBmFyckludAZhcnJTdHIHYXJyQm9vbAZhcnJCaW4FA25pbAFpAQ1jb25zdHJ1Y3RvclYxAg50ZWFtV2FsbGV0QWRkcgpicm9rZXJBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDGlzc3VlZEFtb3VudAUDTTE2BAVpc3N1ZQkAwwgHAgRHT1JDArUBTWVtZSBjb2luIGJ5IEdvZCBvZiBSYW5kb20gQ2hhbmNlLiBWaXNpdCBodHRwczovL2dvcmMubWVtZSwgc2FjcmlmaWNlIHRvIHRoZSBHb2Qgb2YgUmFuZG9tIGFuZCB5b3Ugd2lsbCByZWNlaXZlIGFuIGFuc3dlciB0byBhbnkgcXVlc3Rpb24gb3IgYSBibGVzc2luZy4gTHVja3kgb25lIGdldHMgYSBHaWZ0IG9mIEdvZAUMaXNzdWVkQW1vdW50AAgHBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUFaXNzdWUJAMwIAgUFaXNzdWUJAMwIAgkBC0JpbmFyeUVudHJ5AgUOZ29yY0Fzc2V0SWRLZXkFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDGlzc3VlVGltZUtleQUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQUOU1RBS0VSU19BTU9VTlQJAMwIAgkBDEludGVnZXJFbnRyeQIFFXN0YWtlcnNBbW91bnRUb3RhbEtleQUOU1RBS0VSU19BTU9VTlQJAMwIAgkBC1N0cmluZ0VudHJ5AgURdGVhbVdhbGxldEFkZHJLZXkFDnRlYW1XYWxsZXRBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWJyb2tlckFkZHJLZXkFCmJyb2tlckFkZHIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUOdGVhbVdhbGxldEFkZHIFC1RFQU1fQU1PVU5UBQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCmJyb2tlckFkZHIFDU1BUktFVF9BTU9VTlQFB2Fzc2V0SWQFA25pbAFpAQlzdGFrZUdvcmMAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQtnb3JjQXNzZXRJZAkAAgECE0dPUkMgcGF5bWVudHMgb25seSEEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAskdDA2NDMwNjQ4MQkBCWdvcmNTdGF0cwEFBGFkZHIECnVzZXJBbW91bnQIBQskdDA2NDMwNjQ4MQJfMQQPYW1vdW50TGVmdFRvdGFsCAULJHQwNjQzMDY0ODECXzIEDXVzZXJBbW91bnRLZXkJARVzdGFrZWRBbW91bnRCeVVzZXJLZXkBBQRhZGRyBAxjbGFpbUFjdGlvbnMDCQBmAgUKdXNlckFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKdXNlckFtb3VudAULZ29yY0Fzc2V0SWQFA25pbAUDbmlsCQCUCgIJAM4IAgUMY2xhaW1BY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZWRBbW91bnRUb3RhbEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUc3Rha2VkQW1vdW50VG90YWxLZXkAAAUDYW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ11c2VyQW1vdW50S2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ11c2VyQW1vdW50S2V5AAAFA2FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmxhc3RDbGFpbVRpbWVCeVVzZXJLZXkBBQRhZGRyBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFFHN0YWtlcnNBbW91bnRMZWZ0S2V5BQ9hbW91bnRMZWZ0VG90YWwFA25pbAUKdXNlckFtb3VudAFpAQt1bnN0YWtlR29yYwEGYW1vdW50AwkAZwIAAAUGYW1vdW50CQACAQIZQW1vdW50IHNob3VsZCBiZSBwb3NpdGl2ZQQEYWRkcgkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQNdXNlckFtb3VudEtleQkBFXN0YWtlZEFtb3VudEJ5VXNlcktleQEFBGFkZHIECW9sZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ11c2VyQW1vdW50S2V5AAADCQBmAgAACQBlAgUJb2xkQW1vdW50BQZhbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAg5Zb3UgaGF2ZSBvbmx5IAkBCmZpeGVkUG9pbnQCBQlvbGRBbW91bnQACAIfIEdPUkMgc3Rha2VkLCB0cmllZCB0byB1bnN0YWtlIAkBCmZpeGVkUG9pbnQCBQZhbW91bnQACAQLJHQwNzQ0Mjc0OTMJAQlnb3JjU3RhdHMBBQRhZGRyBAp1c2VyQW1vdW50CAULJHQwNzQ0Mjc0OTMCXzEED2Ftb3VudExlZnRUb3RhbAgFCyR0MDc0NDI3NDkzAl8yBAxjbGFpbUFjdGlvbnMDCQBmAgUKdXNlckFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKdXNlckFtb3VudAULZ29yY0Fzc2V0SWQFA25pbAUDbmlsCQCUCgIJAM4IAgUMY2xhaW1BY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZWRBbW91bnRUb3RhbEtleQkAZQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRRzdGFrZWRBbW91bnRUb3RhbEtleQIOTm8gR09SQyBzdGFrZWQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdXNlckFtb3VudEtleQkAZQIFCW9sZEFtb3VudAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWbGFzdENsYWltVGltZUJ5VXNlcktleQEFBGFkZHIFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkFD2Ftb3VudExlZnRUb3RhbAUDbmlsAAABaQEJY2xhaW1Hb3JjAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQLJHQwODA1NzgxMDgJAQlnb3JjU3RhdHMBBQRhZGRyBAp1c2VyQW1vdW50CAULJHQwODA1NzgxMDgCXzEED2Ftb3VudExlZnRUb3RhbAgFCyR0MDgwNTc4MTA4Al8yBAxjbGFpbUFjdGlvbnMDCQBmAgUKdXNlckFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKdXNlckFtb3VudAULZ29yY0Fzc2V0SWQFA25pbAUDbmlsCQCUCgIJAM4IAgUMY2xhaW1BY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWbGFzdENsYWltVGltZUJ5VXNlcktleQEFBGFkZHIFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkFD2Ftb3VudExlZnRUb3RhbAUDbmlsBQp1c2VyQW1vdW50AWkBCGFuc3dlck1lAAkAlAoCCQEMZm9tb0ludGVybmFsAQUBaQkAsQkBCAUBaQ10cmFuc2FjdGlvbklkAWkBB2JsZXNzTWUACQCUCgIJAQxmb21vSW50ZXJuYWwBBQFpACoBaQELY29tbWl0R3Vlc3MBBWd1ZXNzBARhZGRyCQClCAEIBQFpBmNhbGxlcgQJZmluaXNoS2V5CQEJa2V5Q29tbWl0AQUEYWRkcgQIZ3Vlc3NLZXkJAQhrZXlHdWVzcwEFBGFkZHIDCQEJaXNEZWZpbmVkAQkAnwgBBQlmaW5pc2hLZXkJAAIBAiVZb3UgYWxyZWFkeSBtYWRlIGEgYmV0LCBwbGVhc2UgdXNlIGl0AwMJAGYCAAAFBWd1ZXNzBgkAZgIFBWd1ZXNzAAsJAAIBAiVUaGUgbnVtYmVyIHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDExAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQtnb3JjQXNzZXRJZAkAAgECE0dPUkMgcGF5bWVudHMgb25seSEEBmNoYW5nZQkAZQIFA2FtdAUNTE9UVEVSWV9QUklDRQMJAGYCAAAFBmNoYW5nZQkAAgEJAKwCAgkArAICCQCsAgICFllvdSBuZWVkIHRvIHNhY3JpZmljZSAJAQpmaXhlZFBvaW50AgUNTE9UVEVSWV9QUklDRQAIAhYgR09SQywgYnV0IEkgc2VlIG9ubHkgCQEKZml4ZWRQb2ludAIFA2FtdAAIBA1jaGFuZ2VBY3Rpb25zAwkAZgIFBmNoYW5nZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGY2hhbmdlBQtnb3JjQXNzZXRJZAUDbmlsBQNuaWwEC2ZpbmlzaEJsb2NrCQBkAgUGaGVpZ2h0BQxSQU5ET01fREVMQVkEEGRlbHRhQ3VyckphY2twb3QJAGsDBQ1MT1RURVJZX1BSSUNFBRRDVVJSRU5UX0pBQ0tQT1RfUEVSQwBkBBBkZWx0YU5leHRKYWNrcG90CQBrAwUNTE9UVEVSWV9QUklDRQURTkVYVF9KQUNLUE9UX1BFUkMAZAQPZGVsdGFUZWFtQW1vdW50CQBrAwUNTE9UVEVSWV9QUklDRQUJVEVBTV9QRVJDAGQEEmRlbHRhU3Rha2Vyc0Ftb3VudAkAZQIJAGUCCQBlAgUNTE9UVEVSWV9QUklDRQUQZGVsdGFDdXJySmFja3BvdAUQZGVsdGFOZXh0SmFja3BvdAUPZGVsdGFUZWFtQW1vdW50CQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJZmluaXNoS2V5BQtmaW5pc2hCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgUIZ3Vlc3NLZXkFBWd1ZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVjdXJyTG90dGVyeUphY2twb3RLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFFWN1cnJMb3R0ZXJ5SmFja3BvdEtleQAABRBkZWx0YUN1cnJKYWNrcG90CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVuZXh0TG90dGVyeUphY2twb3RLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFFW5leHRMb3R0ZXJ5SmFja3BvdEtleQAABRBkZWx0YU5leHRKYWNrcG90CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFEXRlYW1XYWxsZXRBZGRyS2V5BQ9kZWx0YVRlYW1BbW91bnQFC2dvcmNBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAZAIJARFAZXh0ck5hdGl2ZSgxMDU1KQEFFHN0YWtlcnNBbW91bnRMZWZ0S2V5BRJkZWx0YVN0YWtlcnNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFXN0YWtlcnNBbW91bnRUb3RhbEtleQkAZAIJARFAZXh0ck5hdGl2ZSgxMDU1KQEFFXN0YWtlcnNBbW91bnRUb3RhbEtleQUSZGVsdGFTdGFrZXJzQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlTYWx0AQUEYWRkcgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQNuaWwFDWNoYW5nZUFjdGlvbnMFC2ZpbmlzaEJsb2NrAWkBDGd1ZXNzTG90dGVyeQAEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAlmaW5pc2hLZXkJAQlrZXlDb21taXQBBQRhZGRyBAhndWVzc0tleQkBCGtleUd1ZXNzAQUEYWRkcgQFZ3Vlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQhndWVzc0tleQIXWW91IGhhdmUgbm90IG1hZGUgYSBiZXQEC2ZpbmlzaEJsb2NrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUJZmluaXNoS2V5AhdZb3UgaGF2ZSBub3QgbWFkZSBhIGJldAMJAGYCBQtmaW5pc2hCbG9jawUGaGVpZ2h0CQACAQkArAICAjRSYW5kb20gbnVtYmVyIGlzIG5vdCByZWFkeSB5ZXQsIHdhaXQgdW50aWwgaGVpZ2h0ID0gCQCkAwEFC2ZpbmlzaEJsb2NrBAdlbnRyb3B5CQEFdmFsdWUBCAkBBXZhbHVlAQkA7QcBBQtmaW5pc2hCbG9jawN2cmYEB3NhbHRLZXkJAQdrZXlTYWx0AQUEYWRkcgQEc2FsdAkA2QQBCQELdmFsdWVPckVsc2UCCQCiCAEFB3NhbHRLZXkCB0RFRkFVTFQEBHJhbmQJAQ9nZXRSYW5kb21OdW1iZXIDAAwFBHNhbHQFB2VudHJvcHkEC2N1cnJKYWNrcG90CQELdmFsdWVPckVsc2UCCQCfCAEFFWN1cnJMb3R0ZXJ5SmFja3BvdEtleQAABAp3aW5BY3Rpb25zAwkAAAIFBHJhbmQFBWd1ZXNzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULY3VyckphY2twb3QFC2dvcmNBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVjdXJyTG90dGVyeUphY2twb3RLZXkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVbmV4dExvdHRlcnlKYWNrcG90S2V5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFFW5leHRMb3R0ZXJ5SmFja3BvdEtleQAABQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQUJZmluaXNoS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEFCGd1ZXNzS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEFB3NhbHRLZXkFA25pbAUKd2luQWN0aW9ucwUEcmFuZAFpAQ1zdGF0c1JFQURPTkxZAQt1c2VyQWRkck9wdAQNJHQwMTE5MDIxMTk2MAkBCWdvcmNTdGF0cwEFC3VzZXJBZGRyT3B0BAp1c2VyQW1vdW50CAUNJHQwMTE5MDIxMTk2MAJfMQQPYW1vdW50TGVmdFRvdGFsCAUNJHQwMTE5MDIxMTk2MAJfMgQPY3VyckZvbW9KYWNrcG90CQELdmFsdWVPckVsc2UCCQCfCAEFEmN1cnJGb21vSmFja3BvdEtleQAABA9uZXh0Rm9tb0phY2twb3QJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSbmV4dEZvbW9KYWNrcG90S2V5AAAEDGxhc3RGb21vVGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9sYXN0Rm9tb1RpbWVLZXkAAAQObGFzdEZvbW9QbGF5ZXIJAQt2YWx1ZU9yRWxzZQIJAKIIAQURbGFzdEZvbW9QbGF5ZXJLZXkCAAQSY3VyckxvdHRlcnlKYWNrcG90CQELdmFsdWVPckVsc2UCCQCfCAEFFWN1cnJMb3R0ZXJ5SmFja3BvdEtleQAABBJuZXh0TG90dGVyeUphY2twb3QJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVbmV4dExvdHRlcnlKYWNrcG90S2V5AAAECWZpbmlzaEtleQkBCWtleUNvbW1pdAEFC3VzZXJBZGRyT3B0BAhndWVzc0tleQkBCGtleUd1ZXNzAQULdXNlckFkZHJPcHQEBWd1ZXNzCQELdmFsdWVPckVsc2UCCQCfCAEFCGd1ZXNzS2V5AP///////////wEEC2ZpbmlzaEJsb2NrCQELdmFsdWVPckVsc2UCCQCfCAEFCWZpbmlzaEtleQD///////////8BCQCUCgIFA25pbAkAzAgCCQCsAgICGCVzJWRfX2dvcmNBdmFpbFRvQ2xhaW1fXwkApAMBBQp1c2VyQW1vdW50CQDMCAIJAKwCAgIdJXMlZF9fY3VyckZvbW9KYWNrcG90QW1vdW50X18JAKQDAQUPY3VyckZvbW9KYWNrcG90CQDMCAIJAKwCAgIdJXMlZF9fbmV4dEZvbW9KYWNrcG90QW1vdW50X18JAKQDAQUPbmV4dEZvbW9KYWNrcG90CQDMCAIJAKwCAgIgJXMlZF9fY3VyckxvdHRlcnlKYWNrcG90QW1vdW50X18JAKQDAQUSY3VyckxvdHRlcnlKYWNrcG90CQDMCAIJAKwCAgIgJXMlZF9fbmV4dExvdHRlcnlKYWNrcG90QW1vdW50X18JAKQDAQUSbmV4dExvdHRlcnlKYWNrcG90CQDMCAIJAKwCAgIUJXMlZF9fbGFzdEZvbW9UaW1lX18JAKQDAQUMbGFzdEZvbW9UaW1lCQDMCAIJAKwCAgIWJXMlc19fbGFzdEZvbW9QbGF5ZXJfXwUObGFzdEZvbW9QbGF5ZXIJAMwIAgkArAICAhclcyVkX19hbW91bnRMZWZ0VG90YWxfXwkApAMBBQ9hbW91bnRMZWZ0VG90YWwJAMwIAgkArAICAhMlcyVkX19maW5pc2hCbG9ja19fCQCkAwEFC2ZpbmlzaEJsb2NrCQDMCAIJAKwCAgINJXMlZF9fZ3Vlc3NfXwkApAMBBQVndWVzcwUDbmlsAAz5sRs=", "height": 3443337, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9JS3dratRqWYXYu5GHpKL1TrT3qzZQBaqioWBgfUaxp5 Next: nrHckPCsDibbJErdzhdt5m9gk8oea1CUSrwfQmoqX4W Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let M16 = 10000000000000000
55
6-let STAKERS_AMOUNT = 1000000000000000
6+let STAKERS_AMOUNT = 3000000000000000
77
88 let TEAM_AMOUNT = 1000000000000000
99
10-let MARKET_AMOUNT = 8000000000000000
10+let MARKET_AMOUNT = 6000000000000000
1111
1212 let YEAR_BLOCKS = (365 * 1440)
1313
1515
1616 let BLESS_PRICE = 100000000000
1717
18+let LOTTERY_PRICE = 100000000000
19+
1820 let FOMO_PERIOD = 60
21+
22+let RANDOM_DELAY = 2
23+
24+let CURRENT_JACKPOT_PERC = 50
25+
26+let NEXT_JACKPOT_PERC = 20
27+
28+let STAKERS_PERC = 20
29+
30+let TEAM_PERC = 10
1931
2032 let gorcAssetIdKey = "gorcAssetId"
2133
2234 let gorcAssetId = valueOrErrorMessage(getBinary(gorcAssetIdKey), "GORC is not issued yet")
2335
2436 let issueTimeKey = "issueTime"
37+
38+let stakersAmountTotalKey = "stakersAmountTotal"
2539
2640 let stakersAmountLeftKey = "stakersAmountLeft"
2741
3549
3650 let lastFomoTimeKey = "lastFomoTime"
3751
38-let currentJackpotKey = "currentJackpot"
52+let currFomoJackpotKey = "currFomoJackpot"
53+
54+let nextFomoJackpotKey = "nextFomoJackpot"
3955
4056 let lastFomoPlayerKey = "lastFomoPlayer"
4157
4258 let teamWalletAddrKey = "teamWalletAddr"
4359
4460 let brokerAddrKey = "brokerAddr"
61+
62+func keyCommit (address) = ("finishBlockFor_" + address)
63+
64+
65+func keyGuess (address) = ("guessFor_" + address)
66+
67+
68+func keySalt (address) = ("saltFor_" + address)
69+
70+
71+let currLotteryJackpotKey = "currLotteryJackpot"
72+
73+let nextLotteryJackpotKey = "nextLotteryJackpot"
4574
4675 func gorcStats (userAddrOpt) = {
4776 let amountLeftTotal = valueOrElse(getInteger(stakersAmountLeftKey), 0)
5382 let nowLimited = min([height, (issueTime + STAKE_PERIOD)])
5483 let userShares = valueOrElse(getInteger(stakedAmountByUserKey(userAddrOpt)), 0)
5584 let totalShares = valueOrElse(getInteger(stakedAmountTotalKey), 0)
56- let userTemporal = fraction(STAKERS_AMOUNT, (nowLimited - lastUserTime), STAKE_PERIOD)
85+ let stakersAmountTotal = valueOrElse(getInteger(stakersAmountTotalKey), STAKERS_AMOUNT)
86+ let userTemporal = fraction(stakersAmountTotal, (nowLimited - lastUserTime), STAKE_PERIOD)
5787 let userAmount = if ((totalShares != 0))
5888 then fraction(userTemporal, userShares, totalShares)
5989 else 0
89119 else nil
90120 let lastFomoTime = valueOrElse(getInteger(lastFomoTimeKey), 0)
91121 let lastFomoPlayer = valueOrElse(getString(lastFomoPlayerKey), "")
92- let jackpotAmount = valueOrElse(getInteger(currentJackpotKey), 0)
122+ let deltaCurrJackpot = fraction(BLESS_PRICE, CURRENT_JACKPOT_PERC, 100)
123+ let deltaNextJackpot = fraction(BLESS_PRICE, NEXT_JACKPOT_PERC, 100)
124+ let deltaTeamAmount = fraction(BLESS_PRICE, TEAM_PERC, 100)
125+ let deltaStakersAmount = (((BLESS_PRICE - deltaCurrJackpot) - deltaNextJackpot) - deltaTeamAmount)
126+ let fomoCurrJackpot = valueOrElse(getInteger(currFomoJackpotKey), 0)
127+ let fomoNextJackpot = valueOrElse(getInteger(nextFomoJackpotKey), 0)
93128 let fomoActions = if (if (if ((height > (lastFomoTime + FOMO_PERIOD)))
94- then (jackpotAmount > 0)
129+ then (fomoCurrJackpot > 0)
95130 else false)
96131 then (lastFomoPlayer != "")
97132 else false)
98- then [ScriptTransfer(addressFromStringValue(lastFomoPlayer), jackpotAmount, gorcAssetId), IntegerEntry(currentJackpotKey, BLESS_PRICE)]
99- else [IntegerEntry(currentJackpotKey, (jackpotAmount + BLESS_PRICE))]
100- (([IntegerEntry(lastFomoTimeKey, height), StringEntry(lastFomoPlayerKey, toString(i.caller))] ++ changeActions) ++ fomoActions)
133+ then [ScriptTransfer(addressFromStringValue(lastFomoPlayer), fomoCurrJackpot, gorcAssetId), IntegerEntry(currFomoJackpotKey, (fomoNextJackpot + deltaCurrJackpot)), IntegerEntry(nextFomoJackpotKey, deltaNextJackpot)]
134+ else [IntegerEntry(currFomoJackpotKey, (fomoCurrJackpot + deltaCurrJackpot)), IntegerEntry(nextFomoJackpotKey, (fomoNextJackpot + deltaNextJackpot))]
135+ (([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)
101136 }
102137 }
138+ }
139+
140+
141+func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
142+ then throw("maxValue should be > 0")
143+ else {
144+ let randomHash = sha256_16Kb((salt + entropy))
145+ (toInt(randomHash) % maxValue)
103146 }
104147
105148
115158 let issuedAmount = M16
116159 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)
117160 let assetId = calculateAssetId(issue)
118-[issue, BinaryEntry(gorcAssetIdKey, assetId), IntegerEntry(issueTimeKey, height), IntegerEntry(stakersAmountLeftKey, STAKERS_AMOUNT), StringEntry(teamWalletAddrKey, teamWalletAddr), StringEntry(brokerAddrKey, brokerAddr), ScriptTransfer(addressFromStringValue(teamWalletAddr), TEAM_AMOUNT, assetId), ScriptTransfer(addressFromStringValue(brokerAddr), MARKET_AMOUNT, assetId)]
161+[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)]
119162 }
120163
121164
132175 then throw("GORC payments only!")
133176 else {
134177 let addr = toString(i.caller)
135- let $t054215472 = gorcStats(addr)
136- let userAmount = $t054215472._1
137- let amountLeftTotal = $t054215472._2
178+ let $t064306481 = gorcStats(addr)
179+ let userAmount = $t064306481._1
180+ let amountLeftTotal = $t064306481._2
138181 let userAmountKey = stakedAmountByUserKey(addr)
139182 let claimActions = if ((userAmount > 0))
140183 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
158201 if ((0 > (oldAmount - amount)))
159202 then throw(((("You have only " + fixedPoint(oldAmount, 8)) + " GORC staked, tried to unstake ") + fixedPoint(amount, 8)))
160203 else {
161- let $t064336484 = gorcStats(addr)
162- let userAmount = $t064336484._1
163- let amountLeftTotal = $t064336484._2
204+ let $t074427493 = gorcStats(addr)
205+ let userAmount = $t074427493._1
206+ let amountLeftTotal = $t074427493._2
164207 let claimActions = if ((userAmount > 0))
165208 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
166209 else nil
176219 then throw("No payments required")
177220 else {
178221 let addr = toString(i.caller)
179- let $t070487099 = gorcStats(addr)
180- let userAmount = $t070487099._1
181- let amountLeftTotal = $t070487099._2
222+ let $t080578108 = gorcStats(addr)
223+ let userAmount = $t080578108._1
224+ let amountLeftTotal = $t080578108._2
182225 let claimActions = if ((userAmount > 0))
183226 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
184227 else nil
198241
199242
200243 @Callable(i)
244+func commitGuess (guess) = {
245+ let addr = toString(i.caller)
246+ let finishKey = keyCommit(addr)
247+ let guessKey = keyGuess(addr)
248+ if (isDefined(getInteger(finishKey)))
249+ then throw("You already made a bet, please use it")
250+ else if (if ((0 > guess))
251+ then true
252+ else (guess > 11))
253+ then throw("The number should be between 0 and 11")
254+ else if ((size(i.payments) != 1))
255+ then throw("exactly 1 payment must be attached")
256+ else {
257+ let pmt = i.payments[0]
258+ let amt = pmt.amount
259+ if (if (!(isDefined(pmt.assetId)))
260+ then true
261+ else (value(pmt.assetId) != gorcAssetId))
262+ then throw("GORC payments only!")
263+ else {
264+ let change = (amt - LOTTERY_PRICE)
265+ if ((0 > change))
266+ then throw(((("You need to sacrifice " + fixedPoint(LOTTERY_PRICE, 8)) + " GORC, but I see only ") + fixedPoint(amt, 8)))
267+ else {
268+ let changeActions = if ((change > 0))
269+ then [ScriptTransfer(i.caller, change, gorcAssetId)]
270+ else nil
271+ let finishBlock = (height + RANDOM_DELAY)
272+ let deltaCurrJackpot = fraction(LOTTERY_PRICE, CURRENT_JACKPOT_PERC, 100)
273+ let deltaNextJackpot = fraction(LOTTERY_PRICE, NEXT_JACKPOT_PERC, 100)
274+ let deltaTeamAmount = fraction(LOTTERY_PRICE, TEAM_PERC, 100)
275+ let deltaStakersAmount = (((LOTTERY_PRICE - deltaCurrJackpot) - deltaNextJackpot) - deltaTeamAmount)
276+ $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)
277+ }
278+ }
279+ }
280+ }
281+
282+
283+
284+@Callable(i)
285+func guessLottery () = {
286+ let addr = toString(i.caller)
287+ let finishKey = keyCommit(addr)
288+ let guessKey = keyGuess(addr)
289+ let guess = valueOrErrorMessage(getInteger(guessKey), "You have not made a bet")
290+ let finishBlock = valueOrErrorMessage(getInteger(finishKey), "You have not made a bet")
291+ if ((finishBlock > height))
292+ then throw(("Random number is not ready yet, wait until height = " + toString(finishBlock)))
293+ else {
294+ let entropy = value(value(blockInfoByHeight(finishBlock)).vrf)
295+ let saltKey = keySalt(addr)
296+ let salt = fromBase58String(valueOrElse(getString(saltKey), "DEFAULT"))
297+ let rand = getRandomNumber(12, salt, entropy)
298+ let currJackpot = valueOrElse(getInteger(currLotteryJackpotKey), 0)
299+ let winActions = if ((rand == guess))
300+ then [ScriptTransfer(i.caller, currJackpot, gorcAssetId), IntegerEntry(currLotteryJackpotKey, valueOrElse(getInteger(nextLotteryJackpotKey), 0)), IntegerEntry(nextLotteryJackpotKey, 0)]
301+ else nil
302+ $Tuple2(([DeleteEntry(finishKey), DeleteEntry(guessKey), DeleteEntry(saltKey)] ++ winActions), rand)
303+ }
304+ }
305+
306+
307+
308+@Callable(i)
201309 func statsREADONLY (userAddrOpt) = {
202- let $t075587616 = gorcStats(userAddrOpt)
203- let userAmount = $t075587616._1
204- let amountLeftTotal = $t075587616._2
205- let jackpotAmount = valueOrElse(getInteger(currentJackpotKey), 0)
310+ let $t01190211960 = gorcStats(userAddrOpt)
311+ let userAmount = $t01190211960._1
312+ let amountLeftTotal = $t01190211960._2
313+ let currFomoJackpot = valueOrElse(getInteger(currFomoJackpotKey), 0)
314+ let nextFomoJackpot = valueOrElse(getInteger(nextFomoJackpotKey), 0)
206315 let lastFomoTime = valueOrElse(getInteger(lastFomoTimeKey), 0)
207316 let lastFomoPlayer = valueOrElse(getString(lastFomoPlayerKey), "")
208- $Tuple2(nil, [("%s%d__gorcAvailToClaim__" + toString(userAmount)), ("%s%d__jackpotAmount__" + toString(jackpotAmount)), ("%s%d__lastFomoTime__" + toString(lastFomoTime)), ("%s%s__lastFomoPlayer__" + lastFomoPlayer), ("%s%d__amountLeftTotal__" + toString(amountLeftTotal))])
317+ let currLotteryJackpot = valueOrElse(getInteger(currLotteryJackpotKey), 0)
318+ let nextLotteryJackpot = valueOrElse(getInteger(nextLotteryJackpotKey), 0)
319+ let finishKey = keyCommit(userAddrOpt)
320+ let guessKey = keyGuess(userAddrOpt)
321+ let guess = valueOrElse(getInteger(guessKey), -1)
322+ let finishBlock = valueOrElse(getInteger(finishKey), -1)
323+ $Tuple2(nil, [("%s%d__gorcAvailToClaim__" + toString(userAmount)), ("%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))])
209324 }
210325
211326
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let M16 = 10000000000000000
55
6-let STAKERS_AMOUNT = 1000000000000000
6+let STAKERS_AMOUNT = 3000000000000000
77
88 let TEAM_AMOUNT = 1000000000000000
99
10-let MARKET_AMOUNT = 8000000000000000
10+let MARKET_AMOUNT = 6000000000000000
1111
1212 let YEAR_BLOCKS = (365 * 1440)
1313
1414 let STAKE_PERIOD = (5 * YEAR_BLOCKS)
1515
1616 let BLESS_PRICE = 100000000000
1717
18+let LOTTERY_PRICE = 100000000000
19+
1820 let FOMO_PERIOD = 60
21+
22+let RANDOM_DELAY = 2
23+
24+let CURRENT_JACKPOT_PERC = 50
25+
26+let NEXT_JACKPOT_PERC = 20
27+
28+let STAKERS_PERC = 20
29+
30+let TEAM_PERC = 10
1931
2032 let gorcAssetIdKey = "gorcAssetId"
2133
2234 let gorcAssetId = valueOrErrorMessage(getBinary(gorcAssetIdKey), "GORC is not issued yet")
2335
2436 let issueTimeKey = "issueTime"
37+
38+let stakersAmountTotalKey = "stakersAmountTotal"
2539
2640 let stakersAmountLeftKey = "stakersAmountLeft"
2741
2842 let stakedAmountTotalKey = "stakedTotal"
2943
3044 func stakedAmountByUserKey (addr) = ("stakedAmount_" + addr)
3145
3246
3347 func lastClaimTimeByUserKey (addr) = ("lastClaimTime_" + addr)
3448
3549
3650 let lastFomoTimeKey = "lastFomoTime"
3751
38-let currentJackpotKey = "currentJackpot"
52+let currFomoJackpotKey = "currFomoJackpot"
53+
54+let nextFomoJackpotKey = "nextFomoJackpot"
3955
4056 let lastFomoPlayerKey = "lastFomoPlayer"
4157
4258 let teamWalletAddrKey = "teamWalletAddr"
4359
4460 let brokerAddrKey = "brokerAddr"
61+
62+func keyCommit (address) = ("finishBlockFor_" + address)
63+
64+
65+func keyGuess (address) = ("guessFor_" + address)
66+
67+
68+func keySalt (address) = ("saltFor_" + address)
69+
70+
71+let currLotteryJackpotKey = "currLotteryJackpot"
72+
73+let nextLotteryJackpotKey = "nextLotteryJackpot"
4574
4675 func gorcStats (userAddrOpt) = {
4776 let amountLeftTotal = valueOrElse(getInteger(stakersAmountLeftKey), 0)
4877 let lastUserTime = valueOrElse(getInteger(lastClaimTimeByUserKey(userAddrOpt)), -1)
4978 if ((0 > lastUserTime))
5079 then $Tuple2(0, amountLeftTotal)
5180 else {
5281 let issueTime = valueOrErrorMessage(getInteger(issueTimeKey), "GORC is not issued yet")
5382 let nowLimited = min([height, (issueTime + STAKE_PERIOD)])
5483 let userShares = valueOrElse(getInteger(stakedAmountByUserKey(userAddrOpt)), 0)
5584 let totalShares = valueOrElse(getInteger(stakedAmountTotalKey), 0)
56- let userTemporal = fraction(STAKERS_AMOUNT, (nowLimited - lastUserTime), STAKE_PERIOD)
85+ let stakersAmountTotal = valueOrElse(getInteger(stakersAmountTotalKey), STAKERS_AMOUNT)
86+ let userTemporal = fraction(stakersAmountTotal, (nowLimited - lastUserTime), STAKE_PERIOD)
5787 let userAmount = if ((totalShares != 0))
5888 then fraction(userTemporal, userShares, totalShares)
5989 else 0
6090 $Tuple2(userAmount, (amountLeftTotal - userAmount))
6191 }
6292 }
6393
6494
6595 func fixedPoint (val,decimals) = {
6696 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
6797 let lowPart = toString((val % tenPow))
6898 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
6999 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
70100 }
71101
72102
73103 func fomoInternal (i) = if ((size(i.payments) != 1))
74104 then throw("exactly 1 payment must be attached")
75105 else {
76106 let pmt = i.payments[0]
77107 let amt = pmt.amount
78108 if (if (!(isDefined(pmt.assetId)))
79109 then true
80110 else (value(pmt.assetId) != gorcAssetId))
81111 then throw("GORC payments only!")
82112 else {
83113 let change = (amt - BLESS_PRICE)
84114 if ((0 > change))
85115 then throw(((("You need to sacrifice " + fixedPoint(BLESS_PRICE, 8)) + " GORC, but I see only ") + fixedPoint(amt, 8)))
86116 else {
87117 let changeActions = if ((change > 0))
88118 then [ScriptTransfer(i.caller, change, gorcAssetId)]
89119 else nil
90120 let lastFomoTime = valueOrElse(getInteger(lastFomoTimeKey), 0)
91121 let lastFomoPlayer = valueOrElse(getString(lastFomoPlayerKey), "")
92- let jackpotAmount = valueOrElse(getInteger(currentJackpotKey), 0)
122+ let deltaCurrJackpot = fraction(BLESS_PRICE, CURRENT_JACKPOT_PERC, 100)
123+ let deltaNextJackpot = fraction(BLESS_PRICE, NEXT_JACKPOT_PERC, 100)
124+ let deltaTeamAmount = fraction(BLESS_PRICE, TEAM_PERC, 100)
125+ let deltaStakersAmount = (((BLESS_PRICE - deltaCurrJackpot) - deltaNextJackpot) - deltaTeamAmount)
126+ let fomoCurrJackpot = valueOrElse(getInteger(currFomoJackpotKey), 0)
127+ let fomoNextJackpot = valueOrElse(getInteger(nextFomoJackpotKey), 0)
93128 let fomoActions = if (if (if ((height > (lastFomoTime + FOMO_PERIOD)))
94- then (jackpotAmount > 0)
129+ then (fomoCurrJackpot > 0)
95130 else false)
96131 then (lastFomoPlayer != "")
97132 else false)
98- then [ScriptTransfer(addressFromStringValue(lastFomoPlayer), jackpotAmount, gorcAssetId), IntegerEntry(currentJackpotKey, BLESS_PRICE)]
99- else [IntegerEntry(currentJackpotKey, (jackpotAmount + BLESS_PRICE))]
100- (([IntegerEntry(lastFomoTimeKey, height), StringEntry(lastFomoPlayerKey, toString(i.caller))] ++ changeActions) ++ fomoActions)
133+ then [ScriptTransfer(addressFromStringValue(lastFomoPlayer), fomoCurrJackpot, gorcAssetId), IntegerEntry(currFomoJackpotKey, (fomoNextJackpot + deltaCurrJackpot)), IntegerEntry(nextFomoJackpotKey, deltaNextJackpot)]
134+ else [IntegerEntry(currFomoJackpotKey, (fomoCurrJackpot + deltaCurrJackpot)), IntegerEntry(nextFomoJackpotKey, (fomoNextJackpot + deltaNextJackpot))]
135+ (([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)
101136 }
102137 }
138+ }
139+
140+
141+func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
142+ then throw("maxValue should be > 0")
143+ else {
144+ let randomHash = sha256_16Kb((salt + entropy))
145+ (toInt(randomHash) % maxValue)
103146 }
104147
105148
106149 @Callable(i)
107150 func testArgs (intVal,strVal,boolVal,binVal,arrInt,arrStr,arrBool,arrBin) = nil
108151
109152
110153
111154 @Callable(i)
112155 func constructorV1 (teamWalletAddr,brokerAddr) = if ((i.caller != this))
113156 then throw("Permission denied")
114157 else {
115158 let issuedAmount = M16
116159 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)
117160 let assetId = calculateAssetId(issue)
118-[issue, BinaryEntry(gorcAssetIdKey, assetId), IntegerEntry(issueTimeKey, height), IntegerEntry(stakersAmountLeftKey, STAKERS_AMOUNT), StringEntry(teamWalletAddrKey, teamWalletAddr), StringEntry(brokerAddrKey, brokerAddr), ScriptTransfer(addressFromStringValue(teamWalletAddr), TEAM_AMOUNT, assetId), ScriptTransfer(addressFromStringValue(brokerAddr), MARKET_AMOUNT, assetId)]
161+[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)]
119162 }
120163
121164
122165
123166 @Callable(i)
124167 func stakeGorc () = if ((size(i.payments) != 1))
125168 then throw("exactly 1 payment must be attached")
126169 else {
127170 let pmt = i.payments[0]
128171 let amt = pmt.amount
129172 if (if (!(isDefined(pmt.assetId)))
130173 then true
131174 else (value(pmt.assetId) != gorcAssetId))
132175 then throw("GORC payments only!")
133176 else {
134177 let addr = toString(i.caller)
135- let $t054215472 = gorcStats(addr)
136- let userAmount = $t054215472._1
137- let amountLeftTotal = $t054215472._2
178+ let $t064306481 = gorcStats(addr)
179+ let userAmount = $t064306481._1
180+ let amountLeftTotal = $t064306481._2
138181 let userAmountKey = stakedAmountByUserKey(addr)
139182 let claimActions = if ((userAmount > 0))
140183 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
141184 else nil
142185 $Tuple2((claimActions ++ [IntegerEntry(stakedAmountTotalKey, (valueOrElse(getInteger(stakedAmountTotalKey), 0) + amt)), IntegerEntry(userAmountKey, (valueOrElse(getInteger(userAmountKey), 0) + amt)), IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), userAmount)
143186 }
144187 }
145188
146189
147190
148191 @Callable(i)
149192 func unstakeGorc (amount) = if ((0 >= amount))
150193 then throw("Amount should be positive")
151194 else {
152195 let addr = toString(i.caller)
153196 if ((size(i.payments) != 0))
154197 then throw("No payments required")
155198 else {
156199 let userAmountKey = stakedAmountByUserKey(addr)
157200 let oldAmount = valueOrElse(getInteger(userAmountKey), 0)
158201 if ((0 > (oldAmount - amount)))
159202 then throw(((("You have only " + fixedPoint(oldAmount, 8)) + " GORC staked, tried to unstake ") + fixedPoint(amount, 8)))
160203 else {
161- let $t064336484 = gorcStats(addr)
162- let userAmount = $t064336484._1
163- let amountLeftTotal = $t064336484._2
204+ let $t074427493 = gorcStats(addr)
205+ let userAmount = $t074427493._1
206+ let amountLeftTotal = $t074427493._2
164207 let claimActions = if ((userAmount > 0))
165208 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
166209 else nil
167210 $Tuple2((claimActions ++ [IntegerEntry(stakedAmountTotalKey, (valueOrErrorMessage(getInteger(stakedAmountTotalKey), "No GORC staked") - amount)), IntegerEntry(userAmountKey, (oldAmount - amount)), IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), 0)
168211 }
169212 }
170213 }
171214
172215
173216
174217 @Callable(i)
175218 func claimGorc () = if ((size(i.payments) != 0))
176219 then throw("No payments required")
177220 else {
178221 let addr = toString(i.caller)
179- let $t070487099 = gorcStats(addr)
180- let userAmount = $t070487099._1
181- let amountLeftTotal = $t070487099._2
222+ let $t080578108 = gorcStats(addr)
223+ let userAmount = $t080578108._1
224+ let amountLeftTotal = $t080578108._2
182225 let claimActions = if ((userAmount > 0))
183226 then [ScriptTransfer(i.caller, userAmount, gorcAssetId)]
184227 else nil
185228 $Tuple2((claimActions ++ [IntegerEntry(lastClaimTimeByUserKey(addr), height), IntegerEntry(stakersAmountLeftKey, amountLeftTotal)]), userAmount)
186229 }
187230
188231
189232
190233 @Callable(i)
191234 func answerMe () = $Tuple2(fomoInternal(i), toInt(i.transactionId))
192235
193236
194237
195238 @Callable(i)
196239 func blessMe () = $Tuple2(fomoInternal(i), 42)
197240
198241
199242
200243 @Callable(i)
244+func commitGuess (guess) = {
245+ let addr = toString(i.caller)
246+ let finishKey = keyCommit(addr)
247+ let guessKey = keyGuess(addr)
248+ if (isDefined(getInteger(finishKey)))
249+ then throw("You already made a bet, please use it")
250+ else if (if ((0 > guess))
251+ then true
252+ else (guess > 11))
253+ then throw("The number should be between 0 and 11")
254+ else if ((size(i.payments) != 1))
255+ then throw("exactly 1 payment must be attached")
256+ else {
257+ let pmt = i.payments[0]
258+ let amt = pmt.amount
259+ if (if (!(isDefined(pmt.assetId)))
260+ then true
261+ else (value(pmt.assetId) != gorcAssetId))
262+ then throw("GORC payments only!")
263+ else {
264+ let change = (amt - LOTTERY_PRICE)
265+ if ((0 > change))
266+ then throw(((("You need to sacrifice " + fixedPoint(LOTTERY_PRICE, 8)) + " GORC, but I see only ") + fixedPoint(amt, 8)))
267+ else {
268+ let changeActions = if ((change > 0))
269+ then [ScriptTransfer(i.caller, change, gorcAssetId)]
270+ else nil
271+ let finishBlock = (height + RANDOM_DELAY)
272+ let deltaCurrJackpot = fraction(LOTTERY_PRICE, CURRENT_JACKPOT_PERC, 100)
273+ let deltaNextJackpot = fraction(LOTTERY_PRICE, NEXT_JACKPOT_PERC, 100)
274+ let deltaTeamAmount = fraction(LOTTERY_PRICE, TEAM_PERC, 100)
275+ let deltaStakersAmount = (((LOTTERY_PRICE - deltaCurrJackpot) - deltaNextJackpot) - deltaTeamAmount)
276+ $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)
277+ }
278+ }
279+ }
280+ }
281+
282+
283+
284+@Callable(i)
285+func guessLottery () = {
286+ let addr = toString(i.caller)
287+ let finishKey = keyCommit(addr)
288+ let guessKey = keyGuess(addr)
289+ let guess = valueOrErrorMessage(getInteger(guessKey), "You have not made a bet")
290+ let finishBlock = valueOrErrorMessage(getInteger(finishKey), "You have not made a bet")
291+ if ((finishBlock > height))
292+ then throw(("Random number is not ready yet, wait until height = " + toString(finishBlock)))
293+ else {
294+ let entropy = value(value(blockInfoByHeight(finishBlock)).vrf)
295+ let saltKey = keySalt(addr)
296+ let salt = fromBase58String(valueOrElse(getString(saltKey), "DEFAULT"))
297+ let rand = getRandomNumber(12, salt, entropy)
298+ let currJackpot = valueOrElse(getInteger(currLotteryJackpotKey), 0)
299+ let winActions = if ((rand == guess))
300+ then [ScriptTransfer(i.caller, currJackpot, gorcAssetId), IntegerEntry(currLotteryJackpotKey, valueOrElse(getInteger(nextLotteryJackpotKey), 0)), IntegerEntry(nextLotteryJackpotKey, 0)]
301+ else nil
302+ $Tuple2(([DeleteEntry(finishKey), DeleteEntry(guessKey), DeleteEntry(saltKey)] ++ winActions), rand)
303+ }
304+ }
305+
306+
307+
308+@Callable(i)
201309 func statsREADONLY (userAddrOpt) = {
202- let $t075587616 = gorcStats(userAddrOpt)
203- let userAmount = $t075587616._1
204- let amountLeftTotal = $t075587616._2
205- let jackpotAmount = valueOrElse(getInteger(currentJackpotKey), 0)
310+ let $t01190211960 = gorcStats(userAddrOpt)
311+ let userAmount = $t01190211960._1
312+ let amountLeftTotal = $t01190211960._2
313+ let currFomoJackpot = valueOrElse(getInteger(currFomoJackpotKey), 0)
314+ let nextFomoJackpot = valueOrElse(getInteger(nextFomoJackpotKey), 0)
206315 let lastFomoTime = valueOrElse(getInteger(lastFomoTimeKey), 0)
207316 let lastFomoPlayer = valueOrElse(getString(lastFomoPlayerKey), "")
208- $Tuple2(nil, [("%s%d__gorcAvailToClaim__" + toString(userAmount)), ("%s%d__jackpotAmount__" + toString(jackpotAmount)), ("%s%d__lastFomoTime__" + toString(lastFomoTime)), ("%s%s__lastFomoPlayer__" + lastFomoPlayer), ("%s%d__amountLeftTotal__" + toString(amountLeftTotal))])
317+ let currLotteryJackpot = valueOrElse(getInteger(currLotteryJackpotKey), 0)
318+ let nextLotteryJackpot = valueOrElse(getInteger(nextLotteryJackpotKey), 0)
319+ let finishKey = keyCommit(userAddrOpt)
320+ let guessKey = keyGuess(userAddrOpt)
321+ let guess = valueOrElse(getInteger(guessKey), -1)
322+ let finishBlock = valueOrElse(getInteger(finishKey), -1)
323+ $Tuple2(nil, [("%s%d__gorcAvailToClaim__" + toString(userAmount)), ("%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))])
209324 }
210325
211326

github/deemru/w8io/169f3d6 
54.59 ms