summaryrefslogtreecommitdiff
path: root/packages/taler-util/src/segwit_addr.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-util/src/segwit_addr.ts')
-rw-r--r--packages/taler-util/src/segwit_addr.ts91
1 files changed, 91 insertions, 0 deletions
diff --git a/packages/taler-util/src/segwit_addr.ts b/packages/taler-util/src/segwit_addr.ts
new file mode 100644
index 000000000..becc5d197
--- /dev/null
+++ b/packages/taler-util/src/segwit_addr.ts
@@ -0,0 +1,91 @@
+// Copyright (c) 2017, 2021 Pieter Wuille
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import bech32 from "./bech32.js"
+
+export default {
+ encode: encode,
+ decode: decode
+};
+
+function convertbits(data: any, frombits: number, tobits: number, pad: boolean): any[] {
+ var acc = 0;
+ var bits = 0;
+ var ret = [];
+ var maxv = (1 << tobits) - 1;
+ for (var p = 0; p < data.length; ++p) {
+ var value = data[p];
+ if (value < 0 || (value >> frombits) !== 0) {
+ return []; //check this, was returning null
+ }
+ acc = (acc << frombits) | value;
+ bits += frombits;
+ while (bits >= tobits) {
+ bits -= tobits;
+ ret.push((acc >> bits) & maxv);
+ }
+ }
+ if (pad) {
+ if (bits > 0) {
+ ret.push((acc << (tobits - bits)) & maxv);
+ }
+ } else if (bits >= frombits || ((acc << (tobits - bits)) & maxv)) {
+ return []; //check this, was returning null
+ }
+ return ret;
+}
+
+function decode(hrp: any, addr: string) {
+ var bech32m = false;
+ var dec = bech32.decode(addr, bech32.encodings.BECH32);
+ if (dec === null) {
+ dec = bech32.decode(addr, bech32.encodings.BECH32M);
+ bech32m = true;
+ }
+ if (dec === null || dec.hrp !== hrp || dec.data.length < 1 || dec.data[0] > 16) {
+ return null;
+ }
+ var res = convertbits(dec.data.slice(1), 5, 8, false);
+ if (res === null || res.length < 2 || res.length > 40) {
+ return null;
+ }
+ if (dec.data[0] === 0 && res.length !== 20 && res.length !== 32) {
+ return null;
+ }
+ if (dec.data[0] === 0 && bech32m) {
+ return null;
+ }
+ if (dec.data[0] !== 0 && !bech32m) {
+ return null;
+ }
+ return { version: dec.data[0], program: res };
+}
+
+function encode(hrp: any, version: number, program: any): string {
+ var enc = bech32.encodings.BECH32;
+ if (version > 0) {
+ enc = bech32.encodings.BECH32M;
+ }
+ var ret = bech32.encode(hrp, [version].concat(convertbits(program, 8, 5, true)), enc);
+ if (decode(hrp, ret/*, enc*/) === null) {
+ return ""; //check this was returning null
+ }
+ return ret;
+} \ No newline at end of file