From 63a0540fda0b069fdba70079c12ef3347ff4191c Mon Sep 17 00:00:00 2001 From: Slava Date: Tue, 28 Jan 2025 23:24:24 +0300 Subject: [PATCH 1/4] chore: replace runestonejs with magiceden runestone --- sdk/package-lock.json | 36 +++++++++++++++++++----------------- sdk/package.json | 4 ++-- sdk/src/runes.ts | 21 +++++++++++---------- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/sdk/package-lock.json b/sdk/package-lock.json index 0014c4c3..53ba9ce5 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -8,12 +8,14 @@ "name": "@gobob/bob-sdk", "version": "3.1.3", "dependencies": { + "@magiceden-oss/runestone-lib": "^1.0.2", + "@ordjs/runestone": "^1.6.0", "@scure/base": "^1.1.7", "@scure/btc-signer": "^1.3.2", "bitcoin-address-validation": "^2.2.3", "bitcoinjs-lib": "^6.1.6", "ethers": "^6.13.2", - "runestone-js": "^0.3.0" + "runelib": "^1.0.7" }, "devDependencies": { "@types/node": "^22.5.5", @@ -635,6 +637,11 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@magiceden-oss/runestone-lib": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@magiceden-oss/runestone-lib/-/runestone-lib-1.0.2.tgz", + "integrity": "sha512-C4XoE7tHxxaWQNzovBIEndXGrTesotshnKQA8DXlnoVDvriD6G26ezUoj9AlEb2UAPbEijSga4Dtwd86Z0a1jg==" + }, "node_modules/@mswjs/interceptors": { "version": "0.34.3", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.34.3.tgz", @@ -731,6 +738,11 @@ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true }, + "node_modules/@ordjs/runestone": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@ordjs/runestone/-/runestone-1.6.0.tgz", + "integrity": "sha512-hAdQIioQ7iwfGOOfR6GigZRtbVjXBGFrmyAhyVv3noaaVoYAWjzDOAIn5Ca7xC2R/pMbfJB8t4n5hMhHObRb7A==" + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -1453,14 +1465,6 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" }, - "node_modules/big-varuint-js": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/big-varuint-js/-/big-varuint-js-0.2.1.tgz", - "integrity": "sha512-79JS5h53rP+L2CyXbpgMaLPKyHek7VAglJbug3KWR3CBtBabkcvxaU0PSMTBP9jBhDYoJsz5f+Ow20XSp8n52A==", - "peerDependencies": { - "typescript": "^5.0.0" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -3392,15 +3396,12 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/runestone-js": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/runestone-js/-/runestone-js-0.3.0.tgz", - "integrity": "sha512-8ddhFrIZ/H1zKJ5HcSWsFabexunF4Dk7odjJQFy92ZZ+3Oxicf/VndZdP1pnPu4y2R54ZO3rP2tkPtrQgqFhxA==", + "node_modules/runelib": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/runelib/-/runelib-1.0.7.tgz", + "integrity": "sha512-XoOw84DbKXV5UrrLnZ47I8ZdLCtqU958v5eheqzPK8/I/xnxSAtpnHdcolubF87+fiPydcC4dJRprC6L8WTlEg==", "dependencies": { - "big-varuint-js": "^0.2.1" - }, - "peerDependencies": { - "typescript": "^5.0.0" + "bitcoinjs-lib": "^6.1.5" } }, "node_modules/safe-buffer": { @@ -3788,6 +3789,7 @@ "version": "5.6.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/sdk/package.json b/sdk/package.json index 2916e3ce..4c6df2fe 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -39,11 +39,11 @@ "yargs": "^17.5.1" }, "dependencies": { + "@magiceden-oss/runestone-lib": "^1.0.2", "@scure/base": "^1.1.7", "@scure/btc-signer": "^1.3.2", "bitcoin-address-validation": "^2.2.3", "bitcoinjs-lib": "^6.1.6", - "ethers": "^6.13.2", - "runestone-js": "0.3.0" + "ethers": "^6.13.2" } } diff --git a/sdk/src/runes.ts b/sdk/src/runes.ts index 1143206e..e4e1e102 100644 --- a/sdk/src/runes.ts +++ b/sdk/src/runes.ts @@ -1,16 +1,17 @@ import * as bitcoin from 'bitcoinjs-lib'; import { EsploraClient } from './esplora'; -// This implementation is based on ord 0.17.1, *use this as a reference only -import { Runestone } from 'runestone-js'; +import { Cenotaph, RunestoneSpec, tryDecodeRunestone } from '@magiceden-oss/runestone-lib'; -export function parseRunestone(tx: bitcoin.Transaction): Runestone | undefined { - for (const out of tx.outs) { - if (out.script[0] === bitcoin.opcodes.OP_RETURN && out.script[1] === bitcoin.opcodes.OP_13) { - // skip OP_RETURN OP_13 OP_PUSHBYTES - const pureOutputBuffer = out.script.subarray(3); - return Runestone.dechiper(pureOutputBuffer); - } - } +export function parseRunestone(tx: bitcoin.Transaction): RunestoneSpec | Cenotaph | null { + const rune = tryDecodeRunestone({ + vout: tx.outs.map((out) => ({ + scriptPubKey: { + hex: out.script.toString('hex'), + }, + })), + }); + + return rune; } export async function getTxRunestone(esploraClient: EsploraClient, txid: string) { From 6ab0c0431d9e5ea0a9eb3a18185d06ca56ef2be6 Mon Sep 17 00:00:00 2001 From: Slava Date: Tue, 28 Jan 2025 23:46:39 +0300 Subject: [PATCH 2/4] chore: bump version --- sdk/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/package.json b/sdk/package.json index 4c6df2fe..d621ab83 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@gobob/bob-sdk", - "version": "3.1.3", + "version": "3.1.4", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { From c7248b1274cf47ea763d2882b94ef09e69092d38 Mon Sep 17 00:00:00 2001 From: Slava Date: Wed, 29 Jan 2025 16:49:06 +0300 Subject: [PATCH 3/4] chore: update lock file --- sdk/package-lock.json | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/sdk/package-lock.json b/sdk/package-lock.json index 53ba9ce5..c2e138a8 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -1,21 +1,19 @@ { "name": "@gobob/bob-sdk", - "version": "3.1.3", + "version": "3.1.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gobob/bob-sdk", - "version": "3.1.3", + "version": "3.1.4", "dependencies": { "@magiceden-oss/runestone-lib": "^1.0.2", - "@ordjs/runestone": "^1.6.0", "@scure/base": "^1.1.7", "@scure/btc-signer": "^1.3.2", "bitcoin-address-validation": "^2.2.3", "bitcoinjs-lib": "^6.1.6", - "ethers": "^6.13.2", - "runelib": "^1.0.7" + "ethers": "^6.13.2" }, "devDependencies": { "@types/node": "^22.5.5", @@ -738,11 +736,6 @@ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true }, - "node_modules/@ordjs/runestone": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@ordjs/runestone/-/runestone-1.6.0.tgz", - "integrity": "sha512-hAdQIioQ7iwfGOOfR6GigZRtbVjXBGFrmyAhyVv3noaaVoYAWjzDOAIn5Ca7xC2R/pMbfJB8t4n5hMhHObRb7A==" - }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -3396,14 +3389,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/runelib": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/runelib/-/runelib-1.0.7.tgz", - "integrity": "sha512-XoOw84DbKXV5UrrLnZ47I8ZdLCtqU958v5eheqzPK8/I/xnxSAtpnHdcolubF87+fiPydcC4dJRprC6L8WTlEg==", - "dependencies": { - "bitcoinjs-lib": "^6.1.5" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", From babfa374ceec544ddb0d44310c5e8eb218ea3b2f Mon Sep 17 00:00:00 2001 From: Slava Date: Wed, 29 Jan 2025 22:29:18 +0300 Subject: [PATCH 4/4] chore: replace p2pkh address --- sdk/test/utxo.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/test/utxo.test.ts b/sdk/test/utxo.test.ts index e3d80467..efb8843c 100644 --- a/sdk/test/utxo.test.ts +++ b/sdk/test/utxo.test.ts @@ -40,8 +40,8 @@ describe('UTXO Tests', () => { // TODO: Use a real P2SH-P2WPKH address // TODO: Add the pubkey to allow spending from the outputs // '3DFVKuT9Ft4rWpysAZ1bHpg55EBy1HVPcr', - // P2PKH: https://blockstream.info/address/1Kr6QSydW9bFQG1mXiPNNu6WpJGmUa9i1g - '1Kr6QSydW9bFQG1mXiPNNu6WpJGmUa9i1g', + // P2PKH: https://blockstream.info/address/1PM46U2c5LhkcQXnHwfwQU6V1y4F4L7Ct4 + '1PM46U2c5LhkcQXnHwfwQU6V1y4F4L7Ct4', // P2TR https://blockstream.info/address/bc1peqr5a5kfufvsl66444jm9y8qq0s87ph0zv4lfkcs7h40ew02uvsqkhjav0 'bc1peqr5a5kfufvsl66444jm9y8qq0s87ph0zv4lfkcs7h40ew02uvsqkhjav0', ]; @@ -304,8 +304,8 @@ describe('UTXO Tests', () => { // P2SH-P2WPKH: https://blockstream.info/address/3DFVKuT9Ft4rWpysAZ1bHpg55EBy1HVPcr // TODO: As above, add a correct P2SH-P2WPKH address with its pub key // '3DFVKuT9Ft4rWpysAZ1bHpg55EBy1HVPcr', - // P2PKH: https://blockstream.info/address/1Kr6QSydW9bFQG1mXiPNNu6WpJGmUa9i1g - '1Kr6QSydW9bFQG1mXiPNNu6WpJGmUa9i1g', + // P2PKH: https://blockstream.info/address/1PM46U2c5LhkcQXnHwfwQU6V1y4F4L7Ct4 + '1PM46U2c5LhkcQXnHwfwQU6V1y4F4L7Ct4', // P2TR https://blockstream.info/address/bc1peqr5a5kfufvsl66444jm9y8qq0s87ph0zv4lfkcs7h40ew02uvsqkhjav0 'bc1peqr5a5kfufvsl66444jm9y8qq0s87ph0zv4lfkcs7h40ew02uvsqkhjav0', ];