{"_id":"@dulcetlabs/suglink","_rev":"10-0bd8637757d0bc985e992847d428bc44","name":"@dulcetlabs/suglink","dist-tags":{"latest":"0.5.0"},"versions":{"0.0.1":{"name":"@dulcetlabs/suglink","version":"0.0.1","keywords":["solana","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"author":{"name":"Dulcet Labs"},"license":"MIT AND Commons-Clause","_id":"@dulcetlabs/suglink@0.0.1","maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"homepage":"https://github.com/Dulcet-Labs/suglink#readme","bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"dist":{"shasum":"ab00057b9073945e982eca1933c1d8d26017485b","tarball":"https://registry.npmjs.org/@dulcetlabs/suglink/-/suglink-0.0.1.tgz","fileCount":8,"integrity":"sha512-bTgzrGFXGlOk/s/Hen8IHr8ClkFzZLAXWIJiqJDNbz11gYzBmpDpyIEbq8IbjDdGTXQyF0/oBJivQtdRbOqMtg==","signatures":[{"sig":"MEUCIG4jIQKexJ/yhj/BEJsEoiaCB0WRilZN7/aWvVUL/qnnAiEA9sUs/P9Z47BNiJierEIVogcdeu1LPXvvulfglU1qhcw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31412},"main":"dist/server.js","types":"dist/SugLink.d.ts","engines":{"node":">=14.0.0"},"gitHead":"1a0ff01638fc0f59a4fc8b9c8add364f3b2733b8","scripts":{"dev":"ts-node server.ts","lint":"eslint . --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","start":"node dist/server.js","prepack":"yarn build","prepare":"yarn build","rebuild":"yarn clean && yarn build","prepublishOnly":"yarn test && yarn lint"},"_npmUser":{"name":"nicksol","email":"soldulcetlabs@gmail.com"},"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"_npmVersion":"10.8.2","description":"Social login feature that enables easy onboarding and wallet creation using existing social accounts - Internal Dulcet Labs Package","directories":{},"_nodeVersion":"20.18.3","dependencies":{"cors":"^2.8.5","axios":"^1.6.7","dotenv":"^16.4.5","express":"^4.18.2","@solana/web3.js":"^1.87.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.1.1","devDependencies":{"jest":"^29.7.0","eslint":"8.56.0","rimraf":"^5.0.1","globals":"^16.0.0","ts-jest":"^29.2.6","ts-node":"^10.9.2","@eslint/js":"^9.22.0","typescript":"5.3.3","@types/cors":"^2.8.17","@types/jest":"^29.5.14","@types/node":"^20.11.19","@types/express":"^4.17.21","@typescript-eslint/parser":"6.21.0","@typescript-eslint/eslint-plugin":"6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/suglink_0.0.1_1742119295446_0.43456306031592673","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@dulcetlabs/suglink","version":"0.0.2","keywords":["solana","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"author":{"name":"Dulcet Labs"},"license":"MIT AND Commons-Clause","_id":"@dulcetlabs/suglink@0.0.2","maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"homepage":"https://github.com/Dulcet-Labs/suglink#readme","bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"dist":{"shasum":"f8f6913125d895cf023d55a846d68443ec3d2fed","tarball":"https://registry.npmjs.org/@dulcetlabs/suglink/-/suglink-0.0.2.tgz","fileCount":24,"integrity":"sha512-qMn13KO5M1SDSOMbHcPxBRQvO5lWxQhI8+pDDzdoQJZ1N3ZrBQUAHK6oy5H3BKNWObobKkyTX5k8cUwmjHxZhA==","signatures":[{"sig":"MEUCIQDp1QW0i9TH2ba+CJOiWeuz7TWr4UEZc5xe3piATJH14QIgdv5ZR7tAyMPxVwuvrxoQXgnVkfJI6lR7hZwuC+cEebI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103826},"main":"./dist/cjs/SugLink.js","type":"module","types":"./dist/types/SugLink.d.ts","module":"./dist/esm/SugLink.js","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/types/SugLink.d.ts","import":"./dist/esm/SugLink.js","default":"./dist/esm/SugLink.js","require":"./dist/cjs/SugLink.js"}},"gitHead":"1a0ff01638fc0f59a4fc8b9c8add364f3b2733b8","scripts":{"lint":"eslint . --ext .ts","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"rimraf dist && yarn build:esm && yarn build:cjs && yarn build:types","clean":"rimraf dist","prepare":"yarn build","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"npm run test && npm run lint"},"_npmUser":{"name":"nicksol","email":"soldulcetlabs@gmail.com"},"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"_npmVersion":"10.8.2","description":"Social login feature that enables easy onboarding and wallet creation using existing social accounts - Internal Dulcet Labs Package","directories":{},"sideEffects":false,"_nodeVersion":"20.18.3","dependencies":{"axios":"^1.6.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.1.1","devDependencies":{"jest":"^29.7.0","eslint":"8.56.0","rimraf":"^5.0.1","ts-jest":"^29.2.6","typescript":"5.3.3","@types/jest":"^29.5.14","@types/node":"^20.11.19","@jest/globals":"^29.7.0","@typescript-eslint/parser":"6.21.0","@typescript-eslint/eslint-plugin":"6.21.0"},"peerDependencies":{"node":">=14.0.0","@solana/web3.js":"^1.73.0 || ^1.87.0"},"optionalDependencies":{"dotenv":"^16.4.5"},"_npmOperationalInternal":{"tmp":"tmp/suglink_0.0.2_1742132979446_0.47093266286144186","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@dulcetlabs/suglink","version":"0.0.3","keywords":["solana","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"author":{"name":"Dulcet Labs"},"license":"MIT AND Commons-Clause","_id":"@dulcetlabs/suglink@0.0.3","maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"homepage":"https://github.com/Dulcet-Labs/suglink#readme","bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"dist":{"shasum":"1aea46dce86429d04115e3a161f5001f26c4c28a","tarball":"https://registry.npmjs.org/@dulcetlabs/suglink/-/suglink-0.0.3.tgz","fileCount":24,"integrity":"sha512-N+OmrnRnuUTKEX+cA7CAHllW2U+WroL0sr09rr7a4TB+smRPyU4i2Eg/ufQhtGi/fRoH2Ls7i2p7FoARl8IQPw==","signatures":[{"sig":"MEUCIAHTHDRN2Sk1tzCgKcK+XMVfRqQCnXaUEmfO8fjM/EC3AiEAhOnI3mSNRk/vkIl8Y35D2xvZq0qNATvVzXLbAjZF+lY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104819},"main":"./dist/cjs/SugLink.js","type":"module","types":"./dist/types/SugLink.d.ts","module":"./dist/esm/SugLink.js","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/types/SugLink.d.ts","import":"./dist/esm/SugLink.js","default":"./dist/esm/SugLink.js","require":"./dist/cjs/SugLink.js"}},"gitHead":"9aeead0a3f8d244be8004735ba2b1203c68211c1","scripts":{"lint":"eslint . --ext .ts","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"rimraf dist && yarn build:esm && yarn build:cjs && yarn build:types","clean":"rimraf dist","prepare":"yarn build","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"npm run test && npm run lint"},"_npmUser":{"name":"nicksol","email":"soldulcetlabs@gmail.com"},"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"_npmVersion":"10.8.2","description":"Social login feature that enables easy onboarding and wallet creation using existing social accounts - Internal Dulcet Labs Package","directories":{},"sideEffects":false,"_nodeVersion":"20.18.3","dependencies":{"axios":"^1.6.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.1.1","devDependencies":{"jest":"^29.7.0","eslint":"8.56.0","rimraf":"^5.0.1","ts-jest":"^29.2.6","typescript":"5.3.3","@types/jest":"^29.5.14","@types/node":"^20.11.19","@jest/globals":"^29.7.0","@typescript-eslint/parser":"6.21.0","@typescript-eslint/eslint-plugin":"6.21.0"},"peerDependencies":{"node":">=14.0.0","@solana/web3.js":"^1.73.0 || ^1.87.0"},"optionalDependencies":{"dotenv":"^16.4.5"},"_npmOperationalInternal":{"tmp":"tmp/suglink_0.0.3_1742133455855_0.45114643710766167","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@dulcetlabs/suglink","version":"0.0.4","keywords":["solana","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"author":{"name":"Dulcet Labs"},"license":"MIT AND Commons-Clause","_id":"@dulcetlabs/suglink@0.0.4","maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"homepage":"https://github.com/Dulcet-Labs/suglink#readme","bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"dist":{"shasum":"ac3ba60a7862a177da8f04f7a12452aa09d0e7ca","tarball":"https://registry.npmjs.org/@dulcetlabs/suglink/-/suglink-0.0.4.tgz","fileCount":24,"integrity":"sha512-rOfSHUoPkMjmGbK6yF0qPmufHnYhyYj/hXF0DOp8ZsgbuScy9IAysXtNNI4IesVnccprNvVVl1ZsvpHRTVGZPA==","signatures":[{"sig":"MEUCICFPn6xnGRze0BHIVVu6YruejrMVO6BZCEgbMg/YsD8+AiEApmiKmyTN+4oOLoANB2hEcMsXXDfQ2G+lkiSrNvo8r6Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104554},"main":"./dist/cjs/src/SugLink.js","type":"module","types":"./dist/types/src/SugLink.d.ts","module":"./dist/esm/src/SugLink.js","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/types/src/SugLink.d.ts","import":"./dist/esm/src/SugLink.js","default":"./dist/esm/src/SugLink.js","require":"./dist/cjs/src/SugLink.js"}},"gitHead":"5c2d4b2098e2f7a30118b56a2188d11c71da3717","scripts":{"lint":"eslint . --ext .ts","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"rimraf dist && yarn build:esm && yarn build:cjs && yarn build:types","clean":"rimraf dist","prepare":"yarn build","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"npm run test && npm run lint"},"_npmUser":{"name":"nicksol","email":"soldulcetlabs@gmail.com"},"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"_npmVersion":"10.8.2","description":"Social login feature that enables easy onboarding and wallet creation using existing social accounts - Internal Dulcet Labs Package","directories":{},"sideEffects":false,"_nodeVersion":"20.18.3","dependencies":{"axios":"^1.6.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.1.1","devDependencies":{"jest":"^29.7.0","eslint":"8.56.0","rimraf":"^5.0.1","ts-jest":"^29.2.6","typescript":"5.3.3","@types/jest":"^29.5.14","@types/node":"^20.11.19","@jest/globals":"^29.7.0","@typescript-eslint/parser":"6.21.0","@typescript-eslint/eslint-plugin":"6.21.0"},"peerDependencies":{"node":">=14.0.0","@solana/web3.js":"^1.73.0 || ^1.87.0"},"optionalDependencies":{"dotenv":"^16.4.5"},"_npmOperationalInternal":{"tmp":"tmp/suglink_0.0.4_1742294884817_0.8892878746357036","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@dulcetlabs/suglink","version":"0.0.5","keywords":["solana","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"author":{"name":"Dulcet Labs"},"license":"MIT AND Commons-Clause","_id":"@dulcetlabs/suglink@0.0.5","maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"homepage":"https://github.com/Dulcet-Labs/suglink#readme","bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"dist":{"shasum":"213a0ff9cab9efedab164bff30683db0fe69b121","tarball":"https://registry.npmjs.org/@dulcetlabs/suglink/-/suglink-0.0.5.tgz","fileCount":34,"integrity":"sha512-axBIUtaYmx3jLrmC34cjrp55PZXckLG5jYfu6g8MvJbu+zgKx6A+siz39hGpQ62070VXtm2ASybh/sm41ZdSCw==","signatures":[{"sig":"MEQCICr0Db1SO6w/7bquO1T0CxZJXmfwxmlNfnSpj3UNzEUpAiB03lzWKz+CFREzL9MrjBrGiUTpqUBMEk2f2ozfjI4xWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101770},"main":"./dist/cjs/src/SugLink.js","type":"module","types":"./dist/types/src/SugLink.d.ts","module":"./dist/esm/src/SugLink.js","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/types/src/SugLink.d.ts","import":"./dist/esm/src/SugLink.js","default":"./dist/esm/src/SugLink.js","require":"./dist/cjs/src/SugLink.js"}},"gitHead":"c96691b6f070fd3d4fe91322a735e306a87bd1a1","scripts":{"lint":"eslint . --ext .ts","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"rimraf dist && yarn build:esm && yarn build:cjs && yarn build:types","clean":"rimraf dist","prepare":"yarn build","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"npm run test"},"_npmUser":{"name":"nicksol","email":"soldulcetlabs@gmail.com"},"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"_npmVersion":"10.8.2","description":"Social login feature that enables easy onboarding and wallet creation using existing social accounts - Internal Dulcet Labs Package","directories":{},"sideEffects":false,"_nodeVersion":"20.18.3","dependencies":{"axios":"^1.6.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.1.1","devDependencies":{"jest":"^29.7.0","eslint":"8.56.0","rimraf":"^5.0.1","ts-jest":"^29.2.6","typescript":"5.3.3","@types/jest":"^29.5.14","@types/node":"^20.11.19","@jest/globals":"^29.7.0","@solana/web3.js":"^1.98.4","@typescript-eslint/parser":"6.21.0","@typescript-eslint/eslint-plugin":"6.21.0"},"peerDependencies":{"node":">=14.0.0","@solana/web3.js":"^1.73.0 || ^1.87.0"},"optionalDependencies":{"dotenv":"^16.4.5"},"_npmOperationalInternal":{"tmp":"tmp/suglink_0.0.5_1754310043661_0.35862960627266305","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@dulcetlabs/suglink","version":"0.1.0","keywords":["solana","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"author":{"name":"Dulcet Labs"},"license":"MIT AND Commons-Clause","_id":"@dulcetlabs/suglink@0.1.0","maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"homepage":"https://github.com/Dulcet-Labs/suglink#readme","bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"dist":{"shasum":"e4361065f1a2e3f0ddb26df5e3d9ee4f4160a067","tarball":"https://registry.npmjs.org/@dulcetlabs/suglink/-/suglink-0.1.0.tgz","fileCount":34,"integrity":"sha512-AEsb7FUhf4u5O+nXnZnPCNnnz7j7YZqhoGWbl4c+o+X7sFt//Y0AlLd2qTo/JlpNnw5Rxd3GPw9vhbQOlfysew==","signatures":[{"sig":"MEUCIQCjOI/IqG4ShROlUUQQ1zKuB5RuTpbFpduK/LO9b4jLNAIgSZyztN/RwETVzbXsErZzCtgJghrU7o6YOpyYPAS9Qsc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115348},"main":"./dist/cjs/src/SugLink.js","type":"module","types":"./dist/types/src/SugLink.d.ts","module":"./dist/esm/src/SugLink.js","browser":{"buffer":"buffer","crypto":false},"engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/types/src/SugLink.d.ts","import":"./dist/esm/src/SugLink.js","default":"./dist/esm/src/SugLink.js","require":"./dist/cjs/src/SugLink.js"}},"gitHead":"65e9404a5c6a7b0196a2870b2619b7b0b6de7cf9","scripts":{"lint":"eslint . --ext .ts","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"rimraf dist && yarn build:esm && yarn build:cjs && yarn build:types","clean":"rimraf dist","prepare":"yarn build","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"npm run test"},"_npmUser":{"name":"nicksol","email":"soldulcetlabs@gmail.com"},"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"_npmVersion":"10.8.2","description":"Social login feature that enables easy onboarding and wallet creation using existing social accounts - Internal Dulcet Labs Package","directories":{},"sideEffects":false,"_nodeVersion":"20.18.3","dependencies":{"axios":"^1.6.7","buffer":"^6.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.1.1","devDependencies":{"jest":"^29.7.0","eslint":"8.56.0","rimraf":"^5.0.1","ts-jest":"^29.2.6","typescript":"5.3.3","@types/jest":"^29.5.14","@types/node":"^20.11.19","@jest/globals":"^29.7.0","@solana/web3.js":"^1.98.4","@typescript-eslint/parser":"6.21.0","@typescript-eslint/eslint-plugin":"6.21.0"},"peerDependencies":{"node":">=14.0.0","@solana/web3.js":"^1.73.0 || ^1.87.0"},"optionalDependencies":{"dotenv":"^16.4.5"},"_npmOperationalInternal":{"tmp":"tmp/suglink_0.1.0_1754369990732_0.403300041942269","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@dulcetlabs/suglink","version":"0.2.0","keywords":["solana","sui","multi-chain","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"author":{"name":"Dulcet Labs"},"license":"MIT AND Commons-Clause","_id":"@dulcetlabs/suglink@0.2.0","maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"homepage":"https://github.com/Dulcet-Labs/suglink#readme","bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"dist":{"shasum":"1cb42a149e0882901788a0ad3e19cefbd4188220","tarball":"https://registry.npmjs.org/@dulcetlabs/suglink/-/suglink-0.2.0.tgz","fileCount":65,"integrity":"sha512-Iip7rjqwb6JJiydzZqIXW+tYOsNr/OlfFM0OqpWGriOpfkV65/hAIxOx2IDW3mgQByAQmGEqh1VWPaPN3s9Enw==","signatures":[{"sig":"MEUCIG8Q4cgL7xGqOwdY4j6mr8mGYPW3O60sT760Gi3zWcEaAiEAhoA7Ujug/VMGPgGvtfeMD09dmSupBOxJMRNym8GdhS8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":224940},"main":"./dist/cjs/src/SugLink.js","type":"module","types":"./dist/types/src/SugLink.d.ts","module":"./dist/esm/src/SugLink.js","browser":{"buffer":"buffer","crypto":false},"engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/types/src/SugLink.d.ts","import":"./dist/esm/src/SugLink.js","default":"./dist/esm/src/SugLink.js","require":"./dist/cjs/src/SugLink.js"}},"gitHead":"8c0c34f3d65919c7147e702f4d2c8abb92679c83","scripts":{"lint":"eslint . --ext .ts","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"rimraf dist && yarn build:esm && yarn build:cjs && yarn build:types","clean":"rimraf dist","prepare":"yarn build","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"npm run test"},"_npmUser":{"name":"nicksol","email":"soldulcetlabs@gmail.com"},"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"_npmVersion":"10.8.2","description":"Social login with multi-chain wallet creation (Solana & Sui) - Non-custodial Web3 onboarding made simple","directories":{},"sideEffects":false,"_nodeVersion":"20.18.3","dependencies":{"axios":"^1.6.7","buffer":"^6.0.3","@mysten/sui":"^1.37.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.1.1","devDependencies":{"jest":"^29.7.0","eslint":"8.56.0","rimraf":"^5.0.1","ts-jest":"^29.2.6","typescript":"5.3.3","@types/jest":"^29.5.14","@types/node":"^20.11.19","@jest/globals":"^29.7.0","@solana/web3.js":"^1.98.4","@typescript-eslint/parser":"6.21.0","@typescript-eslint/eslint-plugin":"6.21.0"},"peerDependencies":{"node":">=14.0.0","@solana/web3.js":"^1.73.0 || ^1.87.0"},"optionalDependencies":{"dotenv":"^16.4.5"},"_npmOperationalInternal":{"tmp":"tmp/suglink_0.2.0_1757248102968_0.9410237130794603","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@dulcetlabs/suglink","version":"0.3.0","keywords":["solana","sui","multi-chain","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"author":{"name":"Dulcet Labs"},"license":"MIT AND Commons-Clause","_id":"@dulcetlabs/suglink@0.3.0","maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"homepage":"https://github.com/Dulcet-Labs/suglink#readme","bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"dist":{"shasum":"276c9acaf418ae3eab52c684d3aa520f7a958f01","tarball":"https://registry.npmjs.org/@dulcetlabs/suglink/-/suglink-0.3.0.tgz","fileCount":75,"integrity":"sha512-iIX66byMNzt7ePedXlQ5s0YMHD9Ay9VEvYKdmY3D5NYrv6fxlzIUHa2nUZ58U5YrnUtPvxQlEQ1e4XhS8oQ35g==","signatures":[{"sig":"MEUCICp0lppn9foZwWD5Ke5bumXnlhETdDuGfHjTviRkLvm9AiEAkekIh/qQvaRCZaF1PlCjKAlUu1IaeHqzweGKIrfGBuc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":260535},"main":"./dist/cjs/src/SugLink.js","type":"module","types":"./dist/types/src/SugLink.d.ts","module":"./dist/esm/src/SugLink.js","browser":{"buffer":"buffer","crypto":false},"engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/types/src/SugLink.d.ts","import":"./dist/esm/src/SugLink.js","default":"./dist/esm/src/SugLink.js","require":"./dist/cjs/src/SugLink.js"}},"gitHead":"f5aa4bbb88ec51b6c23968c705d7e9831b052b15","scripts":{"lint":"eslint . --ext .ts","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"rimraf dist && yarn build:esm && yarn build:cjs && yarn build:types","clean":"rimraf dist","prepare":"yarn build","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"npm run test"},"_npmUser":{"name":"nicksol","email":"soldulcetlabs@gmail.com"},"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"_npmVersion":"10.8.2","description":"Social login with multi-chain wallet creation (Solana & Sui) - Non-custodial Web3 onboarding made simple","directories":{},"sideEffects":false,"_nodeVersion":"20.18.3","dependencies":{"axios":"^1.6.7","buffer":"^6.0.3","@mysten/sui":"^1.37.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.1.1","devDependencies":{"jest":"^29.7.0","eslint":"8.56.0","rimraf":"^5.0.1","ts-jest":"^29.2.6","typescript":"5.3.3","@types/jest":"^29.5.14","@types/node":"^20.11.19","@jest/globals":"^29.7.0","@solana/web3.js":"^1.98.4","@typescript-eslint/parser":"6.21.0","@typescript-eslint/eslint-plugin":"6.21.0"},"peerDependencies":{"node":">=14.0.0","@solana/web3.js":"^1.73.0 || ^1.87.0"},"optionalDependencies":{"dotenv":"^16.4.5"},"_npmOperationalInternal":{"tmp":"tmp/suglink_0.3.0_1769511021846_0.9885894195099185","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@dulcetlabs/suglink","version":"0.4.0","keywords":["solana","sui","multi-chain","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"author":{"name":"Dulcet Labs"},"license":"MIT AND Commons-Clause","_id":"@dulcetlabs/suglink@0.4.0","maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"homepage":"https://github.com/Dulcet-Labs/suglink#readme","bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"dist":{"shasum":"7e4e41dd17826d10484b463abfda508fd0d3f8d6","tarball":"https://registry.npmjs.org/@dulcetlabs/suglink/-/suglink-0.4.0.tgz","fileCount":75,"integrity":"sha512-pucbkFGsvoHp8SG49NxsxuPg9bcgOcRFgyaUcPMuqB6leiuhdAhHUsVgFY4T0QRB6Rlgkxcm9u5M9oU/WcmmIw==","signatures":[{"sig":"MEUCIQC+ca+zFW+ebxFKb1YiUGBbntIA3aQO7jnbfU7MF7wKeQIgFaIe9I/rRLchCQjyd01z+ZPVVCkDsQk1EkbGSYX7MOo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":266418},"main":"./dist/cjs/src/SugLink.js","type":"module","types":"./dist/types/src/SugLink.d.ts","module":"./dist/esm/src/SugLink.js","browser":{"buffer":"buffer","crypto":false},"engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/types/src/SugLink.d.ts","import":"./dist/esm/src/SugLink.js","default":"./dist/esm/src/SugLink.js","require":"./dist/cjs/src/SugLink.js"}},"gitHead":"8d584790bf0627a1848c3af17c90c1406f850430","scripts":{"lint":"eslint . --ext .ts","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"rimraf dist && yarn build:esm && yarn build:cjs && yarn build:types","clean":"rimraf dist","prepare":"yarn build","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"npm run test"},"_npmUser":{"name":"nicksol","email":"soldulcetlabs@gmail.com"},"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"_npmVersion":"11.8.0","description":"Social login with multi-chain wallet creation (Solana & Sui) - Non-custodial Web3 onboarding made simple","directories":{},"sideEffects":false,"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.6.7","buffer":"^6.0.3","@mysten/sui":"^1.37.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.1.1","devDependencies":{"jest":"^29.7.0","eslint":"8.56.0","rimraf":"^5.0.1","ts-jest":"^29.2.6","typescript":"5.3.3","@types/jest":"^29.5.14","@types/node":"^20.11.19","@jest/globals":"^29.7.0","@solana/web3.js":"^1.98.4","@typescript-eslint/parser":"6.21.0","@typescript-eslint/eslint-plugin":"6.21.0"},"peerDependencies":{"node":">=14.0.0","@solana/web3.js":"^1.73.0 || ^1.87.0"},"optionalDependencies":{"dotenv":"^16.4.5"},"_npmOperationalInternal":{"tmp":"tmp/suglink_0.4.0_1780557753701_0.4941527921738771","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"_id":"@dulcetlabs/suglink@0.5.0","bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"dist":{"shasum":"b1cbf70c5656d256653ffa2b9c7c77ff25c80f8a","tarball":"https://registry.npmjs.org/@dulcetlabs/suglink/-/suglink-0.5.0.tgz","fileCount":96,"integrity":"sha512-KyLJ9jubQBksui3L/+9p/5pq0JK9QcslfscyqpWamp71KHP72Z7yGt0UqK4mGwizYflOBQsr5TnDv4WWIpwzUA==","signatures":[{"sig":"MEQCID7G0oQa7W20rO8WD2Cfne9hcNcxn5f4bJVnxoJYvaRrAiBmjeViJrN+ErmUxKDABpsBJXV06ORzqNMrdu34ZFQeGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCPY83ETjjdfX/zaCo310Ag2060EKJ985cwEgkfKECpzwIgPehVUqNx+9Js51b0jNAC4xHDB7SFr6sVjepLRAUAc4Q="}],"unpackedSize":326811},"main":"./dist/cjs/src/SugLink.js","name":"@dulcetlabs/suglink","type":"module","types":"./dist/types/src/SugLink.d.ts","author":{"name":"Dulcet Labs"},"module":"./dist/esm/src/SugLink.js","browser":{"buffer":"buffer","crypto":false},"engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/types/src/SugLink.d.ts","import":"./dist/esm/src/SugLink.js","default":"./dist/esm/src/SugLink.js","require":"./dist/cjs/src/SugLink.js"}},"gitHead":"8d584790bf0627a1848c3af17c90c1406f850430","license":"MIT AND Commons-Clause","scripts":{"lint":"eslint . --ext .ts","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"rimraf dist && yarn build:esm && yarn build:cjs && yarn build:types","clean":"rimraf dist","prepare":"yarn build","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"npm run test"},"version":"0.5.0","_npmUser":{"name":"nicksol","email":"soldulcetlabs@gmail.com"},"homepage":"https://github.com/Dulcet-Labs/suglink#readme","keywords":["solana","sui","evm","ethereum","secp256k1","multi-chain","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"_npmVersion":"11.19.0","description":"Social login with multi-chain wallet creation (Solana, Sui & EVM) - Non-custodial Web3 onboarding made simple","directories":{},"maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.6.7","buffer":"^6.0.3","@mysten/sui":"^1.37.6","@noble/curves":"^1.9.0","@noble/hashes":"^1.8.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.1.1","devDependencies":{"jest":"^29.7.0","eslint":"8.56.0","rimraf":"^5.0.1","ts-jest":"^29.2.6","typescript":"5.3.3","@types/jest":"^29.5.14","@types/node":"^20.11.19","@jest/globals":"^29.7.0","@solana/web3.js":"^1.98.4","@typescript-eslint/parser":"6.21.0","@typescript-eslint/eslint-plugin":"6.21.0"},"peerDependencies":{"node":">=14.0.0","@solana/web3.js":"^1.73.0 || ^1.87.0"},"optionalDependencies":{"dotenv":"^16.4.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/suglink_0.5.0_1789636371553_0.18199578764808377"}}},"time":{"created":"2025-03-16T10:01:35.334Z","modified":"2026-09-17T09:12:51.824Z","0.0.1":"2025-03-16T10:01:35.686Z","0.0.2":"2025-03-16T13:49:39.700Z","0.0.3":"2025-03-16T13:57:36.083Z","0.0.4":"2025-03-18T10:48:04.986Z","0.0.5":"2025-08-04T12:20:43.864Z","0.1.0":"2025-08-05T04:59:50.928Z","0.2.0":"2025-09-07T12:28:23.235Z","0.3.0":"2026-01-27T10:50:21.988Z","0.4.0":"2026-06-04T07:22:33.841Z","0.5.0":"2026-09-17T09:12:51.636Z"},"bugs":{"url":"https://github.com/Dulcet-Labs/suglink/issues"},"author":{"name":"Dulcet Labs"},"license":"MIT AND Commons-Clause","homepage":"https://github.com/Dulcet-Labs/suglink#readme","keywords":["solana","sui","evm","ethereum","secp256k1","multi-chain","social-login","oauth","keypair","web3","cryptocurrency","blockchain","authentication"],"repository":{"url":"git+https://github.com/Dulcet-Labs/suglink.git","type":"git"},"description":"Social login with multi-chain wallet creation (Solana, Sui & EVM) - Non-custodial Web3 onboarding made simple","maintainers":[{"name":"nicksol","email":"soldulcetlabs@gmail.com"}],"readme":"# SugLink\n\n**DULCET LABS INTERNAL PACKAGE**\n\n⚠️ **IMPORTANT: PERMISSION REQUIRED FOR USE** ⚠️\n\nThis software requires explicit written permission from Dulcet Labs before any commercial use, including but not limited to production deployment, incorporation into commercial products, or use by competing businesses.\n\nSugLink is an internal Dulcet Labs library that enables easy onboarding and **multi-chain wallet creation** using existing social accounts (Google, TikTok, and Snapchat). It provides a seamless way to generate deterministic keypairs for **Solana, Sui and EVM blockchains** based on social accounts.\n\n## Features\n\n- **Multi-Chain Support**: Generate wallets for **Solana**, **Sui** and **EVM** blockchains from the same social login\n- **App-Specific Wallet Isolation**: Each app gets unique wallets for the same user via `appId` parameter\n- **Chain Selection**: Choose `\"solana\"`, `\"sui\"`, `\"evm\"`, or `\"all\"` chains during login\n- **Universal Compatibility**: Works seamlessly in both Node.js and browser environments using Web Crypto API and native crypto modules\n- **Social Login Integration**: Full Google OAuth support, with TikTok and Snapchat in development\n- **Deterministic Keypair Generation**: Generates blockchain keypairs based on social credentials using universal crypto implementations\n- **EVM Support**: Generates secp256k1 accounts with EIP-55 checksummed addresses — works on any EVM chain (Arc, Base, Ethereum, ...)\n- **Backward Compatibility**: Existing Solana-only implementations continue to work without changes\n- **Secure OAuth Flow Handling**: Manages OAuth securely with CSRF protection and environment variable support\n- **TypeScript Support**: Includes TypeScript definitions for better development experience\n- **Dual Module Support**: Compatible with both ESM and CommonJS\n- **Browser Ready**: Automatically detects environment and uses appropriate crypto APIs (Web Crypto API in browsers, Node.js crypto in server)\n\n## Universal Compatibility\n\nSugLink works in **all JavaScript environments**:\n\n### ✅ **Node.js Applications**\n\n- Uses native Node.js `crypto` module for maximum performance\n- Environment variables supported via `dotenv`\n- Full OAuth server implementation\n\n### ✅ **Browser Applications**\n\n- Uses Web Crypto API for secure operations\n- Works with React, Vue, Angular, vanilla JavaScript\n- Compatible with all modern bundlers (Webpack, Vite, Rollup)\n- No Node.js dependencies in browser builds\n\n### ✅ **React Native**\n\n- Universal crypto implementation ensures compatibility\n- Same API across all platforms\n\n### 🔧 **Environment Detection**\n\nSugLink automatically detects the runtime environment and uses the appropriate crypto implementation:\n\n- **Browsers**: Web Crypto API (`window.crypto.subtle`)\n- **Node.js**: Native crypto module (`require('crypto')`)\n- **Buffer**: Universal Buffer polyfill for browser compatibility\n\n## Installation\n\nInstall the package using npm, yarn, or pnpm:\n\n```bash\n# Using npm\nnpm install @dulcetlabs/suglink @solana/web3.js\n\n# For Sui support (optional)\nnpm install @mysten/sui\n\n# Using yarn\nyarn add @dulcetlabs/suglink @solana/web3.js @mysten/sui\n\n# Using pnpm\npnpm add @dulcetlabs/suglink @solana/web3.js @mysten/sui\n```\n\n### Browser Setup Notes\n\nFor browser applications, modern bundlers automatically handle the universal compatibility:\n\n- **Webpack**: Automatically polyfills Node.js modules\n- **Vite**: Built-in support for universal packages\n- **Create React App**: Works out of the box\n- **Next.js**: Full compatibility in both SSR and client-side\n\n**No additional configuration required!** SugLink automatically detects the browser environment and uses Web Crypto API.\n\n## Setup\n\n### Environment Variables\n\nCreate a `.env` file in your project root and add your OAuth credentials:\n\n```env\n# Google OAuth Configuration\nGOOGLE_CLIENT_ID=your_google_client_id\nGOOGLE_CLIENT_SECRET=your_google_client_secret\nGOOGLE_REDIRECT_URI=your_redirect_uri\n\n# TikTok OAuth Configuration\nTIKTOK_CLIENT_ID=your_tiktok_client_id\nTIKTOK_CLIENT_SECRET=your_tiktok_client_secret\nTIKTOK_REDIRECT_URI=your_redirect_uri\n\n# Snapchat OAuth Configuration\nSNAPCHAT_CLIENT_ID=your_snapchat_client_id\nSNAPCHAT_CLIENT_SECRET=your_snapchat_client_secret\nSNAPCHAT_REDIRECT_URI=your_redirect_uri\n```\n\n### Loading Environment Variables\n\nEnsure that the `dotenv` package is used to load these variables:\n\n```typescript\nimport * as dotenv from \"dotenv\";\n\n// Load environment variables from .env file\ndotenv.config();\n```\n\n## Usage\n\n### React Application Example\n\n```typescript\nimport React, { useState, useEffect } from \"react\";\nimport { SugLink } from \"@dulcetlabs/suglink\";\n\nconst App = () => {\n  const [publicKey, setPublicKey] = useState<string | null>(null);\n  const [isLoading, setIsLoading] = useState(false);\n  const sugLink = new SugLink();\n\n  // Handle OAuth callback\n  useEffect(() => {\n    const handleCallback = async () => {\n      const urlParams = new URLSearchParams(window.location.search);\n      const code = urlParams.get(\"code\");\n      const state = urlParams.get(\"state\");\n      const expectedState = localStorage.getItem(\"oauth_state\");\n\n      if (code && state && expectedState) {\n        try {\n          setIsLoading(true);\n          await sugLink.handleCallback(\"google\", code, state, expectedState);\n          setPublicKey(sugLink.getPublicKey());\n          localStorage.removeItem(\"oauth_state\");\n          // Clean up URL\n          window.history.replaceState(\n            {},\n            document.title,\n            window.location.pathname\n          );\n        } catch (error) {\n          console.error(\"Login failed:\", error);\n        } finally {\n          setIsLoading(false);\n        }\n      }\n    };\n\n    handleCallback();\n  }, []);\n\n  const handleLogin = async (platform: \"google\") => {\n    try {\n      const state = await sugLink.generateState();\n      localStorage.setItem(\"oauth_state\", state);\n      const authUrl = sugLink.getAuthUrl(platform, state);\n      window.location.href = authUrl;\n    } catch (error) {\n      console.error(\"Failed to initiate login:\", error);\n    }\n  };\n\n  const handleLogout = () => {\n    sugLink.logout();\n    setPublicKey(null);\n  };\n\n  if (isLoading) return <div>Logging in...</div>;\n\n  return (\n    <div>\n      {!publicKey ? (\n        <button onClick={() => handleLogin(\"google\")}>Login with Google</button>\n      ) : (\n        <div>\n          <p>Public Key: {publicKey}</p>\n          <button onClick={handleLogout}>Logout</button>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default App;\n```\n\n### Multi-Chain Support Example\n\n```typescript\nimport React, { useState } from \"react\";\nimport { SugLink } from \"@dulcetlabs/suglink\";\nimport { Keypair } from \"@solana/web3.js\";\n\nconst MultiChainApp = () => {\n  const [wallets, setWallets] = useState<{\n    solana?: { publicKey: string; privateKey: Uint8Array };\n    sui?: { address: string; privateKey: string };\n  }>({});\n  const [selectedChain, setSelectedChain] = useState<\"solana\" | \"sui\" | \"all\">(\n    \"all\"\n  );\n  const sugLink = new SugLink();\n\n  const handleMultiChainLogin = async () => {\n    try {\n      const urlParams = new URLSearchParams(window.location.search);\n      const code = urlParams.get(\"code\");\n\n      if (!code) {\n        // Redirect to OAuth\n        const state = await sugLink.generateState();\n        localStorage.setItem(\"oauth_state\", state);\n        const authUrl = sugLink.getAuthUrl(\"google\", state);\n        window.location.href = authUrl;\n        return;\n      }\n\n      // Handle OAuth callback with multi-chain support\n      const result = await sugLink.login(\"google\", code, selectedChain);\n\n      if (typeof result === \"object\" && \"solana\" in result) {\n        // Multi-chain result\n        const walletData: typeof wallets = {};\n\n        if (result.solana) {\n          walletData.solana = {\n            publicKey: result.solana.publicKey,\n            privateKey: result.solana.privateKey,\n          };\n        }\n\n        if (result.sui) {\n          walletData.sui = {\n            address: result.sui.address,\n            privateKey: result.sui.privateKey,\n          };\n        }\n\n        setWallets(walletData);\n      } else {\n        // Legacy Solana-only result\n        const keypair = result as Keypair;\n        setWallets({\n          solana: {\n            publicKey: keypair.publicKey.toString(),\n            privateKey: keypair.secretKey,\n          },\n        });\n      }\n    } catch (error) {\n      console.error(\"Multi-chain login failed:\", error);\n    }\n  };\n\n  return (\n    <div>\n      <h2>Multi-Chain Wallet Generator</h2>\n\n      <div>\n        <label>\n          <input\n            type=\"radio\"\n            value=\"solana\"\n            checked={selectedChain === \"solana\"}\n            onChange={(e) => setSelectedChain(e.target.value as \"solana\")}\n          />\n          Solana Only\n        </label>\n        <label>\n          <input\n            type=\"radio\"\n            value=\"sui\"\n            checked={selectedChain === \"sui\"}\n            onChange={(e) => setSelectedChain(e.target.value as \"sui\")}\n          />\n          Sui Only\n        </label>\n        <label>\n          <input\n            type=\"radio\"\n            value=\"all\"\n            checked={selectedChain === \"all\"}\n            onChange={(e) => setSelectedChain(e.target.value as \"all\")}\n          />\n          Both Chains\n        </label>\n      </div>\n\n      <button onClick={handleMultiChainLogin}>\n        Generate{\" \"}\n        {selectedChain === \"all\" ? \"Multi-Chain\" : selectedChain.toUpperCase()}{\" \"}\n        Wallet\n      </button>\n\n      {wallets.solana && (\n        <div>\n          <h3>Solana Wallet</h3>\n          <p>\n            <strong>Public Key:</strong> {wallets.solana.publicKey}\n          </p>\n          <p>\n            <strong>Private Key:</strong> {wallets.solana.privateKey.length}{\" \"}\n            bytes\n          </p>\n        </div>\n      )}\n\n      {wallets.sui && (\n        <div>\n          <h3>Sui Wallet</h3>\n          <p>\n            <strong>Address:</strong> {wallets.sui.address}\n          </p>\n          <p>\n            <strong>Private Key:</strong> {wallets.sui.privateKey}\n          </p>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default MultiChainApp;\n```\n\n### App-Specific Wallet Isolation\n\n**Problem**: By default, the same user gets the same wallet across all apps using SugLink, which creates security and UX issues.\n\n**Solution**: Use the `appId` parameter to generate unique wallets per app while maintaining deterministic wallets within each app.\n\n```typescript\nimport { SugLink } from \"@dulcetlabs/suglink\";\n\nconst sugLink = new SugLink();\n\n// Each app should have a unique identifier\nconst ecommerceConfig = {\n  clientId: \"your-google-client-id\",\n  clientSecret: \"your-google-client-secret\", \n  redirectUri: \"http://localhost:3000/callback\",\n  appId: \"ecommerce-platform-v1\" // 🔑 Unique app identifier\n};\n\nconst gamingConfig = {\n  clientId: \"your-google-client-id\",\n  clientSecret: \"your-google-client-secret\",\n  redirectUri: \"http://localhost:3000/callback\", \n  appId: \"gaming-platform-v1\" // 🔑 Different app = different wallets\n};\n\n// Same user, different apps = different wallets\nconst ecommerceWallet = await sugLink.login(\"google\", authCode, \"solana\", ecommerceConfig);\nconst gamingWallet = await sugLink.login(\"google\", authCode, \"solana\", gamingConfig);\n\nconsole.log(\"E-commerce wallet:\", ecommerceWallet.solana?.publicKey);\nconsole.log(\"Gaming wallet:\", gamingWallet.solana?.publicKey);\n// ✅ These will be different addresses\n\n// Same app, same user = same wallet (deterministic)\nconst ecommerceWallet2 = await sugLink.login(\"google\", authCode, \"solana\", ecommerceConfig);\nconsole.log(\"Same app again:\", ecommerceWallet2.solana?.publicKey);\n// ✅ This will match ecommerceWallet.solana?.publicKey\n```\n\n#### Multi-Chain App Isolation\n\n```typescript\n// DeFi app gets unique wallets across both chains\nconst deFiConfig = {\n  clientId: \"defi-client-id\",\n  clientSecret: \"defi-client-secret\",\n  redirectUri: \"http://localhost:3000/callback\",\n  appId: \"defi-protocol-v2\"\n};\n\n// NFT marketplace gets different wallets for same user\nconst nftConfig = {\n  clientId: \"nft-client-id\", \n  clientSecret: \"nft-client-secret\",\n  redirectUri: \"http://localhost:3000/callback\",\n  appId: \"nft-marketplace-v1\"\n};\n\nconst deFiWallets = await sugLink.login(\"google\", authCode, \"all\", deFiConfig);\nconst nftWallets = await sugLink.login(\"google\", authCode, \"all\", nftConfig);\n\n// Different apps = different wallets on both chains\nconsole.log(\"DeFi Solana:\", deFiWallets.solana?.publicKey);\nconsole.log(\"DeFi Sui:\", deFiWallets.sui?.address);\nconsole.log(\"NFT Solana:\", nftWallets.solana?.publicKey);  // Different from DeFi\nconsole.log(\"NFT Sui:\", nftWallets.sui?.address);          // Different from DeFi\n```\n\n#### AppId Best Practices\n\n```typescript\n// ✅ Good appId examples\nconst configs = {\n  production: { appId: \"myapp-prod-v1\" },\n  staging: { appId: \"myapp-staging-v1\" },\n  development: { appId: \"myapp-dev-v1\" },\n  \n  // Different products\n  ecommerce: { appId: \"company-ecommerce-v1\" },\n  gaming: { appId: \"company-gaming-v1\" },\n  \n  // Versioning for migrations\n  legacy: { appId: \"myapp-v1\" },\n  current: { appId: \"myapp-v2\" }\n};\n\n// ❌ Avoid these patterns\nconst badConfigs = {\n  noAppId: {}, // Same wallet across all apps\n  dynamic: { appId: `user-${userId}` }, // Different per user\n  timestamp: { appId: Date.now().toString() } // Changes every time\n};\n```\n\n#### Backward Compatibility\n\n```typescript\n// Existing code without appId continues to work\nconst legacyConfig = {\n  clientId: \"client-id\",\n  clientSecret: \"client-secret\",\n  redirectUri: \"http://localhost:3000/callback\"\n  // No appId = uses legacy behavior\n};\n\nconst wallet = await sugLink.login(\"google\", authCode, \"solana\", legacyConfig);\n// ✅ Works exactly as before\n```\n\n### TypeScript Application Example\n\n```typescript\nimport { SugLink } from \"@dulcetlabs/suglink\";\n\nconst sugLink = new SugLink();\n\n// Step 1: Redirect user to OAuth provider\nasync function initiateLogin(platform: \"google\") {\n  const state = await sugLink.generateState();\n  // Store state for later verification\n  sessionStorage.setItem(\"oauth_state\", state);\n\n  const authUrl = sugLink.getAuthUrl(platform, state);\n  window.location.href = authUrl;\n}\n\n// Step 2: Handle OAuth callback\nasync function handleOAuthCallback() {\n  const urlParams = new URLSearchParams(window.location.search);\n  const code = urlParams.get(\"code\");\n  const receivedState = urlParams.get(\"state\");\n  const expectedState = sessionStorage.getItem(\"oauth_state\");\n\n  if (!code || !receivedState || !expectedState) {\n    throw new Error(\"Missing OAuth parameters\");\n  }\n\n  try {\n    await sugLink.handleCallback(\"google\", code, receivedState, expectedState);\n    const publicKey = sugLink.getPublicKey();\n    console.log(\"Public Key:\", publicKey);\n\n    // Clean up\n    sessionStorage.removeItem(\"oauth_state\");\n    return publicKey;\n  } catch (error) {\n    console.error(\"Error during login:\", error);\n    throw error;\n  }\n}\n\nfunction logout() {\n  sugLink.logout();\n  console.log(\"Logged out successfully\");\n}\n```\n\n### Plain HTML/JavaScript Example\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>SugLink Example</title>\n    <script type=\"module\">\n      import { SugLink } from \"./node_modules/@dulcetlabs/suglink/dist/esm/index.js\";\n\n      const sugLink = new SugLink();\n\n      async function handleLogin(platform, code) {\n        try {\n          await sugLink.login(platform, code);\n          const publicKey = sugLink.getPublicKey();\n          document.getElementById(\n            \"publicKey\"\n          ).innerText = `Public Key: ${publicKey}`;\n        } catch (error) {\n          console.error(\"Login failed:\", error);\n        }\n      }\n\n      window.handleLogin = handleLogin;\n    </script>\n  </head>\n  <body>\n    <button onclick=\"handleLogin('google', 'auth_code')\">\n      Login with Google\n    </button>\n    <button onclick=\"handleLogin('tiktok', 'auth_code')\">\n      Login with TikTok\n    </button>\n    <button onclick=\"handleLogin('snapchat', 'auth_code')\">\n      Login with Snapchat\n    </button>\n    <p id=\"publicKey\"></p>\n  </body>\n</html>\n```\n\n### Direct OAuth Configuration\n\nYou can also set the OAuth configuration directly in your code:\n\n```typescript\nimport { SugLink } from \"@dulcetlabs/suglink\";\n\nconst sugLink = new SugLink();\n\nconst customConfig = {\n  clientId: \"your_custom_client_id\",\n  clientSecret: \"your_custom_client_secret\",\n  redirectUri: \"your_custom_redirect_uri\",\n};\n\nasync function handleLogin(\n  platform: \"google\" | \"tiktok\" | \"snapchat\",\n  code: string\n) {\n  try {\n    const keypair = await sugLink.login(platform, code, customConfig);\n    console.log(\"Keypair generated:\", keypair.publicKey.toString());\n  } catch (error) {\n    console.error(\"Login failed:\", error);\n  }\n}\n```\n\n## Login Modes\n\nSugLink supports **4 different login modes** to accommodate different use cases and ensure backward compatibility:\n\n### 1. 🔄 **Legacy Mode** (Backward Compatible)\n\n```typescript\n// Existing code continues to work unchanged\nconst keypair = await sugLink.login(\"google\", code);\nconst keypair = await sugLink.login(\"google\", code, config);\n```\n\n- **Returns**: `Keypair` (Solana only)\n- **Use Case**: Existing applications that only need Solana\n- **Migration**: No code changes required\n\n### 2. 🟡 **Solana Only Mode** (New API)\n\n```typescript\n// Explicitly request Solana using new structured API\nconst result = await sugLink.login(\"google\", code, \"solana\");\nconsole.log(result.solana?.publicKey); // Solana wallet details\nconsole.log(result.sui); // undefined\n```\n\n- **Returns**: `{ solana: WalletInfo, sui?: undefined }`\n- **Use Case**: Solana-only apps using the new structured response\n- **Migration**: Update to use structured response format\n\n### 3. 🔵 **Sui Only Mode**\n\n```typescript\n// Generate only Sui wallet\nconst result = await sugLink.login(\"google\", code, \"sui\");\nconsole.log(result.sui?.address); // Sui wallet details\nconsole.log(result.solana); // undefined\n```\n\n- **Returns**: `{ solana?: undefined, sui: WalletInfo }`\n- **Use Case**: Sui-only applications\n- **Migration**: New applications targeting Sui blockchain\n\n### 4. 🟣 **EVM Only Mode**\n\n```typescript\n// Generate an EVM (secp256k1) account\nconst result = await sugLink.login(\"google\", code, \"evm\");\nconsole.log(result.evm?.address); // EIP-55 checksummed 0x address\nconsole.log(result.evm?.privateKey); // 0x-prefixed 32-byte hex\n```\n\n- **Returns**: `{ evm: WalletInfo }`\n- **Use Case**: EVM applications (Arc, Base, Ethereum, any EVM chain)\n- **Migration**: New applications targeting EVM chains\n\n### 5. 🌈 **Multi-Chain Mode** (All Chains)\n\n```typescript\n// Generate Solana, Sui and EVM accounts from one social login\nconst result = await sugLink.login(\"google\", code, \"all\");\nconsole.log(result.solana?.publicKey); // Solana wallet\nconsole.log(result.sui?.address); // Sui wallet\nconsole.log(result.evm?.address); // EVM account\n```\n\n- **Returns**: `{ solana: WalletInfo, sui: WalletInfo, evm: WalletInfo }`\n- **Use Case**: Multi-chain applications supporting all blockchains\n- **Migration**: Full multi-chain capability\n\n### 🔧 **Mode Detection**\n\nSugLink automatically detects which mode to use based on parameters:\n\n```typescript\n// Legacy mode: 2 or 3 parameters, third is config object\nawait sugLink.login(\"google\", code);\nawait sugLink.login(\"google\", code, { clientId: \"...\" });\n\n// Multi-chain mode: 3+ parameters, third is chain selector string\nawait sugLink.login(\"google\", code, \"solana\");\nawait sugLink.login(\"google\", code, \"sui\", config);\nawait sugLink.login(\"google\", code, \"evm\", config);\nawait sugLink.login(\"google\", code, \"all\", config);\n```\n\n## API Reference\n\n### `SugLink` Class\n\n#### Constructor\n\n```typescript\nnew SugLink();\n```\n\n#### Methods\n\n- **`getAuthUrl(platform, state?, config?)`**: Generates OAuth authorization URL for the specified platform.\n\n  - `platform`: 'google' (TikTok and Snapchat coming soon)\n  - `state`: Optional state parameter for CSRF protection (recommended)\n  - `config`: Optional OAuth configuration object\n  - Returns: string (authorization URL)\n\n- **`generateState()`**: Generates a secure random state parameter for CSRF protection.\n\n  - Returns: Promise<string> (32-character hex string)\n\n- **`login(platform, code, config?)`**: **[Legacy]** Logs in using social platform credentials and generates a Solana keypair.\n\n  - `platform`: 'google' (TikTok and Snapchat coming soon)\n  - `code`: OAuth authorization code\n  - `config`: Optional OAuth configuration object\n  - Returns: Promise<Keypair>\n\n- **`login(platform, code, chain, config?)`**: **[Multi-Chain]** Logs in and generates keypair(s) for specified blockchain(s).\n\n  - `platform`: 'google' (TikTok and Snapchat coming soon)\n  - `code`: OAuth authorization code\n  - `chain`: 'solana' | 'sui' | 'evm' | 'all' - which blockchain(s) to generate wallets for\n  - `config`: Optional OAuth configuration object\n  - Returns: Promise<MultiChainResult> where MultiChainResult contains:\n    - `solana?`: `{ keypair: Keypair, publicKey: string, privateKey: Uint8Array }`\n    - `sui?`: `{ keypair: SuiKeypairLike, address: string, privateKey: string }`\n    - `evm?`: `{ account: EvmAccountLike, address: string, privateKey: string }`\n\n- **`handleCallback(platform, code, receivedState?, expectedState?, config?)`**: Handles OAuth callback with state validation.\n\n  - `platform`: 'google' (TikTok and Snapchat coming soon)\n  - `code`: OAuth authorization code from callback\n  - `receivedState`: State parameter from OAuth callback\n  - `expectedState`: Expected state value for CSRF protection\n  - `config`: Optional OAuth configuration object\n  - Returns: Promise<Keypair> (legacy Solana-only)\n\n#### Solana Methods\n\n- **`getKeypair()`**: Returns the current Solana keypair.\n\n  - Returns: Keypair\n  - Throws: Error if no keypair available\n\n- **`getPublicKey()`**: Returns the Solana public key as a base-58 string.\n\n  - Returns: string\n  - Throws: Error if no keypair available\n\n- **`getPrivateKey()`**: Returns the Solana private key as a Uint8Array.\n\n  - Returns: Uint8Array\n  - Throws: Error if no keypair available\n\n#### Sui Methods\n\n- **`getSuiKeypair()`**: Returns the current Sui keypair (if generated via multi-chain login).\n\n  - Returns: SuiKeypairLike\n  - Throws: Error if Sui keypair hasn't been generated\n\n- **`getSuiAddress()`**: Returns the Sui address as a 0x-prefixed string.\n\n  - Returns: string (e.g., \"0x4779c70ab11c82f7724c63be8868663e210a79cc3f430e5dbc4ae4793761323d\")\n  - Throws: Error if Sui keypair hasn't been generated\n\n- **`getSuiPrivateKey()`**: Returns the Sui private key in Bech32 format.\n\n  - Returns: string (e.g., \"suiprivkey1qp9757x3gu64cfyxquyx73t7h7nzcmhk7nr55zwzv0whfsa4yffcvfntxfe\")\n  - Throws: Error if Sui keypair hasn't been generated\n\n#### General Methods\n\n- **`logout()`**: Clears all current keypairs, effectively logging out.\n  - Returns: void\n\n### `SuiUtils` Class\n\nUtility class for Sui blockchain operations, available as a standalone import:\n\n```typescript\nimport { SuiUtils } from \"@dulcetlabs/suglink\";\n```\n\n#### Static Methods\n\n- **`createKeypairFromSeed(seed)`**: Creates a Sui Ed25519 keypair from seed.\n\n  - `seed`: Buffer (32+ bytes, will use first 32 bytes)\n  - Returns: Promise<SuiKeypairLike>\n\n- **`getSuiAddress(keypair)`**: Extracts Sui address from keypair.\n\n  - `keypair`: SuiKeypairLike\n  - Returns: string (0x-prefixed address)\n\n- **`getSuiPrivateKeyBytes(keypair)`**: Extracts raw private key bytes.\n\n  - `keypair`: SuiKeypairLike\n  - Returns: Uint8Array (32 bytes for Ed25519)\n\n- **`exportSuiKeypair(keypair)`**: Exports keypair in official Sui format.\n\n  - `keypair`: SuiKeypairLike\n  - Returns: `{ privateKey: string, schema: string }`\n\n#### Example Usage\n\n```typescript\nimport { SuiUtils } from \"@dulcetlabs/suglink\";\nimport { Buffer } from \"buffer\";\n\n// Create keypair from seed\nconst seed = Buffer.from(\"your_32_byte_seed_here\");\nconst keypair = await SuiUtils.createKeypairFromSeed(seed);\n\n// Get address and private key\nconst address = SuiUtils.getSuiAddress(keypair);\nconst { privateKey } = SuiUtils.exportSuiKeypair(keypair);\n\nconsole.log(\"Address:\", address);\nconsole.log(\"Private Key:\", privateKey);\n```\n\n## Security Considerations\n\n- Never expose your OAuth client secrets in client-side code.\n- Always use environment variables for sensitive configuration.\n- Implement proper OAuth flow with state verification.\n- Store keypairs securely and never expose private keys.\n- Use HTTPS for all OAuth redirects.\n- Implement proper session management.\n\n## License\n\nThis package is provided under the MIT License with Commons Clause.\n\n### Usage Requirements\n\n- **Permission Required**: You MUST obtain explicit written permission from Dulcet Labs before using the software in production environments or incorporating it into commercial products.\n\n## Support\n\nFor support, please open an issue in the GitHub repository or contact the maintainers.\n\n## Platform Support\n\n### Social Login Platforms\n\nSugLink currently supports:\n\n- **Google** ✅ (Fully implemented with ID token verification)\n- **TikTok** 🚧 (In development - OAuth endpoints configured)\n- **Snapchat** 🚧 (In development - OAuth endpoints configured)\n\nEach platform requires its own OAuth credentials and proper setup in their respective developer consoles.\n\n### Blockchain Support\n\nSugLink supports multiple blockchains:\n\n- **Solana** ✅ (Fully implemented with Ed25519 keypairs)\n- **Sui** ✅ (Fully implemented with Ed25519 keypairs and proper address derivation)\n\nBoth blockchains use the same deterministic seed generation, ensuring that the same social login produces consistent wallet addresses across chains.\n\n## What's New in v0.1.0\n\n### � **Multi-Chain Support**\n\n- **Sui Blockchain Integration**: Generate Sui wallets alongside Solana wallets from the same social login\n- **Chain Selection**: Choose `\"solana\"`, `\"sui\"`, or `\"all\"` during login\n- **Backward Compatibility**: Existing Solana-only code continues to work without changes\n- **SuiUtils Class**: Standalone utility class for Sui keypair operations\n\n### 🔧 **Multi-Chain API**\n\n```typescript\n// Generate wallets for both chains\nconst result = await sugLink.login(\"google\", code, \"all\");\nconsole.log(\"Solana:\", result.solana?.publicKey);\nconsole.log(\"Sui:\", result.sui?.address);\n\n// Chain-specific generation\nconst solanaOnly = await sugLink.login(\"google\", code, \"solana\");\nconst suiOnly = await sugLink.login(\"google\", code, \"sui\");\n\n// Legacy support (still works)\nconst keypair = await sugLink.login(\"google\", code); // Returns Solana Keypair\n```\n\n### 💎 **Sui Integration Features**\n\n- **Ed25519 Keypairs**: Uses official Sui SDK Ed25519 implementation\n- **Proper Address Format**: 0x-prefixed 64-character addresses\n- **Bech32 Private Keys**: suiprivkey1... format for compatibility\n- **Deterministic Generation**: Same social login = same wallet addresses across chains\n\n### �🌐 **Universal Compatibility**\n\n- **Browser Support**: Full compatibility with all modern browsers using Web Crypto API\n- **Node.js Support**: Optimized performance using native Node.js crypto module\n- **Automatic Detection**: Seamlessly switches between environments without configuration\n\n### 🔧 **Breaking Changes**\n\n- **`generateState()` is now async**: Updated to use secure random generation across all environments\n\n  ```typescript\n  // Old (v0.0.x)\n  const state = sugLink.generateState();\n\n  // New (v0.1.0+)\n  const state = await sugLink.generateState();\n  ```\n\n### 🚀 **Technical Improvements**\n\n- **Universal Crypto**: Uses Web Crypto API in browsers, Node.js crypto in server environments\n- **Buffer Polyfill**: Automatic Buffer support for browser compatibility\n- **Enhanced Security**: Cryptographically secure random generation in all environments\n- **Optional Dependencies**: Sui SDK is optional - only required when using Sui features\n\n## Potential Improvements\n\n- **Enhanced Key Generation**: Add salt to the `buildTimeKey` generation process for additional security.\n- **Network Security**: Add timeout settings for axios POST requests to prevent hanging connections.\n- **Type Safety and Validation**: Implement TypeScript strict null checks for better type safety.\n- **Keypair Verification**: Add methods to verify keypair generation correctness.\n- **Error Handling**: Enhance error messages with more detailed information.\n\nThese improvements are planned for future releases. Contributions are welcome!\n","readmeFilename":"README.md"}