tx · B723E4vhm3hCk1RCVYjtoVGcQBknXN23ydGJXBTguTA4

3MuNcpLho1zN561RA1suQiarip4vpmZcds1:  -0.01800000 Waves

2023.10.17 00:13 [2801695] smart account 3MuNcpLho1zN561RA1suQiarip4vpmZcds1 > SELF 0.00000000 Waves

{ "type": 13, "id": "B723E4vhm3hCk1RCVYjtoVGcQBknXN23ydGJXBTguTA4", "fee": 1800000, "feeAssetId": null, "timestamp": 1697490840574, "version": 2, "chainId": 84, "sender": "3MuNcpLho1zN561RA1suQiarip4vpmZcds1", "senderPublicKey": "CzqJdzHrRmfZuEsQSNuFVdaxxzkZcQki4pEA223FGGV", "proofs": [ "4jyTmvCuMVH5Td2ZKpvUQ4WUbGcNXmYPvqeeFhZ7QRKxpN6yXmu2rfsjjj5W38rdMXzHiV1S17T1fJSGMpJy2B84" ], "script": "base64:BgJPCAISAwoBCBIAEgASABIFCgMIAQESAwoBCBIDCgEIEgMKAQgSBwoFCAgBAQgSAwoBCBIECgIICBIFCgMICAESAwoBCBIDCgEIEgUKAwgICC8ABXdhdmVzAIDC1y8ADnRpY2tldFByaWNlSW50AMCEPQALdGlja2V0UHJpY2UFDnRpY2tldFByaWNlSW50AAZpbnZGZWUAoMIeABJ3aXRoZHJhd0ZlZVBlcmNlbnQABQAWZmVlQ29sbGVjdG9yQWRkcmVzc0tleQITZmVlQ29sbGVjdG9yQWRkcmVzcwAZdG91cm5hbWVudEJ1eUluRmVlUGVyY2VudAAKAA5kZXBvc2l0QXNzZXRJZAIsNXVlMWZpdVY2ajZVQnI2WGYyOFFtczZ5NUZxekt0cXZheHhod3U3aFRRNTgAH2FsbG93ZWRTcGVjaWFsVG91cm5hbWVudENyZWF0b3ICIzNOOWRITDNzRzF0Y2MyRURjNGhzYnJQUVQxWXZMb3ZTdW5vAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAARJnZXRUaWNrZXRzQ291bnRLZXkBDWFkZHJlc3NTdHJpbmcJAKwCAgUNYWRkcmVzc1N0cmluZwINX3RpY2tldHNDb3VudAEiYnV5SW5BbW91bnRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIMdG91cm5hbWVudElkB2FjY291bnQJAKwCAgkArAICBQx0b3VybmFtZW50SWQCF19idXlJbkFtb3VudEZvckFjY291bnRfBQdhY2NvdW50ASNidXlJbkFzc2V0SWRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIMdG91cm5hbWVudElkB2FjY291bnQJAKwCAgkArAICBQx0b3VybmFtZW50SWQCGF9idXlJbkFzc2V0SWRGb3JBY2NvdW50XwUHYWNjb3VudAEddGlja2V0Rm9yVG91cm5hbWVudEZvckFjY291bnQCDHRvdXJuYW1lbnRJZAdhY2NvdW50CQCsAgIJAKwCAgUMdG91cm5hbWVudElkAhJfdGlja2V0Rm9yQWNjb3VudF8FB2FjY291bnQBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAiRfdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnQBL3RvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50TWludXNGZWVzS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAi1fdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRNaW51c0ZlZXMBFHRvdXJuYW1lbnRDcmVhdG9yS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhJfdG91cm5hbWVudENyZWF0b3IBEXRvdXJuYW1lbnROYW1lS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAg9fdG91cm5hbWVudE5hbWUBGHRvdXJuYW1lbnRQcml6ZUFtb3VudEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIWX3RvdXJuYW1lbnRQcml6ZUFtb3VudAEcdG91cm5hbWVudE1heFBsYXllcnNDb3VudEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIaX3RvdXJuYW1lbnRNYXhQbGF5ZXJzQ291bnQBGXRvdXJuYW1lbnRQbGF5ZXJzQ291bnRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCF190b3VybmFtZW50UGxheWVyc0NvdW50ARl0b3VybmFtZW50UHJpemVBc3NldElkS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhdfdG91cm5hbWVudFByaXplQXNzZXRJZAEbdG91cm5hbWVudFByaXplQXNzZXROYW1lS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhlfdG91cm5hbWVudFByaXplQXNzZXROYW1lARh0b3VybmFtZW50QnV5SW5BbW91bnRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCFl90b3VybmFtZW50QnV5SW5BbW91bnQBGXRvdXJuYW1lbnRCdXlJbkFzc2V0SWRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCF190b3VybmFtZW50QnV5SW5Bc3NldElkARt0b3VybmFtZW50QnV5SW5Bc3NldE5hbWVLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCGV90b3VybmFtZW50QnV5SW5Bc3NldE5hbWUBH3RvdXJuYW1lbnRCdXlJbkFzc2V0RGVjaW1hbHNLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCHV90b3VybmFtZW50QnV5SW5Bc3NldERlY2ltYWxzAR90b3VybmFtZW50UHJpemVBc3NldERlY2ltYWxzS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAh1fdG91cm5hbWVudFByaXplQXNzZXREZWNpbWFscwETdG91cm5hbWVudFN0YXR1c0tleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIRX3RvdXJuYW1lbnRTdGF0dXMBHnRvdXJuYW1lbnRCdXlJbkZlZUNvbGxlY3RlZEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIcX3RvdXJuYW1lbnRCdXlJbkZlZUNvbGxlY3RlZAEgdG91cm5hbWVudFNlcnZpY2VGZWVDb2xsZWN0ZWRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCHl90b3VybmFtZW50U2VydmljZUZlZUNvbGxlY3RlZAEhdG91cm5hbWVudFdpbm5pbmdUcmFuc2FjdGlvbklkS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAh9fdG91cm5hbWVudFdpbm5pbmdUcmFuc2FjdGlvbklkAQ1nYW1lV2lubmVyS2V5AQZnYW1lSWQJAKwCAgUGZ2FtZUlkAgdfd2lubmVyARhhZGRyZXNzQXZhaWxhYmxlRnVuZHNLZXkBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIPX2F2YWlsYWJsZUZ1bmRzARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhFfdG90YWxMb2NrZWRGdW5kcwEhYWRkcmVzc0xvY2tlZEZ1bmRzVG90YWxIaXN0b3J5S2V5AQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCGF9sb2NrZWRGdW5kc1RvdGFsSGlzdG9yeQEcYWRkcmVzc0xvY2tlZEZ1bmRzRm9yR2FtZUtleQIHYWRkcmVzcwZnYW1lSWQJAKwCAgkArAICBQdhZGRyZXNzAg1fbG9ja2VkRnVuZHNfBQZnYW1lSWQBGmFkZHJlc3NBdmFpbGFibGVSZXdhcmRzS2V5AQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCEV9hdmFpbGFibGVSZXdhcmRzARd2aWRlb1Bva2VyQmV0Rm9yQWNjb3VudAIGZ2FtZUlkB2FjY291bnQJAKwCAgkArAICBQZnYW1lSWQCEl92aWRlb1Bva2VyQmV0Rm9yXwUHYWNjb3VudAEXdmlkZW9Qb2tlckNhcmRzRHJhd25LZXkBBmdhbWVJZAkArAICBQZnYW1lSWQCFV92aWRlb1Bva2VyQ2FyZHNEcmF3bgETdmlkZW9Qb2tlclJlc3VsdEtleQEGZ2FtZUlkCQCsAgIFBmdhbWVJZAIRX3ZpZGVvUG9rZXJSZXN1bHQBGXZpZGVvUG9rZXJSZXN1bHRQcm9maXRLZXkBBmdhbWVJZAkArAICBQZnYW1lSWQCF192aWRlb1Bva2VyUmVzdWx0UHJvZml0ARN2aWRlb1Bva2VyU3RhdHVzS2V5AQZnYW1lSWQJAKwCAgUGZ2FtZUlkAhFfdmlkZW9Qb2tlclN0YXR1cwEadmlkZW9Qb2tlclBsYXllckFkZHJlc3NLZXkBBmdhbWVJZAkArAICBQZnYW1lSWQCGF92aWRlb1Bva2VyUGxheWVyQWRkcmVzcwEUdG9wVXBBZGRyZXNzRnVuZHNLZXkBCnBsYXllckFkZHIJAKwCAgUKcGxheWVyQWRkcgILX3RvcFVwRnVuZHMBD2dldFRpY2tldHNDb3VudAENYWRkcmVzc1N0cmluZwkBDXRyeUdldEludGVnZXIBCQESZ2V0VGlja2V0c0NvdW50S2V5AQUNYWRkcmVzc1N0cmluZwENY29uc3VtZVRpY2tldAEKcGxheWVyQWRkcgQSY3VycmVudFRpY2tldENvdW50CQEPZ2V0VGlja2V0c0NvdW50AQUKcGxheWVyQWRkcgQVbmV3Q3VycmVudFRpY2tldENvdW50CQBlAgUSY3VycmVudFRpY2tldENvdW50AAEDCQBmAgAABRVuZXdDdXJyZW50VGlja2V0Q291bnQAAAUVbmV3Q3VycmVudFRpY2tldENvdW50DwFpARZzZXRGZWVDb2xsZWN0b3JBZGRyZXNzAQ1jb2xsZWN0b3JBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gT25seQkAzAgCCQELU3RyaW5nRW50cnkCBRZmZWVDb2xsZWN0b3JBZGRyZXNzS2V5BQ1jb2xsZWN0b3JBZGRyBQNuaWwBaQEKdG9wVXBGdW5kcwAEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECIVBsZWFzZSBhdHRhY2ggZXhhY3RseSBvbmUgcGF5bWVudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAkA2QQBBQ5kZXBvc2l0QXNzZXRJZAkAAgECGVlvdSBjYW4gb25seSBkZXBvc2l0IFVTRE4EDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUdG9wVXBBZGRyZXNzRnVuZHNLZXkBBQ1jYWxsZXJBZGRyU3RyCAUDcG10BmFtb3VudAUDbmlsAAEBaQEMZGVwb3NpdEZ1bmRzAAQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQIhUGxlYXNlIGF0dGFjaCBleGFjdGx5IG9uZSBwYXltZW50AwkBAiE9AggFA3BtdAdhc3NldElkCQDZBAEFDmRlcG9zaXRBc3NldElkCQACAQIZWW91IGNhbiBvbmx5IGRlcG9zaXQgVVNETgQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBVjdXJyZW50QXZhaWxhYmxlRnVuZHMJAQ10cnlHZXRJbnRlZ2VyAQkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAGQCBRVjdXJyZW50QXZhaWxhYmxlRnVuZHMIBQNwbXQGYW1vdW50BQNuaWwAAQFpAQ13aXRoZHJhd0Z1bmRzAAQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBVjdXJyZW50QXZhaWxhYmxlRnVuZHMJAQ10cnlHZXRJbnRlZ2VyAQkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1jYWxsZXJBZGRyU3RyBRVjdXJyZW50QXZhaWxhYmxlRnVuZHMJANkEAQUOZGVwb3NpdEFzc2V0SWQFA25pbAABAWkBDmZpbmlzaERpY2VHYW1lAw1wbGF5ZXJBZGRyZXNzA2JldBByZXN1bHRNdWx0aXBsaWVyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gT25seQQVY3VycmVudEF2YWlsYWJsZUZ1bmRzCQENdHJ5R2V0SW50ZWdlcgEJARhhZGRyZXNzQXZhaWxhYmxlRnVuZHNLZXkBBQ1wbGF5ZXJBZGRyZXNzBAhiZXRDaGVjawMJAGYCBQNiZXQFFWN1cnJlbnRBdmFpbGFibGVGdW5kcwkAAgECLE5vdCBlbm91Z2ggYXZhaWxhYmxlIGZ1bmRzIHRvIGNvdmVyIHRoZSBiZXQhBgMJAAACBQhiZXRDaGVjawUIYmV0Q2hlY2sJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDXBsYXllckFkZHJlc3MJAGQCCQBlAgUVY3VycmVudEF2YWlsYWJsZUZ1bmRzBQNiZXQJAGsDBQNiZXQFEHJlc3VsdE11bHRpcGxpZXIAkE4FA25pbAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGGNhbmNlbFNpZ25VcFRvVG91cm5hbWVudAEMdG91cm5hbWVudElkBBB0b3VybmFtZW50U3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1OCkBCQETdG91cm5hbWVudFN0YXR1c0tleQEFDHRvdXJuYW1lbnRJZAMJAQIhPQIFEHRvdXJuYW1lbnRTdGF0dXMCDHJlZ2lzdHJhdGlvbgkAAgECKFRvdXJuYW1lbnQgaXMgbm90IGluIHJlZ2lzdHJhdGlvbiBwaGFzZSEEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQPcGFpZEJ1eUluQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBCQEiYnV5SW5BbW91bnRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgQQcGFpZEJ1eUluQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTgpAQkBI2J1eUluQXNzZXRJZEZvclRvdXJuYW1lbnRGb3JBY2NvdW50AgUMdG91cm5hbWVudElkBQ1jYWxsZXJBZGRyU3RyBB1hbHJlYWR5UmVnaXN0ZXJlZFBsYXllcnNDb3VudAkBDXRyeUdldEludGVnZXIBCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAQZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQUMdG91cm5hbWVudElkBQ9wYWlkQnV5SW5BbW91bnQECWZlZXNUYWtlbgkAawMFGXRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnQFGXRvdXJuYW1lbnRCdXlJbkZlZVBlcmNlbnQAZAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDWNhbGxlckFkZHJTdHIFD3BhaWRCdXlJbkFtb3VudAkA2QQBBRBwYWlkQnV5SW5Bc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAR10aWNrZXRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgkAzAgCCQELRGVsZXRlRW50cnkBCQEiYnV5SW5BbW91bnRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgkAzAgCCQELRGVsZXRlRW50cnkBCQEjYnV5SW5Bc3NldElkRm9yVG91cm5hbWVudEZvckFjY291bnQCBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIJARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkCQBlAgUdYWxyZWFkeVJlZ2lzdGVyZWRQbGF5ZXJzQ291bnQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQUMdG91cm5hbWVudElkBRl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEvdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRNaW51c0ZlZXNLZXkBBQx0b3VybmFtZW50SWQJAGUCBRl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50BQlmZWVzVGFrZW4FA25pbAABAWkBEnNpZ25VcFRvVG91cm5hbWVudAEMdG91cm5hbWVudElkBA9tYXhQbGF5ZXJzQ291bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARx0b3VybmFtZW50TWF4UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkBB1hbHJlYWR5UmVnaXN0ZXJlZFBsYXllcnNDb3VudAkBDXRyeUdldEludGVnZXIBCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAQQdG91cm5hbWVudFN0YXR1cwkBEUBleHRyTmF0aXZlKDEwNTgpAQkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQDAwkBAiE9AgUQdG91cm5hbWVudFN0YXR1cwIMcmVnaXN0cmF0aW9uCQECIT0CBRB0b3VybmFtZW50U3RhdHVzAgdzdGFydGVkBwkAAgECKFRvdXJuYW1lbnQgaXMgbm90IGluIHJlZ2lzdHJhdGlvbiBwaGFzZSEDCQAAAgUdYWxyZWFkeVJlZ2lzdGVyZWRQbGF5ZXJzQ291bnQFD21heFBsYXllcnNDb3VudAkAAgECNVRvdXJuYW1lbnQgaXMgY3VycmVudGx5IGZ1bGwsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIhBANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiFQbGVhc2UgYXR0YWNoIGV4YWN0bHkgb25lIHBheW1lbnQEDGJ1eUluQXNzZXRpZAQHJG1hdGNoMAgFA3BtdAdhc3NldElkAwkAAQIFByRtYXRjaDACBFVuaXQEAWIFByRtYXRjaDACAAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWIJAAIBAgtNYXRjaCBlcnJvcgQTYnV5SW5SZXF1aXJlZEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBGHRvdXJuYW1lbnRCdXlJbkFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAQUYnV5SW5SZXF1aXJlZEFzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJARl0b3VybmFtZW50QnV5SW5Bc3NldElkS2V5AQUMdG91cm5hbWVudElkAwkBAiE9AgUTYnV5SW5SZXF1aXJlZEFtb3VudAgFA3BtdAZhbW91bnQJAAIBCQCsAgICLEF0dGFjaGVkIHBheW1lbnQgYW1vdW50IGlzIGludmFsaWQsIG11c3QgYmUgCQCkAwEFE2J1eUluUmVxdWlyZWRBbW91bnQDCQECIT0CBRRidXlJblJlcXVpcmVkQXNzZXRJZAUMYnV5SW5Bc3NldGlkCQACAQkArAICAi5BdHRhY2hlZCBwYXltZW50IGFzc2V0IGlkIGlzIGludmFsaWQsIG11c3QgYmUgBRRidXlJblJlcXVpcmVkQXNzZXRJZAQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBCQEmdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRLZXkBBQx0b3VybmFtZW50SWQIBQNwbXQGYW1vdW50BAlmZWVzVGFrZW4JAGsDBRl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50BRl0b3VybmFtZW50QnV5SW5GZWVQZXJjZW50AGQJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBHXRpY2tldEZvclRvdXJuYW1lbnRGb3JBY2NvdW50AgUMdG91cm5hbWVudElkBQ1jYWxsZXJBZGRyU3RyBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBImJ1eUluQW1vdW50Rm9yVG91cm5hbWVudEZvckFjY291bnQCBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIIBQNwbXQGYW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJASNidXlJbkFzc2V0SWRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgUMYnV5SW5Bc3NldGlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAkAZAIFHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50AAEJAMwIAgkBDEludGVnZXJFbnRyeQIJASZ0b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAUZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBL3RvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50TWludXNGZWVzS2V5AQUMdG91cm5hbWVudElkCQBlAgUZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAUJZmVlc1Rha2VuBQNuaWwAAQFpARBjYW5jZWxUb3VybmFtZW50AQx0b3VybmFtZW50SWQEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQRdG91cm5hbWVudENyZWF0b3IJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARR0b3VybmFtZW50Q3JlYXRvcktleQEFDHRvdXJuYW1lbnRJZAQMY3JlYXRvckNoZWNrAwkAAAIFEXRvdXJuYW1lbnRDcmVhdG9yBQ1jYWxsZXJBZGRyU3RyBgMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQACAQImT25seSB0b3VybmFtZW50IGNyZWF0b3IgY2FuIGNhbmNlbCBpdCEDCQAAAgUMY3JlYXRvckNoZWNrBQxjcmVhdG9yQ2hlY2sEEHRvdXJuYW1lbnRTdGF0dXMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkAwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AgUQdG91cm5hbWVudFN0YXR1cwIMcmVnaXN0cmF0aW9uBwkAAgECKFRvdXJuYW1lbnQgaXMgbm90IGluIHJlZ2lzdHJhdGlvbiBwaGFzZSEEHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50CQENdHJ5R2V0SW50ZWdlcgEJARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkAwkAZgIFHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50AAAJAAIBAkVDYW5ub3QgY2FuY2VsIGEgdG91cm5hbWVudCB3aGVuIHBsYXllcnMgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZCB0byBpdCEEFXRvdXJuYW1lbnRQcml6ZUFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBGHRvdXJuYW1lbnRQcml6ZUFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAQWdG91cm5hbWVudFByaXplQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTgpAQkBGXRvdXJuYW1lbnRQcml6ZUFzc2V0SWRLZXkBBQx0b3VybmFtZW50SWQJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQEYdG91cm5hbWVudFByaXplQW1vdW50S2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARx0b3VybmFtZW50TWF4UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARl0b3VybmFtZW50UHJpemVBc3NldElkS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARt0b3VybmFtZW50UHJpemVBc3NldE5hbWVLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBH3RvdXJuYW1lbnRQcml6ZUFzc2V0RGVjaW1hbHNLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGHRvdXJuYW1lbnRCdXlJbkFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEbdG91cm5hbWVudEJ1eUluQXNzZXROYW1lS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAR90b3VybmFtZW50QnV5SW5Bc3NldERlY2ltYWxzS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARl0b3VybmFtZW50QnV5SW5Bc3NldElkS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARF0b3VybmFtZW50TmFtZUtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEUdG91cm5hbWVudENyZWF0b3JLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQURdG91cm5hbWVudENyZWF0b3IFFXRvdXJuYW1lbnRQcml6ZUFtb3VudAkA2QQBBRZ0b3VybmFtZW50UHJpemVBc3NldElkBQNuaWwAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjcmVhdGVUb3VybmFtZW50BQx0b3VybmFtZW50SWQEbmFtZQxwbGF5ZXJzQ291bnQLYnV5SW5BbW91bnQMYnV5SW5Bc3NldElkBANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwMJAAACBQ1jYWxsZXJBZGRyU3RyBR9hbGxvd2VkU3BlY2lhbFRvdXJuYW1lbnRDcmVhdG9yCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAAACQACAQIhUGxlYXNlIGF0dGFjaCBleGFjdGx5IG9uZSBwYXltZW50BBF0b3VybmFtZW50Q3JlYXRvcgQHJG1hdGNoMAkAoggBCQEUdG91cm5hbWVudENyZWF0b3JLZXkBBQx0b3VybmFtZW50SWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAdjcmVhdG9yBQckbWF0Y2gwCQACAQkArAICAidUb3VybmFtZW50IGFscmVhZHkgZXhpc3RzIHdpdGggdGhpcyBpZCAFDHRvdXJuYW1lbnRJZAUEdW5pdAMJAAACBRF0b3VybmFtZW50Q3JlYXRvcgURdG91cm5hbWVudENyZWF0b3IEDHByaXplQXNzZXRJZAQHJG1hdGNoMAgFA3BtdAdhc3NldElkAwkAAQIFByRtYXRjaDACBFVuaXQEAWIFByRtYXRjaDACAAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWIJAAIBAgtNYXRjaCBlcnJvcgQMYXNzZXREZXRhaWxzBAckbWF0Y2gwCAUDcG10B2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIEVW5pdAQBYgUHJG1hdGNoMAkAzAgCAgVXYXZlcwkAzAgCAAgFA25pbAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwBAckbWF0Y2gxCQDsBwEFAWIDCQABAgUHJG1hdGNoMQIFQXNzZXQEBWFzc2V0BQckbWF0Y2gxCQDMCAIIBQVhc3NldARuYW1lCQDMCAIIBQVhc3NldAhkZWNpbWFscwUDbmlsCQACAQIQQ2FuJ3QgZmluZCBhc3NldAkAAgECC01hdGNoIGVycm9yBApidXlJbkFzc2V0BAckbWF0Y2gwCQDsBwEJANkEAQUMYnV5SW5Bc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAkAzAgCCAUFYXNzZXQEbmFtZQkAzAgCCAUFYXNzZXQIZGVjaW1hbHMFA25pbAkAzAgCAgAJAMwIAgAABQNuaWwEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYdG91cm5hbWVudFByaXplQW1vdW50S2V5AQUMdG91cm5hbWVudElkCAUDcG10BmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGXRvdXJuYW1lbnRQbGF5ZXJzQ291bnRLZXkBBQx0b3VybmFtZW50SWQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHHRvdXJuYW1lbnRNYXhQbGF5ZXJzQ291bnRLZXkBBQx0b3VybmFtZW50SWQFDHBsYXllcnNDb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEZdG91cm5hbWVudFByaXplQXNzZXRJZEtleQEFDHRvdXJuYW1lbnRJZAUMcHJpemVBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARt0b3VybmFtZW50UHJpemVBc3NldE5hbWVLZXkBBQx0b3VybmFtZW50SWQKAAFACQCRAwIFDGFzc2V0RGV0YWlscwAAAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBH3RvdXJuYW1lbnRQcml6ZUFzc2V0RGVjaW1hbHNLZXkBBQx0b3VybmFtZW50SWQKAAFACQCRAwIFDGFzc2V0RGV0YWlscwABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAzAgCCQELU3RyaW5nRW50cnkCCQETdG91cm5hbWVudFN0YXR1c0tleQEFDHRvdXJuYW1lbnRJZAIMcmVnaXN0cmF0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYdG91cm5hbWVudEJ1eUluQW1vdW50S2V5AQUMdG91cm5hbWVudElkBQtidXlJbkFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEbdG91cm5hbWVudEJ1eUluQXNzZXROYW1lS2V5AQUMdG91cm5hbWVudElkCgABQAkAkQMCBQpidXlJbkFzc2V0AAADCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEfdG91cm5hbWVudEJ1eUluQXNzZXREZWNpbWFsc0tleQEFDHRvdXJuYW1lbnRJZAoAAUAJAJEDAgUKYnV5SW5Bc3NldAABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAzAgCCQELU3RyaW5nRW50cnkCCQEZdG91cm5hbWVudEJ1eUluQXNzZXRJZEtleQEFDHRvdXJuYW1lbnRJZAUMYnV5SW5Bc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARF0b3VybmFtZW50TmFtZUtleQEFDHRvdXJuYW1lbnRJZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEUdG91cm5hbWVudENyZWF0b3JLZXkBBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIFA25pbAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD3N0YXJ0VG91cm5hbWVudAEMdG91cm5hbWVudElkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gT25seQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkAgdzdGFydGVkBQNuaWwAAQFpARBmaW5pc2hUb3VybmFtZW50Agx0b3VybmFtZW50SWQdd2lubmluZ1RyYW5zZmVydFRyYW5zYWN0aW9uSWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgpBZG1pbiBPbmx5BBF0b3VybmFtZW50Q3JlYXRvcgkBEUBleHRyTmF0aXZlKDEwNTgpAQkBFHRvdXJuYW1lbnRDcmVhdG9yS2V5AQUMdG91cm5hbWVudElkBBp0b3VybmFtZW50VG90YWxCdXlJbkFtb3VudAkBDXRyeUdldEludGVnZXIBCQEmdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRLZXkBBQx0b3VybmFtZW50SWQEFXRvdXJuYW1lbnRCdXlJbkFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBGHRvdXJuYW1lbnRCdXlJbkFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAQWdG91cm5hbWVudEJ1eUluQXNzZXRJZAQHJG1hdGNoMAkAoggBCQEZdG91cm5hbWVudEJ1eUluQXNzZXRJZEtleQEFDHRvdXJuYW1lbnRJZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmlkBQckbWF0Y2gwAwkAAAIFAmlkAgAFBHVuaXQJANkEAQUCaWQFBHVuaXQEEnRvdXJuYW1lbnRCdXlJbkZlZQkAawMFGnRvdXJuYW1lbnRUb3RhbEJ1eUluQW1vdW50BRl0b3VybmFtZW50QnV5SW5GZWVQZXJjZW50AGQEFXRvdXJuYW1lbnRQcml6ZUFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBGHRvdXJuYW1lbnRQcml6ZUFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAMJAGYCBRV0b3VybmFtZW50UHJpemVBbW91bnQAAAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJASF0b3VybmFtZW50V2lubmluZ1RyYW5zYWN0aW9uSWRLZXkBBQx0b3VybmFtZW50SWQFHXdpbm5pbmdUcmFuc2ZlcnRUcmFuc2FjdGlvbklkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkAghmaW5pc2hlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHnRvdXJuYW1lbnRCdXlJbkZlZUNvbGxlY3RlZEtleQEFDHRvdXJuYW1lbnRJZAUSdG91cm5hbWVudEJ1eUluRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEXRvdXJuYW1lbnRDcmVhdG9yCQBlAgUadG91cm5hbWVudFRvdGFsQnV5SW5BbW91bnQFEnRvdXJuYW1lbnRCdXlJbkZlZQUWdG91cm5hbWVudEJ1eUluQXNzZXRJZAUDbmlsAAEECnNlcnZpY2VGZWUJAGsDBRJ0b3VybmFtZW50QnV5SW5GZWUAFABkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBIXRvdXJuYW1lbnRXaW5uaW5nVHJhbnNhY3Rpb25JZEtleQEFDHRvdXJuYW1lbnRJZAUdd2lubmluZ1RyYW5zZmVydFRyYW5zYWN0aW9uSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQCCGZpbmlzaGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEedG91cm5hbWVudEJ1eUluRmVlQ29sbGVjdGVkS2V5AQUMdG91cm5hbWVudElkBRJ0b3VybmFtZW50QnV5SW5GZWUJAMwIAgkBDEludGVnZXJFbnRyeQIJASB0b3VybmFtZW50U2VydmljZUZlZUNvbGxlY3RlZEtleQEFDHRvdXJuYW1lbnRJZAUKc2VydmljZUZlZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBRF0b3VybmFtZW50Q3JlYXRvcgkAZQIFEnRvdXJuYW1lbnRCdXlJbkZlZQUKc2VydmljZUZlZQUWdG91cm5hbWVudEJ1eUluQXNzZXRJZAUDbmlsAAEBaQEOcGxheWVyRXhpdEdhbWUDBmdhbWVJZApwbGF5ZXJBZGRyD2V4aXRTdGFja0Ftb3VudAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCkFkbWluIE9ubHkEF2N1cnJlbnRUb3RhbExvY2tlZEZ1bmRzCQENdHJ5R2V0SW50ZWdlcgEJARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEFCnBsYXllckFkZHIEIGN1cnJlbnRHYW1lTG9ja2VkQW1vdW50Rm9yUGxheWVyCQENdHJ5R2V0SW50ZWdlcgEJARxhZGRyZXNzTG9ja2VkRnVuZHNGb3JHYW1lS2V5AgUKcGxheWVyQWRkcgUGZ2FtZUlkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEFCnBsYXllckFkZHIJAGUCBRdjdXJyZW50VG90YWxMb2NrZWRGdW5kcwUgY3VycmVudEdhbWVMb2NrZWRBbW91bnRGb3JQbGF5ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARxhZGRyZXNzTG9ja2VkRnVuZHNGb3JHYW1lS2V5AgUKcGxheWVyQWRkcgUGZ2FtZUlkAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUKcGxheWVyQWRkcgUPZXhpdFN0YWNrQW1vdW50CQDZBAEFDmRlcG9zaXRBc3NldElkBQNuaWwAAQFpARBsb2NrRnVuZHNGb3JHYW1lAQZnYW1lSWQEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECIVBsZWFzZSBhdHRhY2ggZXhhY3RseSBvbmUgcGF5bWVudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAkA2QQBBQ5kZXBvc2l0QXNzZXRJZAkAAgECGVlvdSBjYW4gb25seSBkZXBvc2l0IFVTRE4EDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQXY3VycmVudFRvdGFsTG9ja2VkRnVuZHMJAQ10cnlHZXRJbnRlZ2VyAQkBGmFkZHJlc3NUb3RhbExvY2tlZEZ1bmRzS2V5AQUNY2FsbGVyQWRkclN0cgQeY3VycmVudExvY2tlZEZ1bmRzVG90YWxIaXN0b3J5CQENdHJ5R2V0SW50ZWdlcgEJASFhZGRyZXNzTG9ja2VkRnVuZHNUb3RhbEhpc3RvcnlLZXkBBQ1jYWxsZXJBZGRyU3RyCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAGQCBRdjdXJyZW50VG90YWxMb2NrZWRGdW5kcwgFA3BtdAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJASFhZGRyZXNzTG9ja2VkRnVuZHNUb3RhbEhpc3RvcnlLZXkBBQ1jYWxsZXJBZGRyU3RyCQBkAgUeY3VycmVudExvY2tlZEZ1bmRzVG90YWxIaXN0b3J5CAUDcG10BmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHGFkZHJlc3NMb2NrZWRGdW5kc0ZvckdhbWVLZXkCBQ1jYWxsZXJBZGRyU3RyBQZnYW1lSWQIBQNwbXQGYW1vdW50BQNuaWwAAQFpARNiZXRPblZpZGVvUG9rZXJHYW1lAQZnYW1lSWQEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECIVBsZWFzZSBhdHRhY2ggZXhhY3RseSBvbmUgcGF5bWVudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAkA2QQBBQ5kZXBvc2l0QXNzZXRJZAkAAgECGVlvdSBjYW4gb25seSBkZXBvc2l0IFVTRE4EDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXdmlkZW9Qb2tlckJldEZvckFjY291bnQCBQZnYW1lSWQFDWNhbGxlckFkZHJTdHIIBQNwbXQGYW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARp2aWRlb1Bva2VyUGxheWVyQWRkcmVzc0tleQEFBmdhbWVJZAUNY2FsbGVyQWRkclN0cgkAzAgCCQELU3RyaW5nRW50cnkCCQETdmlkZW9Qb2tlclN0YXR1c0tleQEFBmdhbWVJZAIHY3JlYXRlZAUDbmlsAAEBaQEUZmluaXNoVmlkZW9Qb2tlckdhbWUDBmdhbWVJZAZyZXN1bHQKY2FyZHNEcmF3bgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCkFkbWluIE9ubHkECnBsYXllckFkZHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARp2aWRlb1Bva2VyUGxheWVyQWRkcmVzc0tleQEFBmdhbWVJZAQJYmV0QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBCQEXdmlkZW9Qb2tlckJldEZvckFjY291bnQCBQZnYW1lSWQFCnBsYXllckFkZHIEEWN1cnJlbnRHYW1lU3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1OCkBCQETdmlkZW9Qb2tlclN0YXR1c0tleQEFBmdhbWVJZAQLY2hlY2tTdGF0dXMDCQAAAgURY3VycmVudEdhbWVTdGF0dXMCB2NyZWF0ZWQGCQACAQIiR2FtZSBpcyBub3QgaW4gdGhlIGNvcnJlY3Qgc3RhdHVzIQMJAAACBQtjaGVja1N0YXR1cwULY2hlY2tTdGF0dXMEDWJldE11bHRpcGxpZXIDCQAAAgUGcmVzdWx0AglQYWlyLCBKJ3MAAQMJAAACBQZyZXN1bHQCCVBhaXIsIFEncwABAwkAAAIFBnJlc3VsdAIJUGFpciwgSydzAAEDCQAAAgUGcmVzdWx0AglQYWlyLCBBJ3MAAQMJAAACBQZyZXN1bHQCCFR3byBQYWlyAAIDCQAAAgUGcmVzdWx0Ag9UaHJlZSBvZiBhIEtpbmQAAwMJAAACBQZyZXN1bHQCCFN0cmFpZ2h0AAQDCQAAAgUGcmVzdWx0AgVGbHVzaAAGAwkAAAIFBnJlc3VsdAIKRnVsbCBIb3VzZQAJAwkAAAIFBnJlc3VsdAIORm91ciBvZiBhIEtpbmQAGQMJAAACBQZyZXN1bHQCDlN0cmFpZ2h0IEZsdXNoADIDCQAAAgUGcmVzdWx0AgtSb3lhbCBGbHVzaACgBgAAAwkAAAIFDWJldE11bHRpcGxpZXIFDWJldE11bHRpcGxpZXIECWFtb3VudFdvbgkAaAIFCWJldEFtb3VudAUNYmV0TXVsdGlwbGllcgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJARd2aWRlb1Bva2VyQ2FyZHNEcmF3bktleQEFBmdhbWVJZAUKY2FyZHNEcmF3bgkAzAgCCQELU3RyaW5nRW50cnkCCQETdmlkZW9Qb2tlclJlc3VsdEtleQEFBmdhbWVJZAUGcmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZdmlkZW9Qb2tlclJlc3VsdFByb2ZpdEtleQEFBmdhbWVJZAUJYW1vdW50V29uCQDMCAIJAQtTdHJpbmdFbnRyeQIJARN2aWRlb1Bva2VyU3RhdHVzS2V5AQUGZ2FtZUlkAghmaW5pc2hlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQpwbGF5ZXJBZGRyBQlhbW91bnRXb24JANkEAQUOZGVwb3NpdEFzc2V0SWQFA25pbAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tlefH1ZS8=", "height": 2801695, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let waves = 100000000
5+
6+let ticketPriceInt = 1000000
7+
8+let ticketPrice = ticketPriceInt
9+
10+let invFee = 500000
11+
12+let withdrawFeePercent = 5
13+
14+let feeCollectorAddressKey = "feeCollectorAddress"
15+
16+let tournamentBuyInFeePercent = 10
17+
18+let depositAssetId = "5ue1fiuV6j6UBr6Xf28Qms6y5FqzKtqvaxxhwu7hTQ58"
19+
20+let allowedSpecialTournamentCreator = "3N9dHL3sG1tcc2EDc4hsbrPQT1YvLovSuno"
21+
22+func tryGetInteger (key) = match getInteger(this, key) {
23+ case b: Int =>
24+ b
25+ case _ =>
26+ 0
27+}
28+
29+
30+func getTicketsCountKey (addressString) = (addressString + "_ticketsCount")
31+
32+
33+func buyInAmountForTournamentForAccount (tournamentId,account) = ((tournamentId + "_buyInAmountForAccount_") + account)
34+
35+
36+func buyInAssetIdForTournamentForAccount (tournamentId,account) = ((tournamentId + "_buyInAssetIdForAccount_") + account)
37+
38+
39+func ticketForTournamentForAccount (tournamentId,account) = ((tournamentId + "_ticketForAccount_") + account)
40+
41+
42+func tournamentTotalBuyInCollectedAmountKey (tournamentId) = (tournamentId + "_tournamentTotalBuyInCollectedAmount")
43+
44+
45+func tournamentTotalBuyInCollectedAmountMinusFeesKey (tournamentId) = (tournamentId + "_tournamentTotalBuyInCollectedAmountMinusFees")
46+
47+
48+func tournamentCreatorKey (tournamentId) = (tournamentId + "_tournamentCreator")
49+
50+
51+func tournamentNameKey (tournamentId) = (tournamentId + "_tournamentName")
52+
53+
54+func tournamentPrizeAmountKey (tournamentId) = (tournamentId + "_tournamentPrizeAmount")
55+
56+
57+func tournamentMaxPlayersCountKey (tournamentId) = (tournamentId + "_tournamentMaxPlayersCount")
58+
59+
60+func tournamentPlayersCountKey (tournamentId) = (tournamentId + "_tournamentPlayersCount")
61+
62+
63+func tournamentPrizeAssetIdKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetId")
64+
65+
66+func tournamentPrizeAssetNameKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetName")
67+
68+
69+func tournamentBuyInAmountKey (tournamentId) = (tournamentId + "_tournamentBuyInAmount")
70+
71+
72+func tournamentBuyInAssetIdKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetId")
73+
74+
75+func tournamentBuyInAssetNameKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetName")
76+
77+
78+func tournamentBuyInAssetDecimalsKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetDecimals")
79+
80+
81+func tournamentPrizeAssetDecimalsKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetDecimals")
82+
83+
84+func tournamentStatusKey (tournamentId) = (tournamentId + "_tournamentStatus")
85+
86+
87+func tournamentBuyInFeeCollectedKey (tournamentId) = (tournamentId + "_tournamentBuyInFeeCollected")
88+
89+
90+func tournamentServiceFeeCollectedKey (tournamentId) = (tournamentId + "_tournamentServiceFeeCollected")
91+
92+
93+func tournamentWinningTransactionIdKey (tournamentId) = (tournamentId + "_tournamentWinningTransactionId")
94+
95+
96+func gameWinnerKey (gameId) = (gameId + "_winner")
97+
98+
99+func addressAvailableFundsKey (address) = (address + "_availableFunds")
100+
101+
102+func addressTotalLockedFundsKey (address) = (address + "_totalLockedFunds")
103+
104+
105+func addressLockedFundsTotalHistoryKey (address) = (address + "_lockedFundsTotalHistory")
106+
107+
108+func addressLockedFundsForGameKey (address,gameId) = ((address + "_lockedFunds_") + gameId)
109+
110+
111+func addressAvailableRewardsKey (address) = (address + "_availableRewards")
112+
113+
114+func videoPokerBetForAccount (gameId,account) = ((gameId + "_videoPokerBetFor_") + account)
115+
116+
117+func videoPokerCardsDrawnKey (gameId) = (gameId + "_videoPokerCardsDrawn")
118+
119+
120+func videoPokerResultKey (gameId) = (gameId + "_videoPokerResult")
121+
122+
123+func videoPokerResultProfitKey (gameId) = (gameId + "_videoPokerResultProfit")
124+
125+
126+func videoPokerStatusKey (gameId) = (gameId + "_videoPokerStatus")
127+
128+
129+func videoPokerPlayerAddressKey (gameId) = (gameId + "_videoPokerPlayerAddress")
130+
131+
132+func topUpAddressFundsKey (playerAddr) = (playerAddr + "_topUpFunds")
133+
134+
135+func getTicketsCount (addressString) = tryGetInteger(getTicketsCountKey(addressString))
136+
137+
138+func consumeTicket (playerAddr) = {
139+ let currentTicketCount = getTicketsCount(playerAddr)
140+ let newCurrentTicketCount = (currentTicketCount - 1)
141+ if ((0 > newCurrentTicketCount))
142+ then 0
143+ else newCurrentTicketCount
144+ }
145+
146+
147+@Callable(i)
148+func setFeeCollectorAddress (collectorAddr) = if ((i.caller != this))
149+ then throw("Admin Only")
150+ 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+ }
166+
167+
168+
169+@Callable(i)
170+func depositFunds () = {
171+ let pmt = if ((size(i.payments) == 1))
172+ then i.payments[0]
173+ else throw("Please attach exactly one payment")
174+ if ((pmt.assetId != fromBase58String(depositAssetId)))
175+ then throw("You can only deposit USDN")
176+ else {
177+ let callerAddrStr = toBase58String(i.caller.bytes)
178+ let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(callerAddrStr))
179+ $Tuple2([IntegerEntry(addressAvailableFundsKey(callerAddrStr), (currentAvailableFunds + pmt.amount))], 1)
180+ }
181+ }
182+
183+
184+
185+@Callable(i)
186+func withdrawFunds () = {
187+ let callerAddrStr = toBase58String(i.caller.bytes)
188+ let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(callerAddrStr))
189+ $Tuple2([IntegerEntry(addressAvailableFundsKey(callerAddrStr), 0), ScriptTransfer(addressFromStringValue(callerAddrStr), currentAvailableFunds, fromBase58String(depositAssetId))], 1)
190+ }
191+
192+
193+
194+@Callable(i)
195+func finishDiceGame (playerAddress,bet,resultMultiplier) = if ((i.caller != this))
196+ then throw("Admin Only")
197+ else {
198+ let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(playerAddress))
199+ let betCheck = if ((bet > currentAvailableFunds))
200+ then throw("Not enough available funds to cover the bet!")
201+ else true
202+ if ((betCheck == betCheck))
203+ then $Tuple2([IntegerEntry(addressAvailableFundsKey(playerAddress), ((currentAvailableFunds - bet) + fraction(bet, resultMultiplier, 10000)))], 1)
204+ else throw("Strict value is not equal to itself.")
205+ }
206+
207+
208+
209+@Callable(i)
210+func cancelSignUpToTournament (tournamentId) = {
211+ let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
212+ if ((tournamentStatus != "registration"))
213+ then throw("Tournament is not in registration phase!")
214+ else {
215+ let callerAddrStr = toBase58String(i.caller.bytes)
216+ let paidBuyInAmount = getIntegerValue(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr))
217+ let paidBuyInAssetId = getStringValue(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr))
218+ let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
219+ let totalBuyInCollectedAmount = (tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId)) - paidBuyInAmount)
220+ let feesTaken = fraction(totalBuyInCollectedAmount, tournamentBuyInFeePercent, 100)
221+ $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)
222+ }
223+ }
224+
225+
226+
227+@Callable(i)
228+func signUpToTournament (tournamentId) = {
229+ let maxPlayersCount = getIntegerValue(this, tournamentMaxPlayersCountKey(tournamentId))
230+ let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
231+ let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
232+ if (if ((tournamentStatus != "registration"))
233+ then (tournamentStatus != "started")
234+ else false)
235+ then throw("Tournament is not in registration phase!")
236+ else if ((alreadyRegisteredPlayersCount == maxPlayersCount))
237+ then throw("Tournament is currently full, please try again later!")
238+ else {
239+ let pmt = if ((size(i.payments) == 1))
240+ then i.payments[0]
241+ else throw("Please attach exactly one payment")
242+ let buyInAssetid = match pmt.assetId {
243+ case b: Unit =>
244+ ""
245+ case b: ByteVector =>
246+ toBase58String(b)
247+ case _ =>
248+ throw("Match error")
249+ }
250+ let buyInRequiredAmount = getIntegerValue(this, tournamentBuyInAmountKey(tournamentId))
251+ let buyInRequiredAssetId = getStringValue(this, tournamentBuyInAssetIdKey(tournamentId))
252+ if ((buyInRequiredAmount != pmt.amount))
253+ then throw(("Attached payment amount is invalid, must be " + toString(buyInRequiredAmount)))
254+ else if ((buyInRequiredAssetId != buyInAssetid))
255+ then throw(("Attached payment asset id is invalid, must be " + buyInRequiredAssetId))
256+ else {
257+ let callerAddrStr = toBase58String(i.caller.bytes)
258+ let totalBuyInCollectedAmount = (tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId)) + pmt.amount)
259+ let feesTaken = fraction(totalBuyInCollectedAmount, tournamentBuyInFeePercent, 100)
260+ $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)
261+ }
262+ }
263+ }
264+
265+
266+
267+@Callable(i)
268+func cancelTournament (tournamentId) = {
269+ let callerAddrStr = toBase58String(i.caller.bytes)
270+ let tournamentCreator = getStringValue(tournamentCreatorKey(tournamentId))
271+ let creatorCheck = if ((tournamentCreator == callerAddrStr))
272+ then true
273+ else if ((i.caller == this))
274+ then true
275+ else throw("Only tournament creator can cancel it!")
276+ if ((creatorCheck == creatorCheck))
277+ then {
278+ let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
279+ if (if ((i.caller != this))
280+ then (tournamentStatus != "registration")
281+ else false)
282+ then throw("Tournament is not in registration phase!")
283+ else {
284+ let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
285+ if ((alreadyRegisteredPlayersCount > 0))
286+ then throw("Cannot cancel a tournament when players are already registered to it!")
287+ else {
288+ let tournamentPrizeAmount = getIntegerValue(tournamentPrizeAmountKey(tournamentId))
289+ let tournamentPrizeAssetId = getStringValue(tournamentPrizeAssetIdKey(tournamentId))
290+ $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)
291+ }
292+ }
293+ }
294+ else throw("Strict value is not equal to itself.")
295+ }
296+
297+
298+
299+@Callable(i)
300+func createTournament (tournamentId,name,playersCount,buyInAmount,buyInAssetId) = {
301+ let pmt = if ((size(i.payments) == 1))
302+ then i.payments[0]
303+ else {
304+ let callerAddrStr = toBase58String(i.caller.bytes)
305+ if ((callerAddrStr == allowedSpecialTournamentCreator))
306+ then AttachedPayment(unit, 0)
307+ else throw("Please attach exactly one payment")
308+ }
309+ let tournamentCreator = match getString(tournamentCreatorKey(tournamentId)) {
310+ case creator: String =>
311+ throw(("Tournament already exists with this id " + tournamentId))
312+ case _ =>
313+ unit
314+ }
315+ if ((tournamentCreator == tournamentCreator))
316+ then {
317+ let prizeAssetId = match pmt.assetId {
318+ case b: Unit =>
319+ ""
320+ case b: ByteVector =>
321+ toBase58String(b)
322+ case _ =>
323+ throw("Match error")
324+ }
325+ let assetDetails = match pmt.assetId {
326+ case b: Unit =>
327+["Waves", 8]
328+ case b: ByteVector =>
329+ match assetInfo(b) {
330+ case asset: Asset =>
331+[asset.name, asset.decimals]
332+ case _ =>
333+ throw("Can't find asset")
334+ }
335+ case _ =>
336+ throw("Match error")
337+ }
338+ let buyInAsset = match assetInfo(fromBase58String(buyInAssetId)) {
339+ case asset: Asset =>
340+[asset.name, asset.decimals]
341+ case _ =>
342+["", 0]
343+ }
344+ let callerAddrStr = toBase58String(i.caller.bytes)
345+ $Tuple2([IntegerEntry(tournamentPrizeAmountKey(tournamentId), pmt.amount), IntegerEntry(tournamentPlayersCountKey(tournamentId), 0), IntegerEntry(tournamentMaxPlayersCountKey(tournamentId), playersCount), StringEntry(tournamentPrizeAssetIdKey(tournamentId), prizeAssetId), StringEntry(tournamentPrizeAssetNameKey(tournamentId), {
346+ let @ = assetDetails[0]
347+ if ($isInstanceOf(@, "String"))
348+ then @
349+ else throw(($getType(@) + " couldn't be cast to String"))
350+ }), IntegerEntry(tournamentPrizeAssetDecimalsKey(tournamentId), {
351+ let @ = assetDetails[1]
352+ if ($isInstanceOf(@, "Int"))
353+ then @
354+ else throw(($getType(@) + " couldn't be cast to Int"))
355+ }), StringEntry(tournamentStatusKey(tournamentId), "registration"), IntegerEntry(tournamentBuyInAmountKey(tournamentId), buyInAmount), StringEntry(tournamentBuyInAssetNameKey(tournamentId), {
356+ let @ = buyInAsset[0]
357+ if ($isInstanceOf(@, "String"))
358+ then @
359+ else throw(($getType(@) + " couldn't be cast to String"))
360+ }), IntegerEntry(tournamentBuyInAssetDecimalsKey(tournamentId), {
361+ let @ = buyInAsset[1]
362+ if ($isInstanceOf(@, "Int"))
363+ then @
364+ else throw(($getType(@) + " couldn't be cast to Int"))
365+ }), StringEntry(tournamentBuyInAssetIdKey(tournamentId), buyInAssetId), StringEntry(tournamentNameKey(tournamentId), name), StringEntry(tournamentCreatorKey(tournamentId), callerAddrStr)], 1)
366+ }
367+ else throw("Strict value is not equal to itself.")
368+ }
369+
370+
371+
372+@Callable(i)
373+func startTournament (tournamentId) = if ((i.caller != this))
374+ then throw("Admin Only")
375+ else $Tuple2([StringEntry(tournamentStatusKey(tournamentId), "started")], 1)
376+
377+
378+
379+@Callable(i)
380+func finishTournament (tournamentId,winningTransfertTransactionId) = if ((i.caller != this))
381+ then throw("Admin Only")
382+ else {
383+ let tournamentCreator = getStringValue(tournamentCreatorKey(tournamentId))
384+ let tournamentTotalBuyInAmount = tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId))
385+ let tournamentBuyInAmount = getIntegerValue(tournamentBuyInAmountKey(tournamentId))
386+ let tournamentBuyInAssetId = match getString(tournamentBuyInAssetIdKey(tournamentId)) {
387+ case id: String =>
388+ if ((id == ""))
389+ then unit
390+ else fromBase58String(id)
391+ case _ =>
392+ unit
393+ }
394+ let tournamentBuyInFee = fraction(tournamentTotalBuyInAmount, tournamentBuyInFeePercent, 100)
395+ let tournamentPrizeAmount = getIntegerValue(tournamentPrizeAmountKey(tournamentId))
396+ if ((tournamentPrizeAmount > 0))
397+ then $Tuple2([StringEntry(tournamentWinningTransactionIdKey(tournamentId), winningTransfertTransactionId), StringEntry(tournamentStatusKey(tournamentId), "finished"), IntegerEntry(tournamentBuyInFeeCollectedKey(tournamentId), tournamentBuyInFee), ScriptTransfer(addressFromStringValue(tournamentCreator), (tournamentTotalBuyInAmount - tournamentBuyInFee), tournamentBuyInAssetId)], 1)
398+ else {
399+ let serviceFee = fraction(tournamentBuyInFee, 20, 100)
400+ $Tuple2([StringEntry(tournamentWinningTransactionIdKey(tournamentId), winningTransfertTransactionId), StringEntry(tournamentStatusKey(tournamentId), "finished"), IntegerEntry(tournamentBuyInFeeCollectedKey(tournamentId), tournamentBuyInFee), IntegerEntry(tournamentServiceFeeCollectedKey(tournamentId), serviceFee), ScriptTransfer(addressFromStringValue(tournamentCreator), (tournamentBuyInFee - serviceFee), tournamentBuyInAssetId)], 1)
401+ }
402+ }
403+
404+
405+
406+@Callable(i)
407+func playerExitGame (gameId,playerAddr,exitStackAmount) = if ((i.caller != this))
408+ then throw("Admin Only")
409+ else {
410+ let currentTotalLockedFunds = tryGetInteger(addressTotalLockedFundsKey(playerAddr))
411+ let currentGameLockedAmountForPlayer = tryGetInteger(addressLockedFundsForGameKey(playerAddr, gameId))
412+ $Tuple2([IntegerEntry(addressTotalLockedFundsKey(playerAddr), (currentTotalLockedFunds - currentGameLockedAmountForPlayer)), IntegerEntry(addressLockedFundsForGameKey(playerAddr, gameId), 0), ScriptTransfer(addressFromStringValue(playerAddr), exitStackAmount, fromBase58String(depositAssetId))], 1)
413+ }
414+
415+
416+
417+@Callable(i)
418+func lockFundsForGame (gameId) = {
419+ let pmt = if ((size(i.payments) == 1))
420+ then i.payments[0]
421+ else throw("Please attach exactly one payment")
422+ if ((pmt.assetId != fromBase58String(depositAssetId)))
423+ then throw("You can only deposit USDN")
424+ else {
425+ let callerAddrStr = toBase58String(i.caller.bytes)
426+ let currentTotalLockedFunds = tryGetInteger(addressTotalLockedFundsKey(callerAddrStr))
427+ let currentLockedFundsTotalHistory = tryGetInteger(addressLockedFundsTotalHistoryKey(callerAddrStr))
428+ $Tuple2([IntegerEntry(addressTotalLockedFundsKey(callerAddrStr), (currentTotalLockedFunds + pmt.amount)), IntegerEntry(addressLockedFundsTotalHistoryKey(callerAddrStr), (currentLockedFundsTotalHistory + pmt.amount)), IntegerEntry(addressLockedFundsForGameKey(callerAddrStr, gameId), pmt.amount)], 1)
429+ }
430+ }
431+
432+
433+
434+@Callable(i)
435+func betOnVideoPokerGame (gameId) = {
436+ let pmt = if ((size(i.payments) == 1))
437+ then i.payments[0]
438+ else throw("Please attach exactly one payment")
439+ if ((pmt.assetId != fromBase58String(depositAssetId)))
440+ then throw("You can only deposit USDN")
441+ else {
442+ let callerAddrStr = toBase58String(i.caller.bytes)
443+ $Tuple2([IntegerEntry(videoPokerBetForAccount(gameId, callerAddrStr), pmt.amount), StringEntry(videoPokerPlayerAddressKey(gameId), callerAddrStr), StringEntry(videoPokerStatusKey(gameId), "created")], 1)
444+ }
445+ }
446+
447+
448+
449+@Callable(i)
450+func finishVideoPokerGame (gameId,result,cardsDrawn) = if ((i.caller != this))
451+ then throw("Admin Only")
452+ else {
453+ let playerAddr = getStringValue(videoPokerPlayerAddressKey(gameId))
454+ let betAmount = getIntegerValue(videoPokerBetForAccount(gameId, playerAddr))
455+ let currentGameStatus = getStringValue(videoPokerStatusKey(gameId))
456+ let checkStatus = if ((currentGameStatus == "created"))
457+ then true
458+ else throw("Game is not in the correct status!")
459+ if ((checkStatus == checkStatus))
460+ then {
461+ let betMultiplier = if ((result == "Pair, J's"))
462+ then 1
463+ else if ((result == "Pair, Q's"))
464+ then 1
465+ else if ((result == "Pair, K's"))
466+ then 1
467+ else if ((result == "Pair, A's"))
468+ then 1
469+ else if ((result == "Two Pair"))
470+ then 2
471+ else if ((result == "Three of a Kind"))
472+ then 3
473+ else if ((result == "Straight"))
474+ then 4
475+ else if ((result == "Flush"))
476+ then 6
477+ else if ((result == "Full House"))
478+ then 9
479+ else if ((result == "Four of a Kind"))
480+ then 25
481+ else if ((result == "Straight Flush"))
482+ then 50
483+ else if ((result == "Royal Flush"))
484+ then 800
485+ else 0
486+ if ((betMultiplier == betMultiplier))
487+ then {
488+ let amountWon = (betAmount * betMultiplier)
489+ $Tuple2([StringEntry(videoPokerCardsDrawnKey(gameId), cardsDrawn), StringEntry(videoPokerResultKey(gameId), result), IntegerEntry(videoPokerResultProfitKey(gameId), amountWon), StringEntry(videoPokerStatusKey(gameId), "finished"), ScriptTransfer(addressFromStringValue(playerAddr), amountWon, fromBase58String(depositAssetId))], 1)
490+ }
491+ else throw("Strict value is not equal to itself.")
492+ }
493+ else throw("Strict value is not equal to itself.")
494+ }
495+
496+
497+@Verifier(tx)
498+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
499+

github/deemru/w8io/3ef1775 
43.91 ms