{"_id":"@1upmonster/duel","_rev":"12-a6f607e4f880b6598f003b2738c2f307","name":"@1upmonster/duel","dist-tags":{"latest":"0.2.3"},"versions":{"0.1.0":{"name":"@1upmonster/duel","version":"0.1.0","_id":"@1upmonster/duel@0.1.0","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"623cb60c1c84128ba747b2ec6b7140112bb12879","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.1.0.tgz","fileCount":3458,"integrity":"sha512-X1MwBJWa0r0ttbUvoTmv2S5U3Su4LzxIJwMjq9H4MrHwjQc5ftNxoOG/yICCZObuQ6pZ6VRMLL01kimRYWY0HQ==","signatures":[{"sig":"MEQCIF00VQznQRb5tegj+J5DAHaN3IN68ZSVY1S7LgRP1v99AiBELF6dHCRZVJ0yGJpPpJlnn2HPYt2rB+SZIkJrrf0ieQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52225279},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"1537f08a7327a880323d9ff46013c71b093cddec","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"bn.js":"^5.2.1","@solana/web3.js":"^1.95.3","@coral-xyz/anchor":"^0.32.1","@magicblock-labs/ephemeral-rollups-sdk":"0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.3.5","@types/node":"^16.0.0","@types/bn.js":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.1.0_1770218768733_0.7098059157649705","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@1upmonster/duel","version":"0.1.1","license":"MIT","_id":"@1upmonster/duel@0.1.1","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"f2863c2754d119dcee942eae6ebe8294f0f3410e","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.1.1.tgz","fileCount":3458,"integrity":"sha512-RcZWT4US7QUoPwwdT0VI6BXM9wGGgZnH+FVbSJYN/Z3Z4Hziy1clpUbHu651n3/chetpVp5OoGOb71rAshLNOg==","signatures":[{"sig":"MEYCIQCMRLuUQtFu8pAXbv2wvEK/kX6Vdvg3LTRZobBNbKz9awIhAP9HTgxOp32BKde94FuEEys4m+AYnGyiHqPk+7oNEzF8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52225299},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"6987dcd3ce9e83786446964cb9371c8484181f4c","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"bn.js":"^5.2.1","@solana/web3.js":"^1.95.3","@coral-xyz/anchor":"^0.32.1","@magicblock-labs/ephemeral-rollups-sdk":"0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.3.5","@types/node":"^16.0.0","@types/bn.js":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.1.1_1770219063696_0.349198526238919","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@1upmonster/duel","version":"0.1.2","license":"MIT","_id":"@1upmonster/duel@0.1.2","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"1214e590a9d52fb801819a3e2888c7896a225eec","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.1.2.tgz","fileCount":3459,"integrity":"sha512-zc05GQKkTHmvlNFDeTXllO4y5k+unFu8+6rWhQ7uyoLICe3a3shDRx/Zuh2dqWaCcB+xmSYBIbGEbh2NxV1KJg==","signatures":[{"sig":"MEYCIQD4u4kVjM6M9zK1EVB0J2bRwZ36jO1PqTBkiLtRG93yZAIhANuSaBWeVlpm8yZN6yrG0K9hmo8jagyqxeGraLMt853L","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52227860},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"82ea2d5bc1029494b58629e15a20611b006aab46","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"bn.js":"^5.2.1","@solana/web3.js":"^1.95.3","@coral-xyz/anchor":"^0.32.1","@magicblock-labs/ephemeral-rollups-sdk":"0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.3.5","@types/node":"^16.0.0","@types/bn.js":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.1.2_1770220430782_0.5444099843267505","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@1upmonster/duel","version":"0.1.3","license":"MIT","_id":"@1upmonster/duel@0.1.3","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"4236a272c21cf639bef074eeb445cf05a5fe10a3","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.1.3.tgz","fileCount":3459,"integrity":"sha512-sfFCFKc8/yscnaozADGKRWMq5HOEM4x1u0nFjOqh6Yg8uar03Nud5gtcvVwJW4TMcvX9d/e1Hpbn4bU+nMYO9w==","signatures":[{"sig":"MEUCIQC5SAIdEaJDGEYnwuHH1GSAVdz1sBI5KrCQUkb72sw/YgIgCtVVqCI5FMAccMAsVQUjwOrjJJNCGo0oIH4zCLSr/k4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52232522},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"6499c658c5b50ab0e2c64304b42b3adcbee0fee4","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"bn.js":"^5.2.1","@solana/web3.js":"^1.95.3","@coral-xyz/anchor":"^0.32.1","@magicblock-labs/ephemeral-rollups-sdk":"0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.3.5","@types/node":"^16.0.0","@types/bn.js":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.1.3_1770221308192_0.9633115925156437","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@1upmonster/duel","version":"0.1.4","license":"MIT","_id":"@1upmonster/duel@0.1.4","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"d29b248ab5287d04ba3cc96bbd956270db610dc6","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.1.4.tgz","fileCount":30,"integrity":"sha512-qgorOApAGV0zcoIHZlELew/VMspY3ILdoOG3S84SnjveSdynWY72hrBISv7MzwFUTuuj0EeqxETXIk1TgIDtvA==","signatures":[{"sig":"MEUCIEuuMvxzw/HSXN73USI1VIOE2EnPDBUt+tTyDZYoFcdmAiEAxdAx7Kp9+UHD9ibCziMInLbP28klfdM5ntDqgEOkbwI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":281435},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"dd878125913bad9be596749f908ecb877452b677","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"bn.js":"^5.2.1","@solana/web3.js":"^1.95.3","@coral-xyz/anchor":"^0.32.1","@magicblock-labs/ephemeral-rollups-sdk":"0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.3.5","@types/node":"^16.0.0","@types/bn.js":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.1.4_1770221443499_0.9356368242927091","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@1upmonster/duel","version":"0.1.5","license":"MIT","_id":"@1upmonster/duel@0.1.5","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"23310dec80c194811fa1d04e2292f469f3db7bda","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.1.5.tgz","fileCount":30,"integrity":"sha512-4Xmw9MM7Cu2IKVGUWDiPXKsdX1sgdGOnvJ04OqqHHpBCj0dgnV5xH/qL4TuzMyGfNyZZH2Gyth0bXvctWXKAEg==","signatures":[{"sig":"MEQCIGl3zD/g60OUxO2aGAALEasVCCGx1N46X+L7wubVp45WAiBM4uC5wkZ/vzkF9gOFgjibZNjYsrEjlMyd3GybALMFIg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":281435},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"f8861dc3f2b129244f96bbc1dcf2349b2d77729d","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"bn.js":"^5.2.1","@solana/web3.js":"^1.95.3","@coral-xyz/anchor":"^0.32.1","@magicblock-labs/ephemeral-rollups-sdk":"0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.3.5","@types/node":"^16.0.0","@types/bn.js":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.1.5_1770221709481_0.3155708738334486","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@1upmonster/duel","version":"0.1.6","license":"MIT","_id":"@1upmonster/duel@0.1.6","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"888261d7f623da054b1f976d3eb4bca9c02cfb1d","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.1.6.tgz","fileCount":30,"integrity":"sha512-tWWklduzr4WQziKaaQ02GJyQVlBPbchQjvYl2XXifVkqfxhh8qRgZLzPIB+umyKEO3bg8Uxeb1oibGOgrvmOsA==","signatures":[{"sig":"MEYCIQC4CNRiQTOZjIpQAD49ARbuHfIM/V7gxLAbRurzdqecXAIhAKTCg8/7mbXvk51ajw3lpcUuP4jhvNQMj8jA1u36ztpb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":276232},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"a9cb1c61491ef9d4206076203ff69886f722c49f","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"bn.js":"^5.2.1","@solana/web3.js":"^1.95.3","@coral-xyz/anchor":"^0.32.1","@magicblock-labs/ephemeral-rollups-sdk":"0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.3.5","@types/node":"^16.0.0","@types/bn.js":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.1.6_1770224145339_0.7656656635007253","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@1upmonster/duel","version":"0.1.7","license":"MIT","_id":"@1upmonster/duel@0.1.7","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"ffe94162a2e5e67c4d26fccaeccfd81b0590d534","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.1.7.tgz","fileCount":30,"integrity":"sha512-lhcgRHvYlrr0PFSKSTa5GmZUbBTSmbh23yZKyfbCoMPFuRQREfLYhDXA1/C7hNiE37OFcJ1qVKmRZfE2n+QYew==","signatures":[{"sig":"MEUCIGG4sGPfiKJKZe3wz6n4LNudXPlxxsX0RS5eNRHYOtw1AiEAnwf++wrM2a8XYNsdfauUzv0cfkGmGJiPwWDiRj23j+k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323499},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"ee92364eca51a9f1675ce6ffcc60d9b9daefe7ba","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"bn.js":"^5.2.1","@solana/web3.js":"^1.95.3","@coral-xyz/anchor":"^0.32.1","@magicblock-labs/ephemeral-rollups-sdk":"0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.3.5","@types/node":"^16.0.0","@types/bn.js":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.1.7_1770474724056_0.28043744816900507","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@1upmonster/duel","version":"0.1.8","license":"MIT","_id":"@1upmonster/duel@0.1.8","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"fbd99fd7f3f9cd512a20ac590663913d077cee49","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.1.8.tgz","fileCount":30,"integrity":"sha512-4hLECp38gOPVqsWAFflBJIfvu3h+FpiaXR2LS/V31Wxb2+20MctP+Ne6gtL6sZPvmp5Tq3AdAoScfciGDZcw0g==","signatures":[{"sig":"MEUCIB/1CYepAWmmB+Z1RcwadR3zCRcL2LcqA8QA49QrzuDTAiEA41DBLB0kVF57cplExrwo/vIRwSLNVKWtwKTuMIfQPfc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344791},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"a5ff3410363aa03c4af2e289d90d517482144a1f","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"bn.js":"^5.2.1","@solana/web3.js":"^1.95.3","@coral-xyz/anchor":"^0.32.1","@magicblock-labs/ephemeral-rollups-sdk":"0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"~5.7.0","@types/node":"^16.0.0","@types/bn.js":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.1.8_1770483462471_0.5393478042408726","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@1upmonster/duel","version":"0.2.1","license":"MIT","_id":"@1upmonster/duel@0.2.1","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"4b26973f586f5e6997dfb085bf9fc7e599119755","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.2.1.tgz","fileCount":180,"integrity":"sha512-We8+3wwBPFQbxhxhbT2+pX6nAVJp7zq876jJ9KyEKkdGM4uk5/hq7TNgPZShokzzNQejuimkxZzbQ3eqRT3DZQ==","signatures":[{"sig":"MEYCIQCvx+UzDQYQd3F3VgcWwmpdDUF3Cl0+ICE0cWcAG1mlswIhANZI94ukDyWLCY0t3nHJ7eJFyFlaMxsXOw8R8FJoHJot","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1309935},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"0abb9209f9230fc7ef1933814dde68f6b5450905","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@solana/kit":"^6.1.0","@solana/program-client-core":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"~5.7.0","@types/node":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.2.1_1772086952793_0.7354238864048086","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@1upmonster/duel","version":"0.2.2","license":"MIT","_id":"@1upmonster/duel@0.2.2","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"homepage":"https://github.com/val-samonte/private-matchmaking#readme","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"dist":{"shasum":"f841c481bf7a4b834903543e98f5a2387c87703d","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.2.2.tgz","fileCount":181,"integrity":"sha512-0yLzpOMElkW7t7B3iB7N50VSec9YKuSScesY0hUAMDknKBItrDbqy35bxJ/DXU2kDtQ6CoEkYLW4B6NzFKWMmQ==","signatures":[{"sig":"MEMCHwVLYtAMWMTYdDUjVaSLH37YktuVW7xuBoIfnewL+oECIEc6g2iWrO6LRZzODNBRHEZW6eerhd/+pnN1OGf6emK6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1328019},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"10848ead71e717cc45c9edf3c4ba515e9714411b","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"repository":{"url":"git+https://github.com/val-samonte/private-matchmaking.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for Private Matchmaking on Solana","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@solana/kit":"^6.1.0","@solana/program-client-core":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"~5.7.0","@types/node":"^16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/duel_0.2.2_1772092315187_0.17877950002534093","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@1upmonster/duel","version":"0.2.3","type":"module","description":"SDK for Private Matchmaking on Solana","license":"MIT","repository":{"type":"git","url":"git+https://github.com/val-samonte/private-matchmaking.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"dependencies":{"@solana/kit":"^6.1.0","@solana/program-client-core":"^6.1.0"},"devDependencies":{"@types/node":"^16.0.0","typescript":"~5.7.0"},"gitHead":"eaa529a8c20bb89817619fb7a80fcef6c0d3faf4","_id":"@1upmonster/duel@0.2.3","bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"homepage":"https://github.com/val-samonte/private-matchmaking#readme","_nodeVersion":"24.6.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-+mFM2ofMY1iJyMyS22i4aM/YVU7DLdSuv8cc5mTPNR3F33AmC2PzR587lBH7W7svNUrFYqp+rVPtV/50HIhoxw==","shasum":"88b45107493466f7432e42c3ce79887ca5c9511f","tarball":"https://registry.npmjs.org/@1upmonster/duel/-/duel-0.2.3.tgz","fileCount":183,"unpackedSize":1398970,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDR/JCmfTI0JK03Lwur3FjQrVpvrzlSItFixYepYarF+wIgJWPS53vVRdBs3TF1aRw2aUlgqbZ/NHM6yXuOR9arFpo="}]},"_npmUser":{"name":"valsamonte","email":"val.samonte@gmail.com"},"directories":{},"maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/duel_0.2.3_1772170125436_0.21841243839113234"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-04T15:26:08.624Z","modified":"2026-02-27T05:28:45.800Z","0.1.0":"2026-02-04T15:26:09.196Z","0.1.1":"2026-02-04T15:31:04.361Z","0.1.2":"2026-02-04T15:53:51.307Z","0.1.3":"2026-02-04T16:08:28.645Z","0.1.4":"2026-02-04T16:10:43.660Z","0.1.5":"2026-02-04T16:15:09.629Z","0.1.6":"2026-02-04T16:55:45.467Z","0.1.7":"2026-02-07T14:32:04.218Z","0.1.8":"2026-02-07T16:57:42.618Z","0.2.1":"2026-02-26T06:22:32.985Z","0.2.2":"2026-02-26T07:51:55.325Z","0.2.3":"2026-02-27T05:28:45.678Z"},"bugs":{"url":"https://github.com/val-samonte/private-matchmaking/issues"},"license":"MIT","homepage":"https://github.com/val-samonte/private-matchmaking#readme","repository":{"type":"git","url":"git+https://github.com/val-samonte/private-matchmaking.git"},"description":"SDK for Private Matchmaking on Solana","maintainers":[{"name":"valsamonte","email":"val.samonte@gmail.com"}],"readme":"# @1upmonster/duel\n\nTypeScript SDK for **Duel** — a privacy-preserving matchmaking protocol on Solana using MagicBlock Ephemeral Rollups (TEE).\n\nBuilt on [`@solana/kit`](https://github.com/anza-xyz/kit). No `@coral-xyz/anchor` or legacy `web3.js` dependency.\n\n## Installation\n\n```bash\nnpm install @1upmonster/duel\n```\n\n## Quick Start\n\n### For Game Owners (`MatchmakingAdmin`)\n\n```typescript\nimport { MatchmakingAdmin } from \"@1upmonster/duel\";\nimport { createSolanaRpc, createKeyPairSignerFromBytes } from \"@solana/kit\";\nimport * as crypto from \"crypto\";\n\nconst rpc = createSolanaRpc(\"https://api.devnet.solana.com\");\nconst signer = await createKeyPairSignerFromBytes(/* your keypair bytes */);\nconst admin = new MatchmakingAdmin(rpc, signer);\n\n// 1. Initialize Tenant — stores callback config on L1\nconst callbackDiscriminator = Array.from(\n  crypto.createHash(\"sha256\").update(\"global:on_match_found\").digest().slice(0, 8)\n);\nawait admin.initializeTenant(YOUR_GAME_PROGRAM_ID, {\n  eloWindow: 100n,       // max ELO diff for a match\n  eloOffset: 40,         // byte offset of ELO in player account\n  eloDataType: \"u64\",    // u8 | u16 | u32 | u64\n  callbackProgramId: YOUR_GAME_PROGRAM_ID,\n  callbackDiscriminator,\n});\n\n// 2. Create and delegate queue to TEE (automatically sets up permission PDA)\nconst authority = signer.address;\nawait admin.initializeQueue(authority, tenantPda);\nawait admin.delegateQueue(authority, validatorPubkey);\n// Queue is now a dark pool: only the queue authority's TEE token can read it\n\n// 3. After players have matched, flush opponent tickets + commit all to L1\nawait admin.resolveMatches(queuePda, tenantPda, [p1TicketPda, p2TicketPda]);\n```\n\n### For Players (`MatchmakingPlayer`)\n\n```typescript\nimport { MatchmakingPlayer } from \"@1upmonster/duel\";\nimport { getAuthToken } from \"@1upmonster/duel\";\nimport { createSolanaRpc } from \"@solana/kit\";\n\nconst l1Rpc = createSolanaRpc(\"https://api.devnet.solana.com\");\nconst player = new MatchmakingPlayer(l1Rpc, signer);\n\n// High-level: creates ticket on L1, delegates to TEE, joins queue in one call\nconst { token } = await getAuthToken(\"https://tee.magicblock.app\", signer);\nconst teeRpc = createSolanaRpc(`https://tee.magicblock.app?token=${token}`);\n\nconst ticketPda = await player.enterQueue(\n  tenantPda,\n  queuePda,\n  playerProfilePda,\n  teeRpc,\n  `https://tee.magicblock.app?token=${token}`,\n  validatorPubkey,        // optional TEE validator\n  YOUR_GAME_PROGRAM_ID,   // optional: callback fires via Tenant PDA when matched\n);\n\n// Poll L1 until the ticket shows Matched status\nconst match = await player.pollForMatch(ticketPda);\n// match = { opponent: Address, matchId: bigint }\n```\n\n## API Reference\n\n### `MatchmakingAdmin`\n\n**Constructor:** `new MatchmakingAdmin(rpc, signer, programId?)`\n\n| Method | Description |\n|---|---|\n| `initializeTenant(tenantProgramId, options?)` | Create Tenant PDA with ELO config and optional callback |\n| `initializeQueue(authority, tenant)` | Create Queue PDA linked to tenant |\n| `delegateQueue(authority, validator?)` | Delegate queue to TEE + set up Permission PDA (only authority can read via TEE RPC) |\n| `flushMatches(queue, tenant, ticketPdas)` | Update opponent tickets from pending matches |\n| `commitTickets(tenant, ticketPdas)` | Push matched ticket state back to L1 |\n| `resolveMatches(queue, tenant, ticketPdas, settlementDelayMs?)` | High-level: flush + wait + commit |\n| `getQueue(queuePda)` | Fetch queue account |\n| `getQueuePda(authority)` | Derive queue PDA |\n| `getTenantPda(authority)` | Derive tenant PDA |\n\n### `MatchmakingPlayer`\n\n**Constructor:** `new MatchmakingPlayer(rpc, signer, programId?)`\n\n| Method | Description |\n|---|---|\n| `enterQueue(tenant, queue, playerData, teeRpc, teeUrlWithToken, validator?, callbackProgram?)` | High-level: create ticket → set up Permission PDA → delegate → join queue |\n| `createTicket(tenant)` | Create MatchTicket PDA on L1 |\n| `delegateTicket(player, tenant, validator?)` | Delegate ticket to TEE |\n| `joinQueue(queue, tenant, playerData, callbackProgram?)` | Join queue in TEE; callback fires via Tenant PDA on match |\n| `cancelTicket(tenant)` | Cancel search (sets ticket to Cancelled) |\n| `closeTicket(tenant)` | Reclaim rent after match or cancel |\n| `pollForMatch(ticketPda, maxAttempts?, pollInterval?)` | Poll L1 until ticket is Matched |\n| `getTicket(ticketPda)` | Fetch ticket account |\n| `withRpc(teeUrl)` | Return a new client pointing at a different RPC |\n\n### `getAuthToken(rpcUrl, signer)`\n\nAuthenticate with the MagicBlock TEE. Returns `{ token, expiresAt }`. The token is passed as `?token=<jwt>` in the TEE RPC URL.\n\n### `waitForPermission(teeUrlWithToken, accountAddress, timeoutMs?)`\n\nPoll the TEE until the Permission PDA for `accountAddress` is active (i.e. TEE has picked up the delegated ACL). Returns `true` if confirmed within `timeoutMs` (default 10s), `false` on timeout. Useful after `delegateQueue` if you want to confirm the dark pool is enforced before sending players in.\n\n## Privacy Model\n\nQueue and ticket state is enforced at the **TEE RPC layer** by Permission PDAs:\n\n- **Queue** — only the queue authority's auth token can call `getAccountInfo` on the queue. Other authenticated wallets receive `null` (account not found).\n- **Tickets** — only the ticket owner and queue authority can read a ticket on TEE. Third parties read the committed L1 ticket after `resolveMatches`.\n\nThis is enforced by the `ACLseo` permission program (`ACLseoPoyC3cBqoUtkbjZ4aDrkurZW86v19pXz2XQnp1`). Both `delegateQueue` and `enterQueue` set up these Permission PDAs automatically before delegating to TEE.\n\n## How the Callback Works\n\nWhen a match is found during `join_queue`, the duel program fires a CPI callback **signed by the Tenant PDA** via `invoke_signed`. This is cryptographically unforgeable — game programs can verify the signer is the Tenant PDA without any additional access control:\n\n```rust\npub fn on_match_found(\n    ctx: Context<OnMatchFound>,\n    player1: Pubkey,\n    player2: Pubkey,\n    match_id: u64,\n) -> Result<()> {\n    // ctx.accounts.signer.key() == Tenant PDA — verified by the runtime\n    // Only the duel program can produce this signer\n    Ok(())\n}\n\n#[derive(Accounts)]\npub struct OnMatchFound<'info> {\n    pub signer: Signer<'info>, // will be the Tenant PDA\n}\n```\n\nPass the callback program as `remaining_accounts` in `joinQueue` (or via `callbackProgram` param in the SDK) for the callback to fire.\n\n## ELO Data Types\n\n| Type | Bytes | Range |\n|---|---|---|\n| `\"u8\"` | 1 | 0–255 |\n| `\"u16\"` | 2 | 0–65,535 |\n| `\"u32\"` | 4 | 0–4,294,967,295 |\n| `\"u64\"` | 8 | 0–18,446,744,073,709,551,615 |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}