[BREAKGLASS] Send & receive bitcoins via SilentPayment, in pure typescript
Go to file
2026-02-02 15:24:50 +00:00
.github/workflows refactor: bump and test fix 2025-10-27 09:38:47 +00:00
src refactor: change ecc lib to a more performant one 2026-02-02 15:24:50 +00:00
tests refactor: change ecc lib to a more performant one 2026-02-02 15:24:50 +00:00
.gitignore added incoming utxo detection from transaction 2025-09-20 21:13:07 +01:00
.prettierignore refactor: replace ecc with noble ecc (#5) 2023-07-29 19:16:03 +00:00
.prettierrc.json prettier 2023-06-16 22:01:33 +01:00
babel.config.js prettier 2023-06-16 22:01:33 +01:00
package.json refactor: change ecc lib to a more performant one 2026-02-02 15:24:50 +00:00
README.md refactor: change ecc lib to a more performant one 2026-02-02 15:24:50 +00:00

SilentPayments (BIP-352)

Send & receive bitcoins via SilentPayment (aka static payment codes), in pure typescript.

Installation

  • npm i "github:BlueWallet/SilentPayments" --save

Library is implemented in pure typescript without js-compiled version committed - you might need to configure javascript build on your side. For example, to use it in jest tests:

package.json:

  "jest": {
    "transform": {
      "^.+\\.(ts|tsx)$": "ts-jest"
    },
    "transformIgnorePatterns": [
      "node_modules/(?!((jest-)?react-native(-.*)?|@react-native(-community)?)|silent-payments/)"
    ],

If youre using webpack you might need to add a loader in webpack.config.js, something like this:

...
    {
        test: /node_modules\/silent-payments\/.*\.ts$/,
        use: [
          {
            loader: require.resolve('ts-loader'),
            options: {
              allowTsInNodeModules: true,
              getCustomTransformers: () => ({
                before: [isDevelopment && ReactRefreshTypeScript()].filter(
                  Boolean
                ),
              }),
              transpileOnly: isDevelopment,
            },
          },
        ],
      },
...

Usage

Send

You must provide UTXOs and targets (which might or might not include SilentPayment codes):

createTransaction(utxos: UTXO[], targets: Target[]): Target[]

Finally:

const sp = new SilentPayment();

const targets = sp.createTransaction(
  [
    {
      txid: "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16",
      vout: 0,
      wif: ECPair.fromPrivateKey(Buffer.from("1cd5e8f6b3f29505ed1da7a5806291ebab6491c6a172467e44debe255428a192", "hex")).toWIF(),
      utxoType: "p2wpkh",
    },
  ],
  [
    {
      address: "3FiYaHYHQTmD8n2SJxVYobDeN1uQKvzkLe",
      value: 11_111,
    },
    {
      address: "sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv",
      value: 22_222,
    },
    {
      // no address, which should be interpreted as change
      value: 33_333,
    },
  ]
);

Library will unwrap sp1... codes into correct receivers address. You must provide correct UTXO types to the library, and you must use the same UTXOs in an actual transaction you create. Library will not do coin selection for you.

Receive

TODO

Development

  • npm i
  • npm t

License

MIT

References