MCPcopy Create free account
hub / github.com/denoland/std / decodeBase58

Function decodeBase58

encoding/base58.ts:125–175  ·  view source on GitHub ↗
(b58: string)

Source from the content-addressed store, hash-verified

123 * ```
124 */
125export function decodeBase58(b58: string): Uint8Array_ {
126 const splitInput = b58.trim().split("");
127
128 let length = 0;
129 let ones = 0;
130
131 // Counting leading ones
132 let index = 0;
133 while (splitInput[index] === "1") {
134 ones++;
135 index++;
136 }
137
138 const notZeroData = splitInput.slice(index);
139
140 const size = Math.round((b58.length * 733) / 1000 + 1);
141 const output: number[] = [];
142
143 notZeroData.forEach((char, idx) => {
144 let carry = mapBase58[char];
145 let i = 0;
146
147 if (carry === undefined) {
148 throw new TypeError(
149 `Invalid base58 char at index ${idx} with value ${char}`,
150 );
151 }
152
153 for (
154 let reverseIterator = size - 1;
155 (carry > 0 || i < length) && reverseIterator !== -1;
156 reverseIterator--, i++
157 ) {
158 carry += 58 * (output[reverseIterator] ?? 0);
159 output[reverseIterator] = Math.round(carry % 256);
160 carry = Math.floor(carry / 256);
161 }
162
163 length = i;
164 });
165
166 const validOutput = output.filter((item) => item !== undefined);
167
168 if (ones > 0) {
169 const onesResult = Array.from({ length: ones }).fill(0, 0, ones);
170
171 return new Uint8Array([...onesResult, ...validOutput] as number[]);
172 }
173
174 return new Uint8Array(validOutput);
175}

Callers 1

base58_test.tsFile · 0.90

Calls 4

forEachMethod · 0.80
floorMethod · 0.80
sliceMethod · 0.45
fromMethod · 0.45

Tested by

no test coverage detected