{"_id":"@algopayoracle/oracle-sdk","_rev":"6-207fee7481a51e945abdef95f7c796ef","name":"@algopayoracle/oracle-sdk","dist-tags":{"latest":"1.0.6"},"versions":{"1.0.0":{"name":"@algopayoracle/oracle-sdk","version":"1.0.0","keywords":["algorand","oracle","payments","upi","razorpay","web3","blockchain","ed25519","smart-contract"],"author":{"name":"AlgoPay Oracle"},"license":"MIT","_id":"@algopayoracle/oracle-sdk@1.0.0","maintainers":[{"name":"viper3775","email":"kalburgipratham@gmail.com"}],"homepage":"https://github.com/your-org/algopay-oracle-sdk#readme","bugs":{"url":"https://github.com/your-org/algopay-oracle-sdk/issues"},"dist":{"shasum":"07de4a88b12022637d9749f09c279cff76770d26","tarball":"https://registry.npmjs.org/@algopayoracle/oracle-sdk/-/oracle-sdk-1.0.0.tgz","fileCount":16,"integrity":"sha512-kQFg7S5o/QkFnLppVwfOEVsGcFAjjypSq+whHWOGttPWsvF+iEkHD5oLTuJ5UGCM14Hu87zuyi0O7Dqx7/IKLA==","signatures":[{"sig":"MEUCIB98doV/BY/JB/5wfpqyRxxZZsINbkkBdVpPH9TX026+AiEA93mkW4uzj4osZxQvttAdyaPzPytbYH7mGHdwvxbwysY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83138},"main":"src/index.js","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./src/index.d.ts","require":"./src/index.js"},"./errors":{"require":"./src/errors.js"},"./validate":{"require":"./src/validate.js"}},"gitHead":"ab58650d5b1905f6ca87705f64fcd5b23c388e72","scripts":{"lint":"node --check src/index.js src/AlgoPayClient.js src/OracleSigner.js","test":"node --test examples/quickstart.js","example":"node examples/express-webhook.js","test:unit":"node --test","prepublishOnly":"node --check src/index.js && echo 'Pre-publish checks passed'","test:integration":"ALGO_NETWORK=localnet node --test"},"_npmUser":{"name":"viper3775","email":"kalburgipratham@gmail.com"},"repository":{"url":"git+https://github.com/your-org/algopay-oracle-sdk.git","type":"git"},"_npmVersion":"11.12.1","description":"Programmable payment oracle SDK — bridge fiat payments to Algorand smart contracts","directories":{},"_nodeVersion":"22.17.1","_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.0.0","algosdk":"^3.0.0","express":"^4.18.0","express-rate-limit":"^7.0.0"},"peerDependencies":{"algosdk":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oracle-sdk_1.0.0_1778929614769_0.9661019201403607","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@algopayoracle/oracle-sdk","version":"1.0.1","keywords":["algorand","oracle","payments","upi","razorpay","web3","blockchain","ed25519","smart-contract"],"author":{"name":"AlgoPay Oracle"},"license":"MIT","_id":"@algopayoracle/oracle-sdk@1.0.1","maintainers":[{"name":"viper3775","email":"kalburgipratham@gmail.com"}],"homepage":"https://github.com/PrathamKalburgi/AlgoPay-Oracle#readme","bugs":{"url":"https://github.com/PrathamKalburgi/AlgoPay-Oracle/issues"},"dist":{"shasum":"bbb7a00e12cbd4569effcb1d834ce023b6035780","tarball":"https://registry.npmjs.org/@algopayoracle/oracle-sdk/-/oracle-sdk-1.0.1.tgz","fileCount":16,"integrity":"sha512-v4GBY2p4Hnt+Ch+rm+T8VyhpYkM7tMxZZihNWoM4zcIJRyKHsq3RjiXfgC5mWZaaE9iabxamP6ySZNURdyWw6g==","signatures":[{"sig":"MEYCIQD/BHc9jdkdVZSDhc1YMDG9R3ydE0HSlZOECJQzwbTHAQIhAJ6rlh95fZhxha7+U9/ej79yMtkE+jYrpeqbtnEA9LqA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83212},"main":"src/index.js","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./src/index.d.ts","require":"./src/index.js"},"./errors":{"require":"./src/errors.js"},"./validate":{"require":"./src/validate.js"}},"gitHead":"ab58650d5b1905f6ca87705f64fcd5b23c388e72","scripts":{"lint":"node --check src/index.js src/AlgoPayClient.js src/OracleSigner.js","test":"node --test examples/quickstart.js","example":"node examples/express-webhook.js","test:unit":"node --test","prepublishOnly":"node --check src/index.js && echo 'Pre-publish checks passed'","test:integration":"ALGO_NETWORK=localnet node --test"},"_npmUser":{"name":"viper3775","email":"kalburgipratham@gmail.com"},"repository":{"url":"git+https://github.com/PrathamKalburgi/AlgoPay-Oracle.git","type":"git"},"_npmVersion":"11.12.1","description":"Programmable payment oracle SDK — bridge fiat payments to Algorand smart contracts","directories":{},"_nodeVersion":"22.17.1","_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.0.0","algosdk":"^3.0.0","express":"^4.18.0","express-rate-limit":"^7.0.0"},"peerDependencies":{"algosdk":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oracle-sdk_1.0.1_1778930198217_0.9011360704679583","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@algopayoracle/oracle-sdk","version":"1.0.3","keywords":["algorand","oracle","payments","upi","razorpay","web3","blockchain","ed25519","smart-contract"],"author":{"name":"AlgoPay Oracle"},"license":"MIT","_id":"@algopayoracle/oracle-sdk@1.0.3","maintainers":[{"name":"viper3775","email":"kalburgipratham@gmail.com"}],"homepage":"https://github.com/PrathamKalburgi/AlgoPay-Oracle#readme","bugs":{"url":"https://github.com/PrathamKalburgi/AlgoPay-Oracle/issues"},"dist":{"shasum":"29ad34ec141792cb73c6743a6fe927f6d9e4d431","tarball":"https://registry.npmjs.org/@algopayoracle/oracle-sdk/-/oracle-sdk-1.0.3.tgz","fileCount":19,"integrity":"sha512-Mojv8jN7ZD4qtU15gd9GA9dJ9qMoUAHG9hSM8EA3t44tAksKGRBY1FFxTHVO8hTOugnjyFyAjSvroesEClYclA==","signatures":[{"sig":"MEYCIQCgJ5FISKw8BB4LrJJHPHRIAKbPqY2mBxRyVV0iPJ+jOgIhAI41yU1Wij1H5OHYjGfQOg6JbPHka7CQa3FsyaOJjqJk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112544},"main":"src/index.js","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./src/index.d.ts","require":"./src/index.js"},"./errors":{"require":"./src/errors.js"},"./validate":{"require":"./src/validate.js"}},"gitHead":"ab58650d5b1905f6ca87705f64fcd5b23c388e72","scripts":{"lint":"node --check src/index.js src/AlgoPayClient.js src/OracleSigner.js","test":"node --test examples/quickstart.js","example":"node examples/express-webhook.js","test:unit":"node --test","prepublishOnly":"node --check src/index.js && echo 'Pre-publish checks passed'","test:integration":"ALGO_NETWORK=localnet node --test"},"_npmUser":{"name":"viper3775","email":"kalburgipratham@gmail.com"},"repository":{"url":"git+https://github.com/PrathamKalburgi/AlgoPay-Oracle.git","type":"git"},"_npmVersion":"11.12.1","description":"Programmable payment oracle SDK — bridge fiat payments to Algorand smart contracts","directories":{},"_nodeVersion":"22.17.1","_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.0.0","algosdk":"^3.0.0","express":"^4.18.0","express-rate-limit":"^7.0.0"},"peerDependencies":{"algosdk":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oracle-sdk_1.0.3_1778948895413_0.4471138327786788","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@algopayoracle/oracle-sdk","version":"1.0.4","keywords":["algorand","oracle","payments","upi","razorpay","web3","blockchain","ed25519","smart-contract"],"author":{"name":"AlgoPay Oracle"},"license":"MIT","_id":"@algopayoracle/oracle-sdk@1.0.4","maintainers":[{"name":"viper3775","email":"kalburgipratham@gmail.com"}],"homepage":"https://github.com/PrathamKalburgi/AlgoPay-Oracle#readme","bugs":{"url":"https://github.com/PrathamKalburgi/AlgoPay-Oracle/issues"},"dist":{"shasum":"aa5f089fa918972956e60ddf38b4cd951dc0db71","tarball":"https://registry.npmjs.org/@algopayoracle/oracle-sdk/-/oracle-sdk-1.0.4.tgz","fileCount":19,"integrity":"sha512-jVpAeZawYva1AXNW8kAVr5p7sy2bkBGdaGcMCC8SJe72PRvN5nyIHW/zf/utFUGL4j0eVyb72W1EkMb80xaCeA==","signatures":[{"sig":"MEUCIQCXOUBL+4v6spLNK97kbMW6LH2MNlDTyxISzPwplXszqwIgHPFxler8zcprFViLL2Iajex7LvcitFxe1mOBB9BXIgg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112549},"main":"src/index.js","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./src/index.d.ts","require":"./src/index.js"},"./errors":{"require":"./src/errors.js"},"./validate":{"require":"./src/validate.js"}},"gitHead":"ab58650d5b1905f6ca87705f64fcd5b23c388e72","scripts":{"lint":"node --check src/index.js src/AlgoPayClient.js src/OracleSigner.js","test":"node --test examples/quickstart.js","example":"node examples/express-webhook.js","test:unit":"node --test","prepublishOnly":"node --check src/index.js && echo 'Pre-publish checks passed'","test:integration":"ALGO_NETWORK=localnet node --test"},"_npmUser":{"name":"viper3775","email":"kalburgipratham@gmail.com"},"repository":{"url":"git+https://github.com/PrathamKalburgi/AlgoPay-Oracle.git","type":"git"},"_npmVersion":"11.12.1","description":"Programmable payment oracle SDK — bridge fiat payments to Algorand smart contracts","directories":{},"_nodeVersion":"22.17.1","_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.0.0","algosdk":"^3.0.0","express":"^4.18.0","express-rate-limit":"^7.0.0"},"peerDependencies":{"algosdk":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oracle-sdk_1.0.4_1778950050770_0.9325627924662458","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@algopayoracle/oracle-sdk","version":"1.0.5","keywords":["algorand","oracle","payments","upi","razorpay","web3","blockchain","ed25519","smart-contract"],"author":{"name":"AlgoPay Oracle"},"license":"MIT","_id":"@algopayoracle/oracle-sdk@1.0.5","maintainers":[{"name":"viper3775","email":"kalburgipratham@gmail.com"}],"homepage":"https://github.com/PrathamKalburgi/AlgoPay-Oracle#readme","bugs":{"url":"https://github.com/PrathamKalburgi/AlgoPay-Oracle/issues"},"dist":{"shasum":"d593930dd5255b710aea475242bfac5c4389b73d","tarball":"https://registry.npmjs.org/@algopayoracle/oracle-sdk/-/oracle-sdk-1.0.5.tgz","fileCount":19,"integrity":"sha512-1MgJjwUph9t4gBEV00PxtujnB0ecqHN7/9dlk5HlyVBhsJlzHcGxltG3EEV/3aLLotEfe0wVbkjrrDBvKD9AHA==","signatures":[{"sig":"MEUCIEwcQnON8zrYheAiKs2z08L/phZyZIvFP7WYu0ymWFqVAiEAl/Z8mF6aId1ypY/0oYeY4McnEjWtqYgGdbJ2tQ+r2bQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112749},"main":"src/index.js","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./src/index.d.ts","require":"./src/index.js"},"./errors":{"require":"./src/errors.js"},"./validate":{"require":"./src/validate.js"}},"gitHead":"ab58650d5b1905f6ca87705f64fcd5b23c388e72","scripts":{"lint":"node --check src/index.js src/AlgoPayClient.js src/OracleSigner.js","test":"node --test examples/quickstart.js","example":"node examples/express-webhook.js","test:unit":"node --test","prepublishOnly":"node --check src/index.js && echo 'Pre-publish checks passed'","test:integration":"ALGO_NETWORK=localnet node --test"},"_npmUser":{"name":"viper3775","email":"kalburgipratham@gmail.com"},"repository":{"url":"git+https://github.com/PrathamKalburgi/AlgoPay-Oracle.git","type":"git"},"_npmVersion":"11.12.1","description":"Programmable payment oracle SDK — bridge fiat payments to Algorand smart contracts","directories":{},"_nodeVersion":"22.17.1","_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.0.0","algosdk":"^3.0.0","express":"^4.18.0","express-rate-limit":"^7.0.0"},"peerDependencies":{"algosdk":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oracle-sdk_1.0.5_1778992428278_0.4956361409003647","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@algopayoracle/oracle-sdk","version":"1.0.6","description":"Programmable payment oracle SDK — bridge fiat payments to Algorand smart contracts","main":"src/index.js","bin":{"algopay":"bin/algopay.js"},"scripts":{"test":"node --test examples/quickstart.js","test:unit":"node --test","test:integration":"ALGO_NETWORK=localnet node --test","example":"node examples/quickstart.js","example:webhook":"node examples/express-webhook.js","lint":"node --check src/index.js src/AlgoPayClient.js src/OracleSigner.js","prepublishOnly":"node --check src/index.js && echo 'Pre-publish checks passed'"},"keywords":["algorand","oracle","payments","upi","razorpay","web3","blockchain","ed25519","smart-contract"],"author":{"name":"AlgoPay Oracle"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/PrathamKalburgi/AlgoPay-Oracle.git"},"homepage":"https://github.com/PrathamKalburgi/AlgoPay-Oracle#readme","peerDependencies":{"algosdk":">=3.0.0"},"devDependencies":{"algosdk":"^3.0.0","express":"^4.18.0","express-rate-limit":"^7.0.0","dotenv":"^16.0.0"},"engines":{"node":">=18.0.0"},"types":"src/index.d.ts","exports":{".":{"require":"./src/index.js","types":"./src/index.d.ts"},"./validate":{"require":"./src/validate.js"},"./errors":{"require":"./src/errors.js"}},"gitHead":"65610fdd97f1d42470c6965ab42e40b3c91331df","_id":"@algopayoracle/oracle-sdk@1.0.6","bugs":{"url":"https://github.com/PrathamKalburgi/AlgoPay-Oracle/issues"},"_nodeVersion":"22.17.1","_npmVersion":"11.12.1","dist":{"integrity":"sha512-N4DcuWo9gjVCp7knS/EiYugz63ly2CrGOREM5aVxe2aqOqIoa8OeeYe3riuyiCta6glgGgTp/fvcQvdcjkAg4A==","shasum":"0a374f660f4ed3f73cd0ec6692db9c764e5d0476","tarball":"https://registry.npmjs.org/@algopayoracle/oracle-sdk/-/oracle-sdk-1.0.6.tgz","fileCount":20,"unpackedSize":117376,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIG3SBDrZ01oKdqXE5cZBuKsrY06wcannhfuJQxeq5UFHAiBOQdKRMdQWNnpVmQRrl8PiKXYTuHx6t5CluniUajd1sg=="}]},"_npmUser":{"name":"viper3775","email":"kalburgipratham@gmail.com"},"directories":{},"maintainers":[{"name":"viper3775","email":"kalburgipratham@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/oracle-sdk_1.0.6_1780069673342_0.6195423582221908"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-16T11:06:54.683Z","modified":"2026-05-29T15:47:53.598Z","1.0.0":"2026-05-16T11:06:54.913Z","1.0.1":"2026-05-16T11:16:38.347Z","1.0.3":"2026-05-16T16:28:15.567Z","1.0.4":"2026-05-16T16:47:30.916Z","1.0.5":"2026-05-17T04:33:48.408Z","1.0.6":"2026-05-29T15:47:53.481Z"},"bugs":{"url":"https://github.com/PrathamKalburgi/AlgoPay-Oracle/issues"},"author":{"name":"AlgoPay Oracle"},"license":"MIT","homepage":"https://github.com/PrathamKalburgi/AlgoPay-Oracle#readme","keywords":["algorand","oracle","payments","upi","razorpay","web3","blockchain","ed25519","smart-contract"],"repository":{"type":"git","url":"git+https://github.com/PrathamKalburgi/AlgoPay-Oracle.git"},"description":"Programmable payment oracle SDK — bridge fiat payments to Algorand smart contracts","maintainers":[{"name":"viper3775","email":"kalburgipratham@gmail.com"}],"readme":"# @algopayoracle/oracle-sdk\r\n\r\n**Programmable payment oracle for Algorand.**  \r\nBridge any fiat payment to an on-chain action — verified by Ed25519 signature, enforced by smart contract.\r\n\r\n```bash\r\nnpm install @algopayoracle/oracle-sdk\r\n```\r\n\r\n---\r\n\r\n## What it does\r\n\r\nWhen a user pays via UPI, Razorpay, Stripe, or any other gateway, your backend receives a payment event. This SDK signs that event with an oracle key, submits it to an Algorand smart contract, and the contract independently verifies the signature before executing any action.\r\n\r\n**The contract does not trust your backend. It only trusts the cryptographic proof.**\r\n\r\n```\r\nPayment Gateway → Webhook → Oracle Signs → Algorand Contract → Action Executed\r\n```\r\n\r\n---\r\n\r\n## Quickstart\r\n\r\n### 30-Second Path — See a live APC-1 proof on TestNet\r\n\r\nNo integration needed. This generates a real oracle identity, signs an APC-1 credential, verifies it off-chain, anchors it on Algorand TestNet, and returns a live explorer link.\r\n\r\n**Linux / macOS**\r\n```bash\r\nnpm install @algopayoracle/oracle-sdk\r\nexport ORACLE_MNEMONIC=\"your 25 words\"\r\nnpx algopay quickstart\r\n```\r\n\r\n**Windows (PowerShell)**\r\n```powershell\r\nnpm install @algopayoracle/oracle-sdk\r\n$env:ORACLE_MNEMONIC=\"your 25 words\"\r\nnpx algopay quickstart\r\n```\r\n\r\nWhat it does, in order:\r\n1. Derives your oracle address and Ed25519 public key from the mnemonic\r\n2. Signs a test payment as an APC-1 credential\r\n3. Verifies the proof off-chain (no network required)\r\n4. Anchors the proof on Algorand TestNet\r\n5. Returns the confirmed transaction ID and a live Lora explorer link\r\n\r\n---\r\n\r\n## Quick Integration\r\n\r\n```js\r\nconst { AlgoPayClient } = require(\"@algopayoracle/oracle-sdk\");\r\n\r\nconst client = new AlgoPayClient({\r\n  mnemonic: process.env.ORACLE_MNEMONIC,\r\n  network:  \"testnet\",\r\n  appId:    Number(process.env.ALGO_APP_ID),\r\n});\r\n\r\n// Call this from any payment webhook — gateway-agnostic\r\nconst result = await client.verifyAndCommit({\r\n  payment_id: \"your_gateway_payment_id\",\r\n  amount:     100,\r\n  currency:   \"INR\",\r\n  action:     \"unlock\",\r\n  provider:   \"razorpay\",   // optional — enables namespaced replay protection\r\n});\r\n\r\nconsole.log(result.txId);        // confirmed Algorand transaction ID\r\nconsole.log(result.explorerUrl); // Lora explorer link\r\nconsole.log(result.apc1);        // APC-1 standardized credential\r\n```\r\n\r\n---\r\n\r\n## Core concepts\r\n\r\n### Payment-gateway agnostic\r\n\r\nThe oracle pipeline speaks `PaymentEvent`, not Razorpay or Stripe:\r\n\r\n```js\r\n// This shape works from any gateway\r\nconst event = {\r\n  payment_id: \"your_gateway_id\",\r\n  amount:     100,          // integer, base currency unit\r\n  currency:   \"INR\",        // ISO 4217\r\n  action:     \"unlock\",     // what to trigger on-chain\r\n  provider:   \"razorpay\",   // optional label\r\n};\r\n\r\nconst result = await client.verifyAndCommit(event);\r\n```\r\n\r\nAdapters handle gateway-specific signature verification and normalization.\r\nThe oracle and contract have zero gateway-specific code.\r\n\r\n### APC-1 — standardized payment credential\r\n\r\nEvery verified payment produces an APC-1 credential:\r\n\r\n```json\r\n{\r\n  \"apc\": \"1\",\r\n  \"payment_id\": \"pay_XXXXXXX\",\r\n  \"canonical_id\": \"razorpay:pay_XXXXXXX\",\r\n  \"amount\": XXX,\r\n  \"currency\": \"INR\",\r\n  \"action\": \"unlock\",\r\n  \"timestamp\": 1714500000,\r\n  \"oracle_address\": \"ABCDEF...\",\r\n  \"signature\": \"base64...\",\r\n  \"chain\": \"algorand\",\r\n  \"network\": \"testnet\",\r\n  \"app_id\": XXXXXXXXX,\r\n  \"provider\": \"razorpay\"\r\n}\r\n```\r\n\r\nAPC-1 proofs are self-contained and verifiable by anyone who knows the oracle's public key.\r\n\r\n### Trust model\r\n\r\n- Oracle's Ed25519 public key is registered in the contract at deploy time\r\n- The contract runs `ed25519verify_bare` on every call — no valid signature, no action\r\n- Multiple oracles can be registered (rotation without downtime)\r\n- `payment_id` box storage prevents replay attacks on-chain\r\n- Proofs are time-bound — valid for 5 minutes from signing\r\n\r\n---\r\n\r\n## API reference\r\n\r\n### `AlgoPayClient`\r\n\r\n#### Constructor\r\n\r\n```js\r\nnew AlgoPayClient({\r\n  mnemonic,          // required — 25-word oracle account mnemonic\r\n  network,           // \"localnet\" | \"testnet\" | \"mainnet\" (default: \"testnet\")\r\n  appId,             // deployed AlgoPayOracle App ID (null = anchor mode)\r\n  algod,             // optional — custom algosdk.Algodv2 instance\r\n  indexer,           // optional — custom algosdk.Indexer instance\r\n  explorerBase,      // optional — custom explorer URL\r\n})\r\n```\r\n\r\n#### `verifyAndCommit(payment)` → `Promise<Result>`\r\n\r\nSign and commit a payment proof to Algorand.\r\n\r\n```js\r\nconst result = await client.verifyAndCommit({\r\n  payment_id: \"pay_XXXXXXX\",\r\n  amount:     100,\r\n  currency:   \"INR\",\r\n  action:     \"unlock\",\r\n  provider:   \"razorpay\",\r\n});\r\n// result: { txId, proof, apc1, explorerUrl, verifyUrl, access_seconds }\r\n```\r\n\r\n#### `verifyProof(txId)` → `Promise<VerifyResult>`\r\n\r\nVerify a proof via the Algorand indexer.\r\n\r\n```js\r\nconst { valid, proof } = await client.verifyProof(\"TXID...\");\r\n```\r\n\r\n#### `verifyProofOffchain(proof)` → `VerifyResult`\r\n\r\nVerify a proof's Ed25519 signature without any network call.\r\n\r\n```js\r\nconst { valid } = client.verifyProofOffchain(result.proof);\r\n```\r\n\r\n#### Oracle rotation\r\n\r\n```js\r\nawait client.addOracle(\"ALGORAND_ADDRESS_OR_BASE64_PUBKEY\");  // creator only\r\nawait client.removeOracle(\"...\");                              // cannot remove last oracle\r\nconst registered = await client.isOracleRegistered(\"...\");\r\n\r\nconst total = await client.getTotalVerified();\r\nconst count = await client.getOracleCount();\r\n```\r\n\r\n---\r\n\r\n### `OracleSigner`\r\n\r\nPure Ed25519 signing — no network calls. Useful for offline signing and testing.\r\n\r\n```js\r\nconst { OracleSigner } = require(\"@algopayoracle/oracle-sdk\");\r\n\r\nconst signer = new OracleSigner(mnemonic);\r\n\r\nconsole.log(signer.getAddress());          // Algorand address\r\nconsole.log(signer.getPublicKeyBase64());  // paste into contract deploy\r\n\r\nconst proof = signer.sign({ payment_id, amount, action, currency, provider });\r\nconst valid = OracleSigner.verifyOffchain(proof);  // static, no network\r\n```\r\n\r\n---\r\n\r\n### `ProofVerifier`\r\n\r\n```js\r\nconst { ProofVerifier, createClients } = require(\"@algopayoracle/oracle-sdk\");\r\n\r\nconst { indexer } = createClients(\"testnet\");\r\nconst verifier    = new ProofVerifier({ indexer, network: \"testnet\" });\r\n\r\n// Single txId\r\nconst result = await verifier.verifyTxn(\"TXID...\", {\r\n  expectedOracleAddress: \"ABCDEF...\",  // optional — restrict to specific oracle\r\n  expectedAction:        \"unlock\",     // optional — restrict to specific action\r\n  maxAgeSecs:            300,          // optional — default 300\r\n});\r\n\r\n// Batch\r\nconst results = await verifier.verifyBatch([\"TXID1\", \"TXID2\", \"TXID3\"]);\r\n```\r\n\r\n---\r\n\r\n### Payment adapters\r\n\r\nAdapters are optional. You can normalize any gateway's webhook payload manually.\r\n\r\n#### Razorpay\r\n\r\n```js\r\nconst { RazorpayAdapter } = require(\"@algopayoracle/oracle-sdk\");\r\n\r\n// Share orderStore with the client to enforce server-side amounts\r\nconst orderStore = new Map();\r\nconst adapter = new RazorpayAdapter({\r\n  keyId:      process.env.RAZORPAY_KEY_ID,\r\n  keySecret:  process.env.RAZORPAY_KEY_SECRET,\r\n  orderStore,                                    // prevents client from spoofing amounts\r\n});\r\n\r\n// Server-side webhook\r\napp.post(\"/webhook/razorpay\", (req, res) => {\r\n  const event = adapter.parseWebhook(req.rawBody, req.headers[\"x-razorpay-signature\"]);\r\n  if (!event) return res.status(401).end();\r\n  const result = await client.verifyAndCommit(event);\r\n  res.json({ txId: result.txId });\r\n});\r\n\r\n// Create order (stores amount server-side)\r\nconst order = await adapter.createOrder({ amount: 100, currency: \"INR\" });\r\n\r\n// Client-side verification (amount taken from orderStore, not request body)\r\napp.post(\"/verify-payment\", (req, res) => {\r\n  const event = adapter.parseClientPayment({\r\n    razorpay_order_id:   req.body.razorpay_order_id,\r\n    razorpay_payment_id: req.body.razorpay_payment_id,\r\n    razorpay_signature:  req.body.razorpay_signature,\r\n    action:              \"unlock\",\r\n  });\r\n  const result = await client.verifyAndCommit(event);\r\n  res.json({ txId: result.txId });\r\n});\r\n```\r\n\r\n#### Stripe\r\n\r\n```js\r\nconst { StripeAdapter } = require(\"@algopayoracle/oracle-sdk\");\r\n// npm install stripe\r\n\r\nconst adapter = new StripeAdapter({\r\n  webhookSecret: process.env.STRIPE_WEBHOOK_SECRET,\r\n  secretKey:     process.env.STRIPE_SECRET_KEY,\r\n});\r\n\r\napp.post(\"/webhook/stripe\", (req, res) => {\r\n  const event = adapter.parseWebhook(req.rawBody, req.headers[\"stripe-signature\"]);\r\n  if (!event) return res.status(401).end();\r\n  const result = await client.verifyAndCommit(event);\r\n  res.json({ txId: result.txId });\r\n});\r\n```\r\n\r\n#### Custom gateway (any provider)\r\n\r\n```js\r\n// No adapter needed — normalize manually and call verifyAndCommit\r\napp.post(\"/webhook/payu\", async (req, res) => {\r\n  // Verify PayU's signature with their method\r\n  if (!verifyPayUSignature(req.rawBody, req.headers[\"x-payu-checksum\"])) {\r\n    return res.status(401).end();\r\n  }\r\n  const result = await client.verifyAndCommit({\r\n    payment_id: req.body.mihpayid,\r\n    amount:     Math.round(Number(req.body.amount)),\r\n    currency:   \"INR\",\r\n    action:     \"unlock\",\r\n    provider:   \"payu\",\r\n  });\r\n  res.json({ txId: result.txId });\r\n});\r\n```\r\n\r\n---\r\n\r\n## Contract deployment\r\n\r\n### 1. Get your oracle public key\r\n\r\n```bash\r\nnode -e \"\r\n  const { OracleSigner } = require('@algopayoracle/oracle-sdk');\r\n  const s = new OracleSigner(process.env.ORACLE_MNEMONIC);\r\n  console.log('Address:', s.getAddress());\r\n  console.log('Pubkey :', s.getPublicKeyBase64());\r\n\"\r\n```\r\n\r\n### 2. Compile the contract\r\n\r\n```bash\r\ncd contracts\r\nalgokit compile python AlgoPayOracle.py\r\n```\r\n\r\n### 3. Deploy via Lora\r\n\r\nOpen https://lora.algokit.io/testnet → App Lab → Create → upload the compiled ARC-32 JSON.\r\n\r\nWhen prompted for `create()` args, pass the oracle's 32-byte pubkey (base64-decoded).\r\n\r\n### 4. Fund the contract for box storage\r\n\r\nEach payment creates a box (~33 bytes) costing ~0.01109 ALGO.\r\nSend at least 0.1 ALGO to the contract address after deploy.\r\n\r\n### 5. Configure environment\r\n\r\n```env\r\nORACLE_MNEMONIC=your twenty five words here\r\nALGO_NETWORK=testnet\r\nALGO_APP_ID=XXXXXXXXX\r\nADMIN_API_KEY=your_secret_admin_key\r\nALLOWED_ORIGINS=https://yourdomain.com\r\nRAZORPAY_KEY_ID=rzp_test_xxx         # optional\r\nRAZORPAY_KEY_SECRET=your_secret      # optional\r\n```\r\n\r\n---\r\n\r\n## Network configuration\r\n\r\n### Built-in networks (AlgoNode, no API key required)\r\n\r\n| Network   | Algod                                  | Indexer                                 |\r\n|-----------|----------------------------------------|-----------------------------------------|\r\n| localnet  | http://localhost:4001                  | http://localhost:8980                   |\r\n| testnet   | https://testnet-api.algonode.cloud     | https://testnet-idx.algonode.cloud      |\r\n| mainnet   | https://mainnet-api.algonode.cloud     | https://mainnet-idx.algonode.cloud      |\r\n\r\n### Custom node (Nodely, PureStake, self-hosted)\r\n\r\n```js\r\nconst { createCustomClients } = require(\"@algopayoracle/oracle-sdk\");\r\n\r\nconst { algod, indexer } = createCustomClients({\r\n  algodUrl:    \"https://mainnet-api.nodely.dev\",\r\n  algodToken:  process.env.NODELY_TOKEN,\r\n  indexerUrl:  \"https://mainnet-idx.nodely.dev\",\r\n  indexerToken: process.env.NODELY_TOKEN,\r\n  explorerBase: \"https://lora.algokit.io/mainnet\",\r\n});\r\n\r\nconst client = new AlgoPayClient({ mnemonic, appId, algod, indexer });\r\n```\r\n\r\n---\r\n\r\n## Security notes\r\n\r\n- **Admin endpoints** — `addOracle` / `removeOracle` call on-chain contract functions. In production, these routes must be protected (API key at minimum) and should not be on the public internet. See the express-webhook example for the `requireAdmin` middleware pattern.\r\n- **Amount trust** — Never trust `amount` from the client in the payment verify path. The `RazorpayAdapter` orderStore pattern enforces this. If you write a custom adapter, always source the amount from your server-side order record or the provider's webhook body.\r\n- **Oracle key custody** — The oracle key is the trust anchor. Treat it like a private key: never commit to git, rotate via `addOracle` + `removeOracle` if compromised, consider multisig for mainnet.\r\n- **Webhook body size** — Always apply a body size limit to webhook handlers. The express-webhook example enforces 512 KB.\r\n- **CORS** — Lock `ALLOWED_ORIGINS` to your actual frontend domain before production deployment.\r\n\r\n---\r\n\r\n## Error handling\r\n\r\n```js\r\nconst {\r\n  AlgoPayError,\r\n  InsufficientAmountError,\r\n  ProofExpiredError,\r\n  OracleNotRegisteredError,\r\n  ReplayError,\r\n  ProviderAuthError,\r\n} = require(\"@algopayoracle/oracle-sdk\");\r\n\r\ntry {\r\n  await client.verifyAndCommit(event);\r\n} catch (e) {\r\n  if (e instanceof InsufficientAmountError) { /* amount < minimum */ }\r\n  if (e instanceof ProviderAuthError)       { /* gateway sig check failed */ }\r\n  if (e instanceof AlgoPayError)            { /* any SDK error */ }\r\n}\r\n```\r\n\r\n---\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}