Skip to content

Commit

Permalink
feat(utxo-coredao): initialize utxo-coredao
Browse files Browse the repository at this point in the history
This is dependent on wasm-miniscript with OP_DROP, which is not
merged in yet. I will add tests for this once we can import it.

TICKET: BTC-1578
  • Loading branch information
davidkaplanbitgo committed Oct 25, 2024
1 parent aa6d874 commit 897b130
Show file tree
Hide file tree
Showing 12 changed files with 2,781 additions and 2,669 deletions.
5 changes: 5 additions & 0 deletions modules/utxo-coredao/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules
.idea
public
dist

8 changes: 8 additions & 0 deletions modules/utxo-coredao/.mocharc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
require: 'ts-node/register'
timeout: '60000'
reporter: 'min'
reporter-option:
- 'cdn=true'
- 'json=false'
exit: true
spec: ['test/unit/**/*.ts']
14 changes: 14 additions & 0 deletions modules/utxo-coredao/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
!dist/
dist/test/
dist/tsconfig.tsbuildinfo
.idea/
.prettierrc.yml
tsconfig.json
src/
test/
scripts/
.nyc_output
CODEOWNERS
node_modules/
.prettierignore
.mocharc.js
2 changes: 2 additions & 0 deletions modules/utxo-coredao/.prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.nyc_output/
dist/
3 changes: 3 additions & 0 deletions modules/utxo-coredao/.prettierrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
printWidth: 120
singleQuote: true
trailingComma: 'es5'
4 changes: 4 additions & 0 deletions modules/utxo-coredao/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# BitGo utxo-CoreDao

Provides the functionality to build and parse coredao transactions.

45 changes: 45 additions & 0 deletions modules/utxo-coredao/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"name": "@bitgo/utxo-coredao",
"version": "1.0.0",
"description": "BitGo SDK for building CoreDao transactions",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"scripts": {
"build": "yarn tsc --build --incremental --verbose .",
"fmt": "prettier --write .",
"check-fmt": "prettier --check .",
"clean": "rm -r ./dist",
"lint": "eslint --quiet .",
"prepare": "npm run build",
"test": "npm run coverage",
"coverage": "nyc -- npm run unit-test",
"unit-test": "mocha"
},
"author": "BitGo SDK Team <[email protected]>",
"license": "MIT",
"engines": {
"node": ">=18 <21"
},
"repository": {
"type": "git",
"url": "https://github.com/BitGo/BitGoJS.git",
"directory": "modules/utxo-coredao"
},
"lint-staged": {
"*.{js,ts}": [
"yarn prettier --write",
"yarn eslint --fix"
]
},
"publishConfig": {
"access": "public"
},
"nyc": {
"extension": [
".ts"
]
},
"dependencies": {
"@bitgo/utxo-lib": "^11.0.0"
}
}
46 changes: 46 additions & 0 deletions modules/utxo-coredao/src/descriptor.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { BIP32Interface, bitgo } from '@bitgo/utxo-lib';

/**
* Script type for a descriptor. This is either a p2sh (sh) or a p2wsh (wsh) script.
*/
export type ScriptType = 'sh' | 'wsh';

/**
* Create a multi-sig descriptor to produce a coredao staking address
* @param scriptType segwit or legacy
* @param locktime locktime for CLTV
* @param m Total number of keys required to unlock
* @param orderedKeys
*/
export function createMultiSigDescriptor(
scriptType: ScriptType,
locktime: number,
m: number,
orderedKeys: BIP32Interface[]
): string {
if (m > orderedKeys.length || m < 1) {
throw new Error(
`m (${m}) must be less than or equal to the number of keys (${orderedKeys.length}) and greater than 0`
);
}
if (locktime <= 0) {
throw new Error(`locktime (${locktime}) must be greater than 0`);
}

const xpubs = orderedKeys.map((key) => key.toBase58() + '/*');
return `${scriptType}(and_v(r:after(${locktime}),multi(${m},${xpubs.join(',')}))`;
}

/**
* Create a wallet descriptor to produce a coredao staking address for a standard BitGo wallet
* @param scriptType
* @param locktime
* @param rootWalletKeys
*/
export function createWalletDescriptor(
scriptType: ScriptType,
locktime: number,
rootWalletKeys: bitgo.RootWalletKeys
): string {
return createMultiSigDescriptor(scriptType, locktime, 2, rootWalletKeys.triple);
}
1 change: 1 addition & 0 deletions modules/utxo-coredao/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './descriptor';
14 changes: 14 additions & 0 deletions modules/utxo-coredao/test/unit/descriptor.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import * as assert from 'assert';
import { createMultiSigDescriptor, createWalletDescriptor } from '../../src';
import { testutil, bitgo } from '@bitgo/utxo-lib';

// TODO BTC-1583: Add test fixtures for compiling descriptors
describe('CoreDao descriptor', function () {
const keys = testutil.getKeyTriple('wasm-possum');
it('should fail if given invalid parameters', function () {
assert.throws(() => createMultiSigDescriptor('wsh', -1, 2, keys));
assert.throws(() => createWalletDescriptor('wsh', 0, new bitgo.RootWalletKeys(keys)));
assert.throws(() => createMultiSigDescriptor('wsh', 0, 2, keys));
assert.throws(() => createMultiSigDescriptor('wsh', 3, 4, keys));
});
});
18 changes: 18 additions & 0 deletions modules/utxo-coredao/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "./dist",
"rootDir": ".",
"typeRoots": ["./node_modules/@types", "../../node_modules/@types"],
"allowJs": false,
"strict": true,
"useUnknownInCatchVariables": false
},
"include": ["src/**/*", "bin/**/*", "test/**/*"],
"exclude": ["node_modules"],
"references": [
{
"path": "../utxo-lib"
}
]
}
Loading

0 comments on commit 897b130

Please sign in to comment.