{"_id":"@dokimon/transaction-confirmation","name":"@dokimon/transaction-confirmation","dist-tags":{"latest":"2.1.0"},"versions":{"2.1.0":{"name":"@dokimon/transaction-confirmation","version":"2.1.0","description":"Helpers for confirming Dokimon transactions","exports":{"edge-light":{"import":"./dist/index.node.mjs","require":"./dist/index.node.cjs"},"workerd":{"import":"./dist/index.node.mjs","require":"./dist/index.node.cjs"},"browser":{"import":"./dist/index.browser.mjs","require":"./dist/index.browser.cjs"},"node":{"import":"./dist/index.node.mjs","require":"./dist/index.node.cjs"},"react-native":"./dist/index.native.mjs","types":"./dist/types/index.d.ts"},"browser":{"./dist/index.node.cjs":"./dist/index.browser.cjs","./dist/index.node.mjs":"./dist/index.browser.mjs"},"main":"./dist/index.node.cjs","module":"./dist/index.node.mjs","react-native":"./dist/index.native.mjs","types":"./dist/types/index.d.ts","type":"commonjs","sideEffects":false,"keywords":["blockchain","dokimon","web3"],"scripts":{"compile:js":"tsup --config build-scripts/tsup.config.package.ts","compile:typedefs":"tsc -p ./tsconfig.declarations.json","dev":"jest -c ../../node_modules/@dokimon/test-config/jest-dev.config.ts --rootDir . --watch","prepublishOnly":"pnpm pkg delete devDependencies","publish-packages":"npm view $npm_package_name@$npm_package_version > /dev/null 2>&1 || (pnpm publish --tag ${PUBLISH_TAG:-canary} --access public --no-git-checks && (([ \"$PUBLISH_TAG\" != \"canary\" ] && pnpm dist-tag add $npm_package_name@$npm_package_version latest) || true))","style:fix":"pnpm eslint --fix src && pnpm prettier --log-level warn --ignore-unknown --write ./*","test:lint":"TERM_OVERRIDE=\"${TURBO_HASH:+dumb}\" TERM=${TERM_OVERRIDE:-$TERM} jest -c ../../node_modules/@dokimon/test-config/jest-lint.config.ts --rootDir . --silent","test:prettier":"TERM_OVERRIDE=\"${TURBO_HASH:+dumb}\" TERM=${TERM_OVERRIDE:-$TERM} jest -c ../../node_modules/@dokimon/test-config/jest-prettier.config.ts --rootDir . --silent","test:treeshakability:browser":"agadoo dist/index.browser.mjs","test:treeshakability:native":"agadoo dist/index.native.mjs","test:treeshakability:node":"agadoo dist/index.node.mjs","test:typecheck":"tsc --noEmit","test:unit:browser":"TERM_OVERRIDE=\"${TURBO_HASH:+dumb}\" TERM=${TERM_OVERRIDE:-$TERM} jest -c ../../node_modules/@dokimon/test-config/jest-unit.config.browser.ts --rootDir . --silent","test:unit:node":"TERM_OVERRIDE=\"${TURBO_HASH:+dumb}\" TERM=${TERM_OVERRIDE:-$TERM} jest -c ../../node_modules/@dokimon/test-config/jest-unit.config.node.ts --rootDir . --silent"},"author":{"name":"Dokimon Labs Maintainers","email":"maintainers@dokimonlabs.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/dokimon-labs/kit.git"},"bugs":{"url":"https://github.com/dokimon-labs/kit/issues"},"browserslist":["supports bigint and not dead","maintained node versions"],"dependencies":{"@dokimon/addresses":"workspace:*","@dokimon/codecs-strings":"workspace:*","@dokimon/errors":"workspace:*","@dokimon/keys":"workspace:*","@dokimon/promises":"workspace:*","@dokimon/rpc":"workspace:*","@dokimon/rpc-subscriptions":"workspace:*","@dokimon/rpc-types":"workspace:*","@dokimon/transaction-messages":"workspace:*","@dokimon/transactions":"workspace:*"},"peerDependencies":{"typescript":">=5"},"engines":{"node":">=20.18.0"},"_id":"@dokimon/transaction-confirmation@2.1.0","gitHead":"f6ca1d5a284619512ea66e7868db4885b6d0082d","homepage":"https://github.com/dokimon-labs/kit#readme","_nodeVersion":"22.14.0","_npmVersion":"11.4.0","dist":{"integrity":"sha512-k+KPBA3zwJvSx2WJ1AC6Ddxaa2XSuQZ89F3WrOHJr1EMh8mOc5LKVtUcPjF5lwfVEIxT+oxXAd5F91hULm2Vtw==","shasum":"96a3ef0f3fe9aa6b8ef8ec1d6c10fca8428e89ec","tarball":"https://registry.npmjs.org/@dokimon/transaction-confirmation/-/transaction-confirmation-2.1.0.tgz","fileCount":27,"unpackedSize":225547,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIC12Gu0m4ZrEzCj7qblgW+zXqXyMbnw/DABhWhJY2WDDAiEAhv7PQ8tApx/W3M0cZ7Jc14TRDjNcNqcuKVvu4A2wU4I="}]},"_npmUser":{"name":"m67846088848","email":"m67846088848@gmail.com"},"directories":{},"maintainers":[{"name":"m67846088848","email":"m67846088848@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/transaction-confirmation_2.1.0_1747745322898_0.4979995151273131"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-20T12:48:42.836Z","2.1.0":"2025-05-20T12:48:43.124Z","modified":"2025-05-20T12:48:43.395Z"},"maintainers":[{"name":"m67846088848","email":"m67846088848@gmail.com"}],"description":"Helpers for confirming Dokimon transactions","homepage":"https://github.com/dokimon-labs/kit#readme","keywords":["blockchain","dokimon","web3"],"repository":{"type":"git","url":"git+https://github.com/dokimon-labs/kit.git"},"author":{"name":"Dokimon Labs Maintainers","email":"maintainers@dokimonlabs.com"},"bugs":{"url":"https://github.com/dokimon-labs/kit/issues"},"license":"MIT","readme":"[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n<br />\n[![code-style-prettier][code-style-prettier-image]][code-style-prettier-url]\n\n[code-style-prettier-image]: https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square\n[code-style-prettier-url]: https://github.com/prettier/prettier\n[npm-downloads-image]: https://img.shields.io/npm/dm/@dokimon/transaction-confirmation?style=flat\n[npm-image]: https://img.shields.io/npm/v/@dokimon/transaction-confirmation?style=flat\n[npm-url]: https://www.npmjs.com/package/@dokimon/transaction-confirmation\n\n# @dokimon/transaction-confirmation\n\nThis package contains utilities for confirming transactions and for building your own transaction confirmation strategies.\n\n## Functions\n\n### `createBlockHeightExceedencePromiseFactory()`\n\nWhen a transaction's lifetime is tied to a blockhash, that transaction can be landed on the network until that blockhash expires. All blockhashes have a block height after which they are considered to have expired. A block height exceedence promise throws when the network progresses past that block height.\n\n```ts\nimport { isDokimonError, DokimonError } from '@dokimon/errors';\nimport { createBlockHeightExceedencePromiseFactory } from '@dokimon/transaction-confirmation';\n\nconst getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({\n    rpc,\n    rpcSubscriptions,\n});\ntry {\n    await getBlockHeightExceedencePromise({ lastValidBlockHeight });\n} catch (e) {\n    if (isDokimonError(e, DOKIMON_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n        console.error(\n            `The block height of the network has exceeded ${e.context.lastValidBlockHeight}. ` +\n                `It is now ${e.context.currentBlockHeight}`,\n        );\n        // Re-sign and retry the transaction.\n        return;\n    }\n    throw e;\n}\n```\n\n### `createNonceInvalidationPromiseFactory()`\n\nWhen a transaction's lifetime is tied to the value stored in a nonce account, that transaction can be landed on the network until the nonce is advanced to a new value. A nonce invalidation promise throws when the value stored in a nonce account is not the expected one.\n\n```ts\nimport { isDokimonError, DokimonError } from '@dokimon/errors';\nimport { createNonceInvalidationPromiseFactory } from '@dokimon/transaction-confirmation';\n\nconst getNonceInvalidationPromise = createNonceInvalidationPromiseFactory({\n    rpc,\n    rpcSubscriptions,\n});\ntry {\n    await getNonceInvalidationPromise({\n        currentNonceValue,\n        nonceAccountAddress,\n    });\n} catch (e) {\n    if (isDokimonError(e, DOKIMON_ERROR__NONCE_INVALID)) {\n        console.error(`The nonce has advanced to ${e.context.actualNonceValue}`);\n        // Re-sign and retry the transaction.\n        return;\n    } else if (isDokimonError(e, DOKIMON_ERROR__NONCE_ACCOUNT_NOT_FOUND)) {\n        console.error(`No nonce account was found at ${nonceAccountAddress}`);\n    }\n    throw e;\n}\n```\n\n### `createRecentSignatureConfirmationPromiseFactory()`\n\nThe status of recently-landed transactions is available in the network's status cache. A recent signature confirmation promise resolves when a transaction achieves the target confirmation commitment, and throws when the transaction fails with an error.\n\n```ts\nimport { createRecentSignatureConfirmationPromiseFactory } from '@dokimon/transaction-confirmation';\n\nconst getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n    rpc,\n    rpcSubscriptions,\n});\ntry {\n    await getRecentSignatureConfirmationPromise({\n        commitment,\n        signature,\n    });\n    console.log(`The transaction with signature \\`${signature}\\` has achieved a commitment level of \\`${commitment}\\``);\n} catch (e) {\n    console.error(`The transaction with signature \\`${signature}\\` failed`, e.cause);\n    throw e;\n}\n```\n\n### `getTimeoutPromise()`\n\nWhen no other heuristic exists to infer that a transaction has expired, you can use this promise factory with a commitment level. It throws after 30 seconds when the commitment is `processed`, and 60 seconds otherwise. You would typically race this with another confirmation strategy.\n\n```ts\nimport { safeRace } from '@dokimon/promises';\nimport { getTimeoutPromise } from '@dokimon/transaction-confirmation';\n\ntry {\n    await safeRace([getCustomTransactionConfirmationPromise(/* ... */), getTimeoutPromise({ commitment })]);\n} catch (e) {\n    if (e instanceof DOMException && e.name === 'TimeoutError') {\n        console.log('Could not confirm transaction after a timeout');\n    }\n    throw e;\n}\n```\n\n### `waitForDurableNonceTransactionConfirmation()`\n\nSupply your own confirmation implementations to this function to create a custom nonce transaction confirmation strategy.\n\n```ts\nimport { waitForDurableNonceTransactionConfirmation } from '@dokimon/transaction-confirmation';\n\ntry {\n    await waitForDurableNonceTransactionConfirmation({\n        getNonceInvalidationPromise({ abortSignal, commitment, currentNonceValue, nonceAccountAddress }) {\n            // Return a promise that rejects when a nonce becomes invalid.\n        },\n        getRecentSignatureConfirmationPromise({ abortSignal, commitment, signature }) {\n            // Return a promise that resolves when a transaction achieves confirmation\n        },\n    });\n} catch (e) {\n    // Handle errors.\n}\n```\n\n### `waitForRecentTransactionConfirmation()`\n\nSupply your own confirmation implementations to this function to create a custom nonce transaction confirmation strategy.\n\n```ts\nimport { waitForRecentTransactionConfirmation } from '@dokimon/transaction-confirmation';\n\ntry {\n    await waitForRecentTransactionConfirmation({\n        getBlockHeightExceedencePromise({ abortSignal, commitment, lastValidBlockHeight }) {\n            // Return a promise that rejects when the blockhash's block height has been exceeded\n        },\n        getRecentSignatureConfirmationPromise({ abortSignal, commitment, signature }) {\n            // Return a promise that resolves when a transaction achieves confirmation\n        },\n    });\n} catch (e) {\n    // Handle errors.\n}\n```\n\n### `waitForRecentTransactionConfirmationUntilTimeout()`\n\nSupply your own confirmation implementations to this function to create a custom nonce transaction confirmation strategy.\n\n```ts\nimport { waitForRecentTransactionConfirmationUntilTimeout } from '@dokimon/transaction-confirmation';\n\ntry {\n    await waitForRecentTransactionConfirmationUntilTimeout({\n        getTimeoutPromise({ abortSignal, commitment }) {\n            // Return a promise that rejects after your chosen timeout\n        },\n        getRecentSignatureConfirmationPromise({ abortSignal, commitment, signature }) {\n            // Return a promise that resolves when a transaction achieves confirmation\n        },\n    });\n} catch (e) {\n    // Handle errors.\n}\n```\n","readmeFilename":"README.md","_rev":"1-1df3976fc4535fdac0eb311332bd403b"}