tx · 2B7fRutjkaU7n7om1V4hCY1tUtqsTmCJDsaBcux5KgDP

3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk:  -0.01800000 Waves

2022.11.16 00:06 [2318751] smart account 3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk > SELF 0.00000000 Waves

{ "type": 13, "id": "2B7fRutjkaU7n7om1V4hCY1tUtqsTmCJDsaBcux5KgDP", "fee": 1800000, "feeAssetId": null, "timestamp": 1668546434084, "version": 2, "chainId": 84, "sender": "3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk", "senderPublicKey": "AR4BeE6hYADMvKxgRQs4ADN3krEqb2j8WE3WfJxzL3zE", "proofs": [ "C8GdFHiX9d9YrzrPzb3Cj15gVRr5naLKcyvwVmkttCEPbB9eoy4xBtM3nkrM6miaPFaVpUBDTPnChrCBns5DTHU" ], "script": "base64:BgJPCAISAwoBCBIAEgASABIFCgMIAQESAwoBCBIDCgEIEgMKAQgSBwoFCAgBAQgSAwoBCBIECgIICBIFCgMICAESAwoBCBIDCgEIEgUKAwgICC8ABXdhdmVzAIDC1y8ADnRpY2tldFByaWNlSW50AMCEPQALdGlja2V0UHJpY2UFDnRpY2tldFByaWNlSW50AAZpbnZGZWUAoMIeABJ3aXRoZHJhd0ZlZVBlcmNlbnQABQAWZmVlQ29sbGVjdG9yQWRkcmVzc0tleQITZmVlQ29sbGVjdG9yQWRkcmVzcwAZdG91cm5hbWVudEJ1eUluRmVlUGVyY2VudAAKAA5kZXBvc2l0QXNzZXRJZAIsNXVlMWZpdVY2ajZVQnI2WGYyOFFtczZ5NUZxekt0cXZheHhod3U3aFRRNTgAH2FsbG93ZWRTcGVjaWFsVG91cm5hbWVudENyZWF0b3ICIzNOQWVCV0NaRmJCREZMWW85R05KTm9FNWhRM2FNc1Y1S3NOAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAARJnZXRUaWNrZXRzQ291bnRLZXkBDWFkZHJlc3NTdHJpbmcJAKwCAgUNYWRkcmVzc1N0cmluZwINX3RpY2tldHNDb3VudAEiYnV5SW5BbW91bnRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIMdG91cm5hbWVudElkB2FjY291bnQJAKwCAgkArAICBQx0b3VybmFtZW50SWQCF19idXlJbkFtb3VudEZvckFjY291bnRfBQdhY2NvdW50ASNidXlJbkFzc2V0SWRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIMdG91cm5hbWVudElkB2FjY291bnQJAKwCAgkArAICBQx0b3VybmFtZW50SWQCGF9idXlJbkFzc2V0SWRGb3JBY2NvdW50XwUHYWNjb3VudAEddGlja2V0Rm9yVG91cm5hbWVudEZvckFjY291bnQCDHRvdXJuYW1lbnRJZAdhY2NvdW50CQCsAgIJAKwCAgUMdG91cm5hbWVudElkAhJfdGlja2V0Rm9yQWNjb3VudF8FB2FjY291bnQBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAiRfdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnQBL3RvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50TWludXNGZWVzS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAi1fdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRNaW51c0ZlZXMBFHRvdXJuYW1lbnRDcmVhdG9yS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhJfdG91cm5hbWVudENyZWF0b3IBEXRvdXJuYW1lbnROYW1lS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAg9fdG91cm5hbWVudE5hbWUBGHRvdXJuYW1lbnRQcml6ZUFtb3VudEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIWX3RvdXJuYW1lbnRQcml6ZUFtb3VudAEcdG91cm5hbWVudE1heFBsYXllcnNDb3VudEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIaX3RvdXJuYW1lbnRNYXhQbGF5ZXJzQ291bnQBGXRvdXJuYW1lbnRQbGF5ZXJzQ291bnRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCF190b3VybmFtZW50UGxheWVyc0NvdW50ARl0b3VybmFtZW50UHJpemVBc3NldElkS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhdfdG91cm5hbWVudFByaXplQXNzZXRJZAEbdG91cm5hbWVudFByaXplQXNzZXROYW1lS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhlfdG91cm5hbWVudFByaXplQXNzZXROYW1lARh0b3VybmFtZW50QnV5SW5BbW91bnRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCFl90b3VybmFtZW50QnV5SW5BbW91bnQBGXRvdXJuYW1lbnRCdXlJbkFzc2V0SWRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCF190b3VybmFtZW50QnV5SW5Bc3NldElkARt0b3VybmFtZW50QnV5SW5Bc3NldE5hbWVLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCGV90b3VybmFtZW50QnV5SW5Bc3NldE5hbWUBH3RvdXJuYW1lbnRCdXlJbkFzc2V0RGVjaW1hbHNLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCHV90b3VybmFtZW50QnV5SW5Bc3NldERlY2ltYWxzAR90b3VybmFtZW50UHJpemVBc3NldERlY2ltYWxzS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAh1fdG91cm5hbWVudFByaXplQXNzZXREZWNpbWFscwETdG91cm5hbWVudFN0YXR1c0tleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIRX3RvdXJuYW1lbnRTdGF0dXMBHnRvdXJuYW1lbnRCdXlJbkZlZUNvbGxlY3RlZEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIcX3RvdXJuYW1lbnRCdXlJbkZlZUNvbGxlY3RlZAEgdG91cm5hbWVudFNlcnZpY2VGZWVDb2xsZWN0ZWRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCHl90b3VybmFtZW50U2VydmljZUZlZUNvbGxlY3RlZAEhdG91cm5hbWVudFdpbm5pbmdUcmFuc2FjdGlvbklkS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAh9fdG91cm5hbWVudFdpbm5pbmdUcmFuc2FjdGlvbklkAQ1nYW1lV2lubmVyS2V5AQZnYW1lSWQJAKwCAgUGZ2FtZUlkAgdfd2lubmVyARhhZGRyZXNzQXZhaWxhYmxlRnVuZHNLZXkBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIPX2F2YWlsYWJsZUZ1bmRzARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhFfdG90YWxMb2NrZWRGdW5kcwEhYWRkcmVzc0xvY2tlZEZ1bmRzVG90YWxIaXN0b3J5S2V5AQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCGF9sb2NrZWRGdW5kc1RvdGFsSGlzdG9yeQEcYWRkcmVzc0xvY2tlZEZ1bmRzRm9yR2FtZUtleQIHYWRkcmVzcwZnYW1lSWQJAKwCAgkArAICBQdhZGRyZXNzAg1fbG9ja2VkRnVuZHNfBQZnYW1lSWQBGmFkZHJlc3NBdmFpbGFibGVSZXdhcmRzS2V5AQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCEV9hdmFpbGFibGVSZXdhcmRzARd2aWRlb1Bva2VyQmV0Rm9yQWNjb3VudAIGZ2FtZUlkB2FjY291bnQJAKwCAgkArAICBQZnYW1lSWQCEl92aWRlb1Bva2VyQmV0Rm9yXwUHYWNjb3VudAEXdmlkZW9Qb2tlckNhcmRzRHJhd25LZXkBBmdhbWVJZAkArAICBQZnYW1lSWQCFV92aWRlb1Bva2VyQ2FyZHNEcmF3bgETdmlkZW9Qb2tlclJlc3VsdEtleQEGZ2FtZUlkCQCsAgIFBmdhbWVJZAIRX3ZpZGVvUG9rZXJSZXN1bHQBGXZpZGVvUG9rZXJSZXN1bHRQcm9maXRLZXkBBmdhbWVJZAkArAICBQZnYW1lSWQCF192aWRlb1Bva2VyUmVzdWx0UHJvZml0ARN2aWRlb1Bva2VyU3RhdHVzS2V5AQZnYW1lSWQJAKwCAgUGZ2FtZUlkAhFfdmlkZW9Qb2tlclN0YXR1cwEadmlkZW9Qb2tlclBsYXllckFkZHJlc3NLZXkBBmdhbWVJZAkArAICBQZnYW1lSWQCGF92aWRlb1Bva2VyUGxheWVyQWRkcmVzcwEUdG9wVXBBZGRyZXNzRnVuZHNLZXkBCnBsYXllckFkZHIJAKwCAgUKcGxheWVyQWRkcgILX3RvcFVwRnVuZHMBD2dldFRpY2tldHNDb3VudAENYWRkcmVzc1N0cmluZwkBDXRyeUdldEludGVnZXIBCQESZ2V0VGlja2V0c0NvdW50S2V5AQUNYWRkcmVzc1N0cmluZwENY29uc3VtZVRpY2tldAEKcGxheWVyQWRkcgQSY3VycmVudFRpY2tldENvdW50CQEPZ2V0VGlja2V0c0NvdW50AQUKcGxheWVyQWRkcgQVbmV3Q3VycmVudFRpY2tldENvdW50CQBlAgUSY3VycmVudFRpY2tldENvdW50AAEDCQBmAgAABRVuZXdDdXJyZW50VGlja2V0Q291bnQAAAUVbmV3Q3VycmVudFRpY2tldENvdW50DwFpARZzZXRGZWVDb2xsZWN0b3JBZGRyZXNzAQ1jb2xsZWN0b3JBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gT25seQkAzAgCCQELU3RyaW5nRW50cnkCBRZmZWVDb2xsZWN0b3JBZGRyZXNzS2V5BQ1jb2xsZWN0b3JBZGRyBQNuaWwBaQEKdG9wVXBGdW5kcwAEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECIVBsZWFzZSBhdHRhY2ggZXhhY3RseSBvbmUgcGF5bWVudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAkA2QQBBQ5kZXBvc2l0QXNzZXRJZAkAAgECGVlvdSBjYW4gb25seSBkZXBvc2l0IFVTRE4EDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUdG9wVXBBZGRyZXNzRnVuZHNLZXkBBQ1jYWxsZXJBZGRyU3RyCAUDcG10BmFtb3VudAUDbmlsAAEBaQEMZGVwb3NpdEZ1bmRzAAQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQIhUGxlYXNlIGF0dGFjaCBleGFjdGx5IG9uZSBwYXltZW50AwkBAiE9AggFA3BtdAdhc3NldElkCQDZBAEFDmRlcG9zaXRBc3NldElkCQACAQIZWW91IGNhbiBvbmx5IGRlcG9zaXQgVVNETgQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBVjdXJyZW50QXZhaWxhYmxlRnVuZHMJAQ10cnlHZXRJbnRlZ2VyAQkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAGQCBRVjdXJyZW50QXZhaWxhYmxlRnVuZHMIBQNwbXQGYW1vdW50BQNuaWwAAQFpAQ13aXRoZHJhd0Z1bmRzAAQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBVjdXJyZW50QXZhaWxhYmxlRnVuZHMJAQ10cnlHZXRJbnRlZ2VyAQkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1jYWxsZXJBZGRyU3RyBRVjdXJyZW50QXZhaWxhYmxlRnVuZHMJANkEAQUOZGVwb3NpdEFzc2V0SWQFA25pbAABAWkBDmZpbmlzaERpY2VHYW1lAw1wbGF5ZXJBZGRyZXNzA2JldBByZXN1bHRNdWx0aXBsaWVyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gT25seQQVY3VycmVudEF2YWlsYWJsZUZ1bmRzCQENdHJ5R2V0SW50ZWdlcgEJARhhZGRyZXNzQXZhaWxhYmxlRnVuZHNLZXkBBQ1wbGF5ZXJBZGRyZXNzBAhiZXRDaGVjawMJAGYCBQNiZXQFFWN1cnJlbnRBdmFpbGFibGVGdW5kcwkAAgECLE5vdCBlbm91Z2ggYXZhaWxhYmxlIGZ1bmRzIHRvIGNvdmVyIHRoZSBiZXQhBgMJAAACBQhiZXRDaGVjawUIYmV0Q2hlY2sJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDXBsYXllckFkZHJlc3MJAGQCCQBlAgUVY3VycmVudEF2YWlsYWJsZUZ1bmRzBQNiZXQJAGsDBQNiZXQFEHJlc3VsdE11bHRpcGxpZXIAkE4FA25pbAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGGNhbmNlbFNpZ25VcFRvVG91cm5hbWVudAEMdG91cm5hbWVudElkBBB0b3VybmFtZW50U3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1OCkBCQETdG91cm5hbWVudFN0YXR1c0tleQEFDHRvdXJuYW1lbnRJZAMJAQIhPQIFEHRvdXJuYW1lbnRTdGF0dXMCDHJlZ2lzdHJhdGlvbgkAAgECKFRvdXJuYW1lbnQgaXMgbm90IGluIHJlZ2lzdHJhdGlvbiBwaGFzZSEEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQPcGFpZEJ1eUluQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBCQEiYnV5SW5BbW91bnRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgQQcGFpZEJ1eUluQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTgpAQkBI2J1eUluQXNzZXRJZEZvclRvdXJuYW1lbnRGb3JBY2NvdW50AgUMdG91cm5hbWVudElkBQ1jYWxsZXJBZGRyU3RyBB1hbHJlYWR5UmVnaXN0ZXJlZFBsYXllcnNDb3VudAkBDXRyeUdldEludGVnZXIBCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAQZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQUMdG91cm5hbWVudElkBQ9wYWlkQnV5SW5BbW91bnQECWZlZXNUYWtlbgkAawMFGXRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnQFGXRvdXJuYW1lbnRCdXlJbkZlZVBlcmNlbnQAZAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDWNhbGxlckFkZHJTdHIFD3BhaWRCdXlJbkFtb3VudAkA2QQBBRBwYWlkQnV5SW5Bc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAR10aWNrZXRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgkAzAgCCQELRGVsZXRlRW50cnkBCQEiYnV5SW5BbW91bnRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgkAzAgCCQELRGVsZXRlRW50cnkBCQEjYnV5SW5Bc3NldElkRm9yVG91cm5hbWVudEZvckFjY291bnQCBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIJARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkCQBlAgUdYWxyZWFkeVJlZ2lzdGVyZWRQbGF5ZXJzQ291bnQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQUMdG91cm5hbWVudElkBRl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEvdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRNaW51c0ZlZXNLZXkBBQx0b3VybmFtZW50SWQJAGUCBRl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50BQlmZWVzVGFrZW4FA25pbAABAWkBEnNpZ25VcFRvVG91cm5hbWVudAEMdG91cm5hbWVudElkBA9tYXhQbGF5ZXJzQ291bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARx0b3VybmFtZW50TWF4UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkBB1hbHJlYWR5UmVnaXN0ZXJlZFBsYXllcnNDb3VudAkBDXRyeUdldEludGVnZXIBCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAQQdG91cm5hbWVudFN0YXR1cwkBEUBleHRyTmF0aXZlKDEwNTgpAQkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQDAwkBAiE9AgUQdG91cm5hbWVudFN0YXR1cwIMcmVnaXN0cmF0aW9uCQECIT0CBRB0b3VybmFtZW50U3RhdHVzAgdzdGFydGVkBwkAAgECKFRvdXJuYW1lbnQgaXMgbm90IGluIHJlZ2lzdHJhdGlvbiBwaGFzZSEDCQAAAgUdYWxyZWFkeVJlZ2lzdGVyZWRQbGF5ZXJzQ291bnQFD21heFBsYXllcnNDb3VudAkAAgECNVRvdXJuYW1lbnQgaXMgY3VycmVudGx5IGZ1bGwsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIhBANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiFQbGVhc2UgYXR0YWNoIGV4YWN0bHkgb25lIHBheW1lbnQEDGJ1eUluQXNzZXRpZAQHJG1hdGNoMAgFA3BtdAdhc3NldElkAwkAAQIFByRtYXRjaDACBFVuaXQEAWIFByRtYXRjaDACAAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWIJAAIBAgtNYXRjaCBlcnJvcgQTYnV5SW5SZXF1aXJlZEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBGHRvdXJuYW1lbnRCdXlJbkFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAQUYnV5SW5SZXF1aXJlZEFzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJARl0b3VybmFtZW50QnV5SW5Bc3NldElkS2V5AQUMdG91cm5hbWVudElkAwkBAiE9AgUTYnV5SW5SZXF1aXJlZEFtb3VudAgFA3BtdAZhbW91bnQJAAIBCQCsAgICLEF0dGFjaGVkIHBheW1lbnQgYW1vdW50IGlzIGludmFsaWQsIG11c3QgYmUgCQCkAwEFE2J1eUluUmVxdWlyZWRBbW91bnQDCQECIT0CBRRidXlJblJlcXVpcmVkQXNzZXRJZAUMYnV5SW5Bc3NldGlkCQACAQkArAICAi5BdHRhY2hlZCBwYXltZW50IGFzc2V0IGlkIGlzIGludmFsaWQsIG11c3QgYmUgBRRidXlJblJlcXVpcmVkQXNzZXRJZAQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBCQEmdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRLZXkBBQx0b3VybmFtZW50SWQIBQNwbXQGYW1vdW50BAlmZWVzVGFrZW4JAGsDBRl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50BRl0b3VybmFtZW50QnV5SW5GZWVQZXJjZW50AGQJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBHXRpY2tldEZvclRvdXJuYW1lbnRGb3JBY2NvdW50AgUMdG91cm5hbWVudElkBQ1jYWxsZXJBZGRyU3RyBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBImJ1eUluQW1vdW50Rm9yVG91cm5hbWVudEZvckFjY291bnQCBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIIBQNwbXQGYW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJASNidXlJbkFzc2V0SWRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgUMYnV5SW5Bc3NldGlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAkAZAIFHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50AAEJAMwIAgkBDEludGVnZXJFbnRyeQIJASZ0b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAUZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBL3RvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50TWludXNGZWVzS2V5AQUMdG91cm5hbWVudElkCQBlAgUZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAUJZmVlc1Rha2VuBQNuaWwAAQFpARBjYW5jZWxUb3VybmFtZW50AQx0b3VybmFtZW50SWQEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQRdG91cm5hbWVudENyZWF0b3IJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARR0b3VybmFtZW50Q3JlYXRvcktleQEFDHRvdXJuYW1lbnRJZAQMY3JlYXRvckNoZWNrAwkAAAIFEXRvdXJuYW1lbnRDcmVhdG9yBQ1jYWxsZXJBZGRyU3RyBgMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQACAQImT25seSB0b3VybmFtZW50IGNyZWF0b3IgY2FuIGNhbmNlbCBpdCEDCQAAAgUMY3JlYXRvckNoZWNrBQxjcmVhdG9yQ2hlY2sEEHRvdXJuYW1lbnRTdGF0dXMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkAwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AgUQdG91cm5hbWVudFN0YXR1cwIMcmVnaXN0cmF0aW9uBwkAAgECKFRvdXJuYW1lbnQgaXMgbm90IGluIHJlZ2lzdHJhdGlvbiBwaGFzZSEEHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50CQENdHJ5R2V0SW50ZWdlcgEJARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkAwkAZgIFHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50AAAJAAIBAkVDYW5ub3QgY2FuY2VsIGEgdG91cm5hbWVudCB3aGVuIHBsYXllcnMgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZCB0byBpdCEEFXRvdXJuYW1lbnRQcml6ZUFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBGHRvdXJuYW1lbnRQcml6ZUFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAQWdG91cm5hbWVudFByaXplQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTgpAQkBGXRvdXJuYW1lbnRQcml6ZUFzc2V0SWRLZXkBBQx0b3VybmFtZW50SWQJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQEYdG91cm5hbWVudFByaXplQW1vdW50S2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARx0b3VybmFtZW50TWF4UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARl0b3VybmFtZW50UHJpemVBc3NldElkS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARt0b3VybmFtZW50UHJpemVBc3NldE5hbWVLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBH3RvdXJuYW1lbnRQcml6ZUFzc2V0RGVjaW1hbHNLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGHRvdXJuYW1lbnRCdXlJbkFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEbdG91cm5hbWVudEJ1eUluQXNzZXROYW1lS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAR90b3VybmFtZW50QnV5SW5Bc3NldERlY2ltYWxzS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARl0b3VybmFtZW50QnV5SW5Bc3NldElkS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARF0b3VybmFtZW50TmFtZUtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEUdG91cm5hbWVudENyZWF0b3JLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQURdG91cm5hbWVudENyZWF0b3IFFXRvdXJuYW1lbnRQcml6ZUFtb3VudAkA2QQBBRZ0b3VybmFtZW50UHJpemVBc3NldElkBQNuaWwAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjcmVhdGVUb3VybmFtZW50BQx0b3VybmFtZW50SWQEbmFtZQxwbGF5ZXJzQ291bnQLYnV5SW5BbW91bnQMYnV5SW5Bc3NldElkBANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwMJAAACBQ1jYWxsZXJBZGRyU3RyBR9hbGxvd2VkU3BlY2lhbFRvdXJuYW1lbnRDcmVhdG9yCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAAACQACAQIhUGxlYXNlIGF0dGFjaCBleGFjdGx5IG9uZSBwYXltZW50BBF0b3VybmFtZW50Q3JlYXRvcgQHJG1hdGNoMAkAoggBCQEUdG91cm5hbWVudENyZWF0b3JLZXkBBQx0b3VybmFtZW50SWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAdjcmVhdG9yBQckbWF0Y2gwCQACAQkArAICAidUb3VybmFtZW50IGFscmVhZHkgZXhpc3RzIHdpdGggdGhpcyBpZCAFDHRvdXJuYW1lbnRJZAUEdW5pdAMJAAACBRF0b3VybmFtZW50Q3JlYXRvcgURdG91cm5hbWVudENyZWF0b3IEDHByaXplQXNzZXRJZAQHJG1hdGNoMAgFA3BtdAdhc3NldElkAwkAAQIFByRtYXRjaDACBFVuaXQEAWIFByRtYXRjaDACAAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWIJAAIBAgtNYXRjaCBlcnJvcgQMYXNzZXREZXRhaWxzBAckbWF0Y2gwCAUDcG10B2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIEVW5pdAQBYgUHJG1hdGNoMAkAzAgCAgVXYXZlcwkAzAgCAAgFA25pbAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwBAckbWF0Y2gxCQDsBwEFAWIDCQABAgUHJG1hdGNoMQIFQXNzZXQEBWFzc2V0BQckbWF0Y2gxCQDMCAIIBQVhc3NldARuYW1lCQDMCAIIBQVhc3NldAhkZWNpbWFscwUDbmlsCQACAQIQQ2FuJ3QgZmluZCBhc3NldAkAAgECC01hdGNoIGVycm9yBApidXlJbkFzc2V0BAckbWF0Y2gwCQDsBwEJANkEAQUMYnV5SW5Bc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAkAzAgCCAUFYXNzZXQEbmFtZQkAzAgCCAUFYXNzZXQIZGVjaW1hbHMFA25pbAkAzAgCAgAJAMwIAgAABQNuaWwEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYdG91cm5hbWVudFByaXplQW1vdW50S2V5AQUMdG91cm5hbWVudElkCAUDcG10BmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGXRvdXJuYW1lbnRQbGF5ZXJzQ291bnRLZXkBBQx0b3VybmFtZW50SWQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHHRvdXJuYW1lbnRNYXhQbGF5ZXJzQ291bnRLZXkBBQx0b3VybmFtZW50SWQFDHBsYXllcnNDb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEZdG91cm5hbWVudFByaXplQXNzZXRJZEtleQEFDHRvdXJuYW1lbnRJZAUMcHJpemVBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARt0b3VybmFtZW50UHJpemVBc3NldE5hbWVLZXkBBQx0b3VybmFtZW50SWQKAAFACQCRAwIFDGFzc2V0RGV0YWlscwAAAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBH3RvdXJuYW1lbnRQcml6ZUFzc2V0RGVjaW1hbHNLZXkBBQx0b3VybmFtZW50SWQKAAFACQCRAwIFDGFzc2V0RGV0YWlscwABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAzAgCCQELU3RyaW5nRW50cnkCCQETdG91cm5hbWVudFN0YXR1c0tleQEFDHRvdXJuYW1lbnRJZAIMcmVnaXN0cmF0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYdG91cm5hbWVudEJ1eUluQW1vdW50S2V5AQUMdG91cm5hbWVudElkBQtidXlJbkFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEbdG91cm5hbWVudEJ1eUluQXNzZXROYW1lS2V5AQUMdG91cm5hbWVudElkCgABQAkAkQMCBQpidXlJbkFzc2V0AAADCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEfdG91cm5hbWVudEJ1eUluQXNzZXREZWNpbWFsc0tleQEFDHRvdXJuYW1lbnRJZAoAAUAJAJEDAgUKYnV5SW5Bc3NldAABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAzAgCCQELU3RyaW5nRW50cnkCCQEZdG91cm5hbWVudEJ1eUluQXNzZXRJZEtleQEFDHRvdXJuYW1lbnRJZAUMYnV5SW5Bc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARF0b3VybmFtZW50TmFtZUtleQEFDHRvdXJuYW1lbnRJZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEUdG91cm5hbWVudENyZWF0b3JLZXkBBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIFA25pbAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD3N0YXJ0VG91cm5hbWVudAEMdG91cm5hbWVudElkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gT25seQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkAgdzdGFydGVkBQNuaWwAAQFpARBmaW5pc2hUb3VybmFtZW50Agx0b3VybmFtZW50SWQdd2lubmluZ1RyYW5zZmVydFRyYW5zYWN0aW9uSWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgpBZG1pbiBPbmx5BBF0b3VybmFtZW50Q3JlYXRvcgkBEUBleHRyTmF0aXZlKDEwNTgpAQkBFHRvdXJuYW1lbnRDcmVhdG9yS2V5AQUMdG91cm5hbWVudElkBBp0b3VybmFtZW50VG90YWxCdXlJbkFtb3VudAkBDXRyeUdldEludGVnZXIBCQEmdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRLZXkBBQx0b3VybmFtZW50SWQEFXRvdXJuYW1lbnRCdXlJbkFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBGHRvdXJuYW1lbnRCdXlJbkFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAQWdG91cm5hbWVudEJ1eUluQXNzZXRJZAQHJG1hdGNoMAkAoggBCQEZdG91cm5hbWVudEJ1eUluQXNzZXRJZEtleQEFDHRvdXJuYW1lbnRJZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmlkBQckbWF0Y2gwAwkAAAIFAmlkAgAFBHVuaXQJANkEAQUCaWQFBHVuaXQEEnRvdXJuYW1lbnRCdXlJbkZlZQkAawMFGnRvdXJuYW1lbnRUb3RhbEJ1eUluQW1vdW50BRl0b3VybmFtZW50QnV5SW5GZWVQZXJjZW50AGQEFXRvdXJuYW1lbnRQcml6ZUFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBGHRvdXJuYW1lbnRQcml6ZUFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAMJAGYCBRV0b3VybmFtZW50UHJpemVBbW91bnQAAAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJASF0b3VybmFtZW50V2lubmluZ1RyYW5zYWN0aW9uSWRLZXkBBQx0b3VybmFtZW50SWQFHXdpbm5pbmdUcmFuc2ZlcnRUcmFuc2FjdGlvbklkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkAghmaW5pc2hlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHnRvdXJuYW1lbnRCdXlJbkZlZUNvbGxlY3RlZEtleQEFDHRvdXJuYW1lbnRJZAUSdG91cm5hbWVudEJ1eUluRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEXRvdXJuYW1lbnRDcmVhdG9yCQBlAgUadG91cm5hbWVudFRvdGFsQnV5SW5BbW91bnQFEnRvdXJuYW1lbnRCdXlJbkZlZQUWdG91cm5hbWVudEJ1eUluQXNzZXRJZAUDbmlsAAEECnNlcnZpY2VGZWUJAGsDBRJ0b3VybmFtZW50QnV5SW5GZWUAFABkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBIXRvdXJuYW1lbnRXaW5uaW5nVHJhbnNhY3Rpb25JZEtleQEFDHRvdXJuYW1lbnRJZAUdd2lubmluZ1RyYW5zZmVydFRyYW5zYWN0aW9uSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQCCGZpbmlzaGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEedG91cm5hbWVudEJ1eUluRmVlQ29sbGVjdGVkS2V5AQUMdG91cm5hbWVudElkBRJ0b3VybmFtZW50QnV5SW5GZWUJAMwIAgkBDEludGVnZXJFbnRyeQIJASB0b3VybmFtZW50U2VydmljZUZlZUNvbGxlY3RlZEtleQEFDHRvdXJuYW1lbnRJZAUKc2VydmljZUZlZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBRF0b3VybmFtZW50Q3JlYXRvcgkAZQIFEnRvdXJuYW1lbnRCdXlJbkZlZQUKc2VydmljZUZlZQUWdG91cm5hbWVudEJ1eUluQXNzZXRJZAUDbmlsAAEBaQEOcGxheWVyRXhpdEdhbWUDBmdhbWVJZApwbGF5ZXJBZGRyD2V4aXRTdGFja0Ftb3VudAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCkFkbWluIE9ubHkEF2N1cnJlbnRUb3RhbExvY2tlZEZ1bmRzCQENdHJ5R2V0SW50ZWdlcgEJARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEFCnBsYXllckFkZHIEIGN1cnJlbnRHYW1lTG9ja2VkQW1vdW50Rm9yUGxheWVyCQENdHJ5R2V0SW50ZWdlcgEJARxhZGRyZXNzTG9ja2VkRnVuZHNGb3JHYW1lS2V5AgUKcGxheWVyQWRkcgUGZ2FtZUlkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEFCnBsYXllckFkZHIJAGUCBRdjdXJyZW50VG90YWxMb2NrZWRGdW5kcwUgY3VycmVudEdhbWVMb2NrZWRBbW91bnRGb3JQbGF5ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARxhZGRyZXNzTG9ja2VkRnVuZHNGb3JHYW1lS2V5AgUKcGxheWVyQWRkcgUGZ2FtZUlkAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUKcGxheWVyQWRkcgUPZXhpdFN0YWNrQW1vdW50CQDZBAEFDmRlcG9zaXRBc3NldElkBQNuaWwAAQFpARBsb2NrRnVuZHNGb3JHYW1lAQZnYW1lSWQEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECIVBsZWFzZSBhdHRhY2ggZXhhY3RseSBvbmUgcGF5bWVudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAkA2QQBBQ5kZXBvc2l0QXNzZXRJZAkAAgECGVlvdSBjYW4gb25seSBkZXBvc2l0IFVTRE4EDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQXY3VycmVudFRvdGFsTG9ja2VkRnVuZHMJAQ10cnlHZXRJbnRlZ2VyAQkBGmFkZHJlc3NUb3RhbExvY2tlZEZ1bmRzS2V5AQUNY2FsbGVyQWRkclN0cgQeY3VycmVudExvY2tlZEZ1bmRzVG90YWxIaXN0b3J5CQENdHJ5R2V0SW50ZWdlcgEJASFhZGRyZXNzTG9ja2VkRnVuZHNUb3RhbEhpc3RvcnlLZXkBBQ1jYWxsZXJBZGRyU3RyCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAGQCBRdjdXJyZW50VG90YWxMb2NrZWRGdW5kcwgFA3BtdAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJASFhZGRyZXNzTG9ja2VkRnVuZHNUb3RhbEhpc3RvcnlLZXkBBQ1jYWxsZXJBZGRyU3RyCQBkAgUeY3VycmVudExvY2tlZEZ1bmRzVG90YWxIaXN0b3J5CAUDcG10BmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHGFkZHJlc3NMb2NrZWRGdW5kc0ZvckdhbWVLZXkCBQ1jYWxsZXJBZGRyU3RyBQZnYW1lSWQIBQNwbXQGYW1vdW50BQNuaWwAAQFpARNiZXRPblZpZGVvUG9rZXJHYW1lAQZnYW1lSWQEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECIVBsZWFzZSBhdHRhY2ggZXhhY3RseSBvbmUgcGF5bWVudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAkA2QQBBQ5kZXBvc2l0QXNzZXRJZAkAAgECGVlvdSBjYW4gb25seSBkZXBvc2l0IFVTRE4EDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXdmlkZW9Qb2tlckJldEZvckFjY291bnQCBQZnYW1lSWQFDWNhbGxlckFkZHJTdHIIBQNwbXQGYW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARp2aWRlb1Bva2VyUGxheWVyQWRkcmVzc0tleQEFBmdhbWVJZAUNY2FsbGVyQWRkclN0cgkAzAgCCQELU3RyaW5nRW50cnkCCQETdmlkZW9Qb2tlclN0YXR1c0tleQEFBmdhbWVJZAIHY3JlYXRlZAUDbmlsAAEBaQEUZmluaXNoVmlkZW9Qb2tlckdhbWUDBmdhbWVJZAZyZXN1bHQKY2FyZHNEcmF3bgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCkFkbWluIE9ubHkECnBsYXllckFkZHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARp2aWRlb1Bva2VyUGxheWVyQWRkcmVzc0tleQEFBmdhbWVJZAQJYmV0QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBCQEXdmlkZW9Qb2tlckJldEZvckFjY291bnQCBQZnYW1lSWQFCnBsYXllckFkZHIEEWN1cnJlbnRHYW1lU3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1OCkBCQETdmlkZW9Qb2tlclN0YXR1c0tleQEFBmdhbWVJZAQLY2hlY2tTdGF0dXMDCQAAAgURY3VycmVudEdhbWVTdGF0dXMCB2NyZWF0ZWQGCQACAQIiR2FtZSBpcyBub3QgaW4gdGhlIGNvcnJlY3Qgc3RhdHVzIQMJAAACBQtjaGVja1N0YXR1cwULY2hlY2tTdGF0dXMEDWJldE11bHRpcGxpZXIDCQAAAgUGcmVzdWx0AglQYWlyLCBKJ3MAAQMJAAACBQZyZXN1bHQCCVBhaXIsIFEncwABAwkAAAIFBnJlc3VsdAIJUGFpciwgSydzAAEDCQAAAgUGcmVzdWx0AglQYWlyLCBBJ3MAAQMJAAACBQZyZXN1bHQCCFR3byBQYWlyAAIDCQAAAgUGcmVzdWx0Ag9UaHJlZSBvZiBhIEtpbmQAAwMJAAACBQZyZXN1bHQCCFN0cmFpZ2h0AAQDCQAAAgUGcmVzdWx0AgVGbHVzaAAGAwkAAAIFBnJlc3VsdAIKRnVsbCBIb3VzZQAJAwkAAAIFBnJlc3VsdAIORm91ciBvZiBhIEtpbmQAGQMJAAACBQZyZXN1bHQCDlN0cmFpZ2h0IEZsdXNoADIDCQAAAgUGcmVzdWx0AgtSb3lhbCBGbHVzaACgBgAAAwkAAAIFDWJldE11bHRpcGxpZXIFDWJldE11bHRpcGxpZXIECWFtb3VudFdvbgkAaAIFCWJldEFtb3VudAUNYmV0TXVsdGlwbGllcgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJARd2aWRlb1Bva2VyQ2FyZHNEcmF3bktleQEFBmdhbWVJZAUKY2FyZHNEcmF3bgkAzAgCCQELU3RyaW5nRW50cnkCCQETdmlkZW9Qb2tlclJlc3VsdEtleQEFBmdhbWVJZAUGcmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZdmlkZW9Qb2tlclJlc3VsdFByb2ZpdEtleQEFBmdhbWVJZAUJYW1vdW50V29uCQDMCAIJAQtTdHJpbmdFbnRyeQIJARN2aWRlb1Bva2VyU3RhdHVzS2V5AQUGZ2FtZUlkAghmaW5pc2hlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQpwbGF5ZXJBZGRyBQlhbW91bnRXb24JANkEAQUOZGVwb3NpdEFzc2V0SWQFA25pbAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleU3/7FM=", "height": 2318751, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: B5sq4stVy35RAGNeZjbrCmegG5vTHHgktZDLj8edfdwD Next: none Diff:
OldNewDifferences
129129 func videoPokerPlayerAddressKey (gameId) = (gameId + "_videoPokerPlayerAddress")
130130
131131
132+func topUpAddressFundsKey (playerAddr) = (playerAddr + "_topUpFunds")
133+
134+
132135 func getTicketsCount (addressString) = tryGetInteger(getTicketsCountKey(addressString))
133136
134137
145148 func setFeeCollectorAddress (collectorAddr) = if ((i.caller != this))
146149 then throw("Admin Only")
147150 else [StringEntry(feeCollectorAddressKey, collectorAddr)]
151+
152+
153+
154+@Callable(i)
155+func topUpFunds () = {
156+ let pmt = if ((size(i.payments) == 1))
157+ then i.payments[0]
158+ else throw("Please attach exactly one payment")
159+ if ((pmt.assetId != fromBase58String(depositAssetId)))
160+ then throw("You can only deposit USDN")
161+ else {
162+ let callerAddrStr = toBase58String(i.caller.bytes)
163+ $Tuple2([IntegerEntry(topUpAddressFundsKey(callerAddrStr), pmt.amount)], 1)
164+ }
165+ }
148166
149167
150168
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let waves = 100000000
55
66 let ticketPriceInt = 1000000
77
88 let ticketPrice = ticketPriceInt
99
1010 let invFee = 500000
1111
1212 let withdrawFeePercent = 5
1313
1414 let feeCollectorAddressKey = "feeCollectorAddress"
1515
1616 let tournamentBuyInFeePercent = 10
1717
1818 let depositAssetId = "5ue1fiuV6j6UBr6Xf28Qms6y5FqzKtqvaxxhwu7hTQ58"
1919
2020 let allowedSpecialTournamentCreator = "3NAeBWCZFbBDFLYo9GNJNoE5hQ3aMsV5KsN"
2121
2222 func tryGetInteger (key) = match getInteger(this, key) {
2323 case b: Int =>
2424 b
2525 case _ =>
2626 0
2727 }
2828
2929
3030 func getTicketsCountKey (addressString) = (addressString + "_ticketsCount")
3131
3232
3333 func buyInAmountForTournamentForAccount (tournamentId,account) = ((tournamentId + "_buyInAmountForAccount_") + account)
3434
3535
3636 func buyInAssetIdForTournamentForAccount (tournamentId,account) = ((tournamentId + "_buyInAssetIdForAccount_") + account)
3737
3838
3939 func ticketForTournamentForAccount (tournamentId,account) = ((tournamentId + "_ticketForAccount_") + account)
4040
4141
4242 func tournamentTotalBuyInCollectedAmountKey (tournamentId) = (tournamentId + "_tournamentTotalBuyInCollectedAmount")
4343
4444
4545 func tournamentTotalBuyInCollectedAmountMinusFeesKey (tournamentId) = (tournamentId + "_tournamentTotalBuyInCollectedAmountMinusFees")
4646
4747
4848 func tournamentCreatorKey (tournamentId) = (tournamentId + "_tournamentCreator")
4949
5050
5151 func tournamentNameKey (tournamentId) = (tournamentId + "_tournamentName")
5252
5353
5454 func tournamentPrizeAmountKey (tournamentId) = (tournamentId + "_tournamentPrizeAmount")
5555
5656
5757 func tournamentMaxPlayersCountKey (tournamentId) = (tournamentId + "_tournamentMaxPlayersCount")
5858
5959
6060 func tournamentPlayersCountKey (tournamentId) = (tournamentId + "_tournamentPlayersCount")
6161
6262
6363 func tournamentPrizeAssetIdKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetId")
6464
6565
6666 func tournamentPrizeAssetNameKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetName")
6767
6868
6969 func tournamentBuyInAmountKey (tournamentId) = (tournamentId + "_tournamentBuyInAmount")
7070
7171
7272 func tournamentBuyInAssetIdKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetId")
7373
7474
7575 func tournamentBuyInAssetNameKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetName")
7676
7777
7878 func tournamentBuyInAssetDecimalsKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetDecimals")
7979
8080
8181 func tournamentPrizeAssetDecimalsKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetDecimals")
8282
8383
8484 func tournamentStatusKey (tournamentId) = (tournamentId + "_tournamentStatus")
8585
8686
8787 func tournamentBuyInFeeCollectedKey (tournamentId) = (tournamentId + "_tournamentBuyInFeeCollected")
8888
8989
9090 func tournamentServiceFeeCollectedKey (tournamentId) = (tournamentId + "_tournamentServiceFeeCollected")
9191
9292
9393 func tournamentWinningTransactionIdKey (tournamentId) = (tournamentId + "_tournamentWinningTransactionId")
9494
9595
9696 func gameWinnerKey (gameId) = (gameId + "_winner")
9797
9898
9999 func addressAvailableFundsKey (address) = (address + "_availableFunds")
100100
101101
102102 func addressTotalLockedFundsKey (address) = (address + "_totalLockedFunds")
103103
104104
105105 func addressLockedFundsTotalHistoryKey (address) = (address + "_lockedFundsTotalHistory")
106106
107107
108108 func addressLockedFundsForGameKey (address,gameId) = ((address + "_lockedFunds_") + gameId)
109109
110110
111111 func addressAvailableRewardsKey (address) = (address + "_availableRewards")
112112
113113
114114 func videoPokerBetForAccount (gameId,account) = ((gameId + "_videoPokerBetFor_") + account)
115115
116116
117117 func videoPokerCardsDrawnKey (gameId) = (gameId + "_videoPokerCardsDrawn")
118118
119119
120120 func videoPokerResultKey (gameId) = (gameId + "_videoPokerResult")
121121
122122
123123 func videoPokerResultProfitKey (gameId) = (gameId + "_videoPokerResultProfit")
124124
125125
126126 func videoPokerStatusKey (gameId) = (gameId + "_videoPokerStatus")
127127
128128
129129 func videoPokerPlayerAddressKey (gameId) = (gameId + "_videoPokerPlayerAddress")
130130
131131
132+func topUpAddressFundsKey (playerAddr) = (playerAddr + "_topUpFunds")
133+
134+
132135 func getTicketsCount (addressString) = tryGetInteger(getTicketsCountKey(addressString))
133136
134137
135138 func consumeTicket (playerAddr) = {
136139 let currentTicketCount = getTicketsCount(playerAddr)
137140 let newCurrentTicketCount = (currentTicketCount - 1)
138141 if ((0 > newCurrentTicketCount))
139142 then 0
140143 else newCurrentTicketCount
141144 }
142145
143146
144147 @Callable(i)
145148 func setFeeCollectorAddress (collectorAddr) = if ((i.caller != this))
146149 then throw("Admin Only")
147150 else [StringEntry(feeCollectorAddressKey, collectorAddr)]
151+
152+
153+
154+@Callable(i)
155+func topUpFunds () = {
156+ let pmt = if ((size(i.payments) == 1))
157+ then i.payments[0]
158+ else throw("Please attach exactly one payment")
159+ if ((pmt.assetId != fromBase58String(depositAssetId)))
160+ then throw("You can only deposit USDN")
161+ else {
162+ let callerAddrStr = toBase58String(i.caller.bytes)
163+ $Tuple2([IntegerEntry(topUpAddressFundsKey(callerAddrStr), pmt.amount)], 1)
164+ }
165+ }
148166
149167
150168
151169 @Callable(i)
152170 func depositFunds () = {
153171 let pmt = if ((size(i.payments) == 1))
154172 then i.payments[0]
155173 else throw("Please attach exactly one payment")
156174 if ((pmt.assetId != fromBase58String(depositAssetId)))
157175 then throw("You can only deposit USDN")
158176 else {
159177 let callerAddrStr = toBase58String(i.caller.bytes)
160178 let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(callerAddrStr))
161179 $Tuple2([IntegerEntry(addressAvailableFundsKey(callerAddrStr), (currentAvailableFunds + pmt.amount))], 1)
162180 }
163181 }
164182
165183
166184
167185 @Callable(i)
168186 func withdrawFunds () = {
169187 let callerAddrStr = toBase58String(i.caller.bytes)
170188 let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(callerAddrStr))
171189 $Tuple2([IntegerEntry(addressAvailableFundsKey(callerAddrStr), 0), ScriptTransfer(addressFromStringValue(callerAddrStr), currentAvailableFunds, fromBase58String(depositAssetId))], 1)
172190 }
173191
174192
175193
176194 @Callable(i)
177195 func finishDiceGame (playerAddress,bet,resultMultiplier) = if ((i.caller != this))
178196 then throw("Admin Only")
179197 else {
180198 let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(playerAddress))
181199 let betCheck = if ((bet > currentAvailableFunds))
182200 then throw("Not enough available funds to cover the bet!")
183201 else true
184202 if ((betCheck == betCheck))
185203 then $Tuple2([IntegerEntry(addressAvailableFundsKey(playerAddress), ((currentAvailableFunds - bet) + fraction(bet, resultMultiplier, 10000)))], 1)
186204 else throw("Strict value is not equal to itself.")
187205 }
188206
189207
190208
191209 @Callable(i)
192210 func cancelSignUpToTournament (tournamentId) = {
193211 let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
194212 if ((tournamentStatus != "registration"))
195213 then throw("Tournament is not in registration phase!")
196214 else {
197215 let callerAddrStr = toBase58String(i.caller.bytes)
198216 let paidBuyInAmount = getIntegerValue(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr))
199217 let paidBuyInAssetId = getStringValue(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr))
200218 let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
201219 let totalBuyInCollectedAmount = (tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId)) - paidBuyInAmount)
202220 let feesTaken = fraction(totalBuyInCollectedAmount, tournamentBuyInFeePercent, 100)
203221 $Tuple2([ScriptTransfer(addressFromStringValue(callerAddrStr), paidBuyInAmount, fromBase58String(paidBuyInAssetId)), DeleteEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr)), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount - 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), totalBuyInCollectedAmount), IntegerEntry(tournamentTotalBuyInCollectedAmountMinusFeesKey(tournamentId), (totalBuyInCollectedAmount - feesTaken))], 1)
204222 }
205223 }
206224
207225
208226
209227 @Callable(i)
210228 func signUpToTournament (tournamentId) = {
211229 let maxPlayersCount = getIntegerValue(this, tournamentMaxPlayersCountKey(tournamentId))
212230 let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
213231 let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
214232 if (if ((tournamentStatus != "registration"))
215233 then (tournamentStatus != "started")
216234 else false)
217235 then throw("Tournament is not in registration phase!")
218236 else if ((alreadyRegisteredPlayersCount == maxPlayersCount))
219237 then throw("Tournament is currently full, please try again later!")
220238 else {
221239 let pmt = if ((size(i.payments) == 1))
222240 then i.payments[0]
223241 else throw("Please attach exactly one payment")
224242 let buyInAssetid = match pmt.assetId {
225243 case b: Unit =>
226244 ""
227245 case b: ByteVector =>
228246 toBase58String(b)
229247 case _ =>
230248 throw("Match error")
231249 }
232250 let buyInRequiredAmount = getIntegerValue(this, tournamentBuyInAmountKey(tournamentId))
233251 let buyInRequiredAssetId = getStringValue(this, tournamentBuyInAssetIdKey(tournamentId))
234252 if ((buyInRequiredAmount != pmt.amount))
235253 then throw(("Attached payment amount is invalid, must be " + toString(buyInRequiredAmount)))
236254 else if ((buyInRequiredAssetId != buyInAssetid))
237255 then throw(("Attached payment asset id is invalid, must be " + buyInRequiredAssetId))
238256 else {
239257 let callerAddrStr = toBase58String(i.caller.bytes)
240258 let totalBuyInCollectedAmount = (tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId)) + pmt.amount)
241259 let feesTaken = fraction(totalBuyInCollectedAmount, tournamentBuyInFeePercent, 100)
242260 $Tuple2([BooleanEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr), true), IntegerEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr), pmt.amount), StringEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr), buyInAssetid), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount + 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), totalBuyInCollectedAmount), IntegerEntry(tournamentTotalBuyInCollectedAmountMinusFeesKey(tournamentId), (totalBuyInCollectedAmount - feesTaken))], 1)
243261 }
244262 }
245263 }
246264
247265
248266
249267 @Callable(i)
250268 func cancelTournament (tournamentId) = {
251269 let callerAddrStr = toBase58String(i.caller.bytes)
252270 let tournamentCreator = getStringValue(tournamentCreatorKey(tournamentId))
253271 let creatorCheck = if ((tournamentCreator == callerAddrStr))
254272 then true
255273 else if ((i.caller == this))
256274 then true
257275 else throw("Only tournament creator can cancel it!")
258276 if ((creatorCheck == creatorCheck))
259277 then {
260278 let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
261279 if (if ((i.caller != this))
262280 then (tournamentStatus != "registration")
263281 else false)
264282 then throw("Tournament is not in registration phase!")
265283 else {
266284 let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
267285 if ((alreadyRegisteredPlayersCount > 0))
268286 then throw("Cannot cancel a tournament when players are already registered to it!")
269287 else {
270288 let tournamentPrizeAmount = getIntegerValue(tournamentPrizeAmountKey(tournamentId))
271289 let tournamentPrizeAssetId = getStringValue(tournamentPrizeAssetIdKey(tournamentId))
272290 $Tuple2([DeleteEntry(tournamentPrizeAmountKey(tournamentId)), DeleteEntry(tournamentPlayersCountKey(tournamentId)), DeleteEntry(tournamentMaxPlayersCountKey(tournamentId)), DeleteEntry(tournamentPrizeAssetIdKey(tournamentId)), DeleteEntry(tournamentPrizeAssetNameKey(tournamentId)), DeleteEntry(tournamentPrizeAssetDecimalsKey(tournamentId)), DeleteEntry(tournamentStatusKey(tournamentId)), DeleteEntry(tournamentBuyInAmountKey(tournamentId)), DeleteEntry(tournamentBuyInAssetNameKey(tournamentId)), DeleteEntry(tournamentBuyInAssetDecimalsKey(tournamentId)), DeleteEntry(tournamentBuyInAssetIdKey(tournamentId)), DeleteEntry(tournamentNameKey(tournamentId)), DeleteEntry(tournamentCreatorKey(tournamentId)), ScriptTransfer(addressFromStringValue(tournamentCreator), tournamentPrizeAmount, fromBase58String(tournamentPrizeAssetId))], 1)
273291 }
274292 }
275293 }
276294 else throw("Strict value is not equal to itself.")
277295 }
278296
279297
280298
281299 @Callable(i)
282300 func createTournament (tournamentId,name,playersCount,buyInAmount,buyInAssetId) = {
283301 let pmt = if ((size(i.payments) == 1))
284302 then i.payments[0]
285303 else {
286304 let callerAddrStr = toBase58String(i.caller.bytes)
287305 if ((callerAddrStr == allowedSpecialTournamentCreator))
288306 then AttachedPayment(unit, 0)
289307 else throw("Please attach exactly one payment")
290308 }
291309 let tournamentCreator = match getString(tournamentCreatorKey(tournamentId)) {
292310 case creator: String =>
293311 throw(("Tournament already exists with this id " + tournamentId))
294312 case _ =>
295313 unit
296314 }
297315 if ((tournamentCreator == tournamentCreator))
298316 then {
299317 let prizeAssetId = match pmt.assetId {
300318 case b: Unit =>
301319 ""
302320 case b: ByteVector =>
303321 toBase58String(b)
304322 case _ =>
305323 throw("Match error")
306324 }
307325 let assetDetails = match pmt.assetId {
308326 case b: Unit =>
309327 ["Waves", 8]
310328 case b: ByteVector =>
311329 match assetInfo(b) {
312330 case asset: Asset =>
313331 [asset.name, asset.decimals]
314332 case _ =>
315333 throw("Can't find asset")
316334 }
317335 case _ =>
318336 throw("Match error")
319337 }
320338 let buyInAsset = match assetInfo(fromBase58String(buyInAssetId)) {
321339 case asset: Asset =>
322340 [asset.name, asset.decimals]
323341 case _ =>
324342 ["", 0]
325343 }
326344 let callerAddrStr = toBase58String(i.caller.bytes)
327345 $Tuple2([IntegerEntry(tournamentPrizeAmountKey(tournamentId), pmt.amount), IntegerEntry(tournamentPlayersCountKey(tournamentId), 0), IntegerEntry(tournamentMaxPlayersCountKey(tournamentId), playersCount), StringEntry(tournamentPrizeAssetIdKey(tournamentId), prizeAssetId), StringEntry(tournamentPrizeAssetNameKey(tournamentId), {
328346 let @ = assetDetails[0]
329347 if ($isInstanceOf(@, "String"))
330348 then @
331349 else throw(($getType(@) + " couldn't be cast to String"))
332350 }), IntegerEntry(tournamentPrizeAssetDecimalsKey(tournamentId), {
333351 let @ = assetDetails[1]
334352 if ($isInstanceOf(@, "Int"))
335353 then @
336354 else throw(($getType(@) + " couldn't be cast to Int"))
337355 }), StringEntry(tournamentStatusKey(tournamentId), "registration"), IntegerEntry(tournamentBuyInAmountKey(tournamentId), buyInAmount), StringEntry(tournamentBuyInAssetNameKey(tournamentId), {
338356 let @ = buyInAsset[0]
339357 if ($isInstanceOf(@, "String"))
340358 then @
341359 else throw(($getType(@) + " couldn't be cast to String"))
342360 }), IntegerEntry(tournamentBuyInAssetDecimalsKey(tournamentId), {
343361 let @ = buyInAsset[1]
344362 if ($isInstanceOf(@, "Int"))
345363 then @
346364 else throw(($getType(@) + " couldn't be cast to Int"))
347365 }), StringEntry(tournamentBuyInAssetIdKey(tournamentId), buyInAssetId), StringEntry(tournamentNameKey(tournamentId), name), StringEntry(tournamentCreatorKey(tournamentId), callerAddrStr)], 1)
348366 }
349367 else throw("Strict value is not equal to itself.")
350368 }
351369
352370
353371
354372 @Callable(i)
355373 func startTournament (tournamentId) = if ((i.caller != this))
356374 then throw("Admin Only")
357375 else $Tuple2([StringEntry(tournamentStatusKey(tournamentId), "started")], 1)
358376
359377
360378
361379 @Callable(i)
362380 func finishTournament (tournamentId,winningTransfertTransactionId) = if ((i.caller != this))
363381 then throw("Admin Only")
364382 else {
365383 let tournamentCreator = getStringValue(tournamentCreatorKey(tournamentId))
366384 let tournamentTotalBuyInAmount = tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId))
367385 let tournamentBuyInAmount = getIntegerValue(tournamentBuyInAmountKey(tournamentId))
368386 let tournamentBuyInAssetId = match getString(tournamentBuyInAssetIdKey(tournamentId)) {
369387 case id: String =>
370388 if ((id == ""))
371389 then unit
372390 else fromBase58String(id)
373391 case _ =>
374392 unit
375393 }
376394 let tournamentBuyInFee = fraction(tournamentTotalBuyInAmount, tournamentBuyInFeePercent, 100)
377395 let tournamentPrizeAmount = getIntegerValue(tournamentPrizeAmountKey(tournamentId))
378396 if ((tournamentPrizeAmount > 0))
379397 then $Tuple2([StringEntry(tournamentWinningTransactionIdKey(tournamentId), winningTransfertTransactionId), StringEntry(tournamentStatusKey(tournamentId), "finished"), IntegerEntry(tournamentBuyInFeeCollectedKey(tournamentId), tournamentBuyInFee), ScriptTransfer(addressFromStringValue(tournamentCreator), (tournamentTotalBuyInAmount - tournamentBuyInFee), tournamentBuyInAssetId)], 1)
380398 else {
381399 let serviceFee = fraction(tournamentBuyInFee, 20, 100)
382400 $Tuple2([StringEntry(tournamentWinningTransactionIdKey(tournamentId), winningTransfertTransactionId), StringEntry(tournamentStatusKey(tournamentId), "finished"), IntegerEntry(tournamentBuyInFeeCollectedKey(tournamentId), tournamentBuyInFee), IntegerEntry(tournamentServiceFeeCollectedKey(tournamentId), serviceFee), ScriptTransfer(addressFromStringValue(tournamentCreator), (tournamentBuyInFee - serviceFee), tournamentBuyInAssetId)], 1)
383401 }
384402 }
385403
386404
387405
388406 @Callable(i)
389407 func playerExitGame (gameId,playerAddr,exitStackAmount) = if ((i.caller != this))
390408 then throw("Admin Only")
391409 else {
392410 let currentTotalLockedFunds = tryGetInteger(addressTotalLockedFundsKey(playerAddr))
393411 let currentGameLockedAmountForPlayer = tryGetInteger(addressLockedFundsForGameKey(playerAddr, gameId))
394412 $Tuple2([IntegerEntry(addressTotalLockedFundsKey(playerAddr), (currentTotalLockedFunds - currentGameLockedAmountForPlayer)), IntegerEntry(addressLockedFundsForGameKey(playerAddr, gameId), 0), ScriptTransfer(addressFromStringValue(playerAddr), exitStackAmount, fromBase58String(depositAssetId))], 1)
395413 }
396414
397415
398416
399417 @Callable(i)
400418 func lockFundsForGame (gameId) = {
401419 let pmt = if ((size(i.payments) == 1))
402420 then i.payments[0]
403421 else throw("Please attach exactly one payment")
404422 if ((pmt.assetId != fromBase58String(depositAssetId)))
405423 then throw("You can only deposit USDN")
406424 else {
407425 let callerAddrStr = toBase58String(i.caller.bytes)
408426 let currentTotalLockedFunds = tryGetInteger(addressTotalLockedFundsKey(callerAddrStr))
409427 let currentLockedFundsTotalHistory = tryGetInteger(addressLockedFundsTotalHistoryKey(callerAddrStr))
410428 $Tuple2([IntegerEntry(addressTotalLockedFundsKey(callerAddrStr), (currentTotalLockedFunds + pmt.amount)), IntegerEntry(addressLockedFundsTotalHistoryKey(callerAddrStr), (currentLockedFundsTotalHistory + pmt.amount)), IntegerEntry(addressLockedFundsForGameKey(callerAddrStr, gameId), pmt.amount)], 1)
411429 }
412430 }
413431
414432
415433
416434 @Callable(i)
417435 func betOnVideoPokerGame (gameId) = {
418436 let pmt = if ((size(i.payments) == 1))
419437 then i.payments[0]
420438 else throw("Please attach exactly one payment")
421439 if ((pmt.assetId != fromBase58String(depositAssetId)))
422440 then throw("You can only deposit USDN")
423441 else {
424442 let callerAddrStr = toBase58String(i.caller.bytes)
425443 $Tuple2([IntegerEntry(videoPokerBetForAccount(gameId, callerAddrStr), pmt.amount), StringEntry(videoPokerPlayerAddressKey(gameId), callerAddrStr), StringEntry(videoPokerStatusKey(gameId), "created")], 1)
426444 }
427445 }
428446
429447
430448
431449 @Callable(i)
432450 func finishVideoPokerGame (gameId,result,cardsDrawn) = if ((i.caller != this))
433451 then throw("Admin Only")
434452 else {
435453 let playerAddr = getStringValue(videoPokerPlayerAddressKey(gameId))
436454 let betAmount = getIntegerValue(videoPokerBetForAccount(gameId, playerAddr))
437455 let currentGameStatus = getStringValue(videoPokerStatusKey(gameId))
438456 let checkStatus = if ((currentGameStatus == "created"))
439457 then true
440458 else throw("Game is not in the correct status!")
441459 if ((checkStatus == checkStatus))
442460 then {
443461 let betMultiplier = if ((result == "Pair, J's"))
444462 then 1
445463 else if ((result == "Pair, Q's"))
446464 then 1
447465 else if ((result == "Pair, K's"))
448466 then 1
449467 else if ((result == "Pair, A's"))
450468 then 1
451469 else if ((result == "Two Pair"))
452470 then 2
453471 else if ((result == "Three of a Kind"))
454472 then 3
455473 else if ((result == "Straight"))
456474 then 4
457475 else if ((result == "Flush"))
458476 then 6
459477 else if ((result == "Full House"))
460478 then 9
461479 else if ((result == "Four of a Kind"))
462480 then 25
463481 else if ((result == "Straight Flush"))
464482 then 50
465483 else if ((result == "Royal Flush"))
466484 then 800
467485 else 0
468486 if ((betMultiplier == betMultiplier))
469487 then {
470488 let amountWon = (betAmount * betMultiplier)
471489 $Tuple2([StringEntry(videoPokerCardsDrawnKey(gameId), cardsDrawn), StringEntry(videoPokerResultKey(gameId), result), IntegerEntry(videoPokerResultProfitKey(gameId), amountWon), StringEntry(videoPokerStatusKey(gameId), "finished"), ScriptTransfer(addressFromStringValue(playerAddr), amountWon, fromBase58String(depositAssetId))], 1)
472490 }
473491 else throw("Strict value is not equal to itself.")
474492 }
475493 else throw("Strict value is not equal to itself.")
476494 }
477495
478496
479497 @Verifier(tx)
480498 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
481499

github/deemru/w8io/873ac7e 
81.10 ms