sdk/js: fix converting native terra2 20-byte addrs

This commit is contained in:
Evan Gray 2022-06-24 21:19:10 +00:00 committed by Evan Gray
parent 3028b81d63
commit c145e9350b
4 changed files with 35 additions and 2 deletions

View File

@ -1,5 +1,11 @@
# Changelog
## 0.4.5
### Changed
Fix hex/Uint8Array to native Terra 2 for 20-byte addresses
## 0.4.4
### Added

View File

@ -1,6 +1,6 @@
{
"name": "@certusone/wormhole-sdk",
"version": "0.4.4",
"version": "0.4.5",
"description": "SDK for interacting with Wormhole",
"homepage": "https://wormholenetwork.com",
"main": "./lib/cjs/index.js",

View File

@ -0,0 +1,20 @@
import { zeroPad } from "ethers/lib/utils";
import { canonicalAddress } from "../terra";
import { tryUint8ArrayToNative } from "./array";
test("terra address conversion", () => {
const human = "terra1x46rqay4d3cssq8gxxvqz8xt6nwlz4td20k38v";
const canonical = canonicalAddress(human);
const lpadCanonical = zeroPad(canonical, 32);
const nativeClassic = tryUint8ArrayToNative(lpadCanonical, "terra");
expect(nativeClassic).toBe(human);
const native2 = tryUint8ArrayToNative(lpadCanonical, "terra2");
expect(native2).toBe(human);
// terra 2 contracts are 32 bytes
const humanContract =
"terra14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9ssrc8au";
const canonicalContract = canonicalAddress(humanContract);
const nativeContract = tryUint8ArrayToNative(canonicalContract, "terra2");
expect(nativeContract).toBe(nativeContract);
// TODO: native to hex is wrong, which we should correct
});

View File

@ -41,6 +41,9 @@ import {
*/
export const isHexNativeTerra = (h: string): boolean => h.startsWith("01");
const isLikely20ByteTerra = (h: string): boolean =>
h.startsWith("000000000000000000000000");
export const nativeTerraHexToDenom = (h: string): string =>
Buffer.from(stripZeros(hexToUint8Array(h.substr(2)))).toString("ascii");
@ -72,7 +75,11 @@ export const tryUint8ArrayToNative = (
if (isHexNativeTerra(h)) {
return nativeTerraHexToDenom(h);
} else {
return humanAddress(chainId === CHAIN_ID_TERRA2 ? a : a.slice(-20)); // terra classic expects 20 bytes, not 32
if (chainId === CHAIN_ID_TERRA2 && !isLikely20ByteTerra(h)) {
// terra 2 has 32 byte addresses for contracts and 20 for wallets
return humanAddress(a);
}
return humanAddress(a.slice(-20));
}
} else if (chainId === CHAIN_ID_ALGORAND) {
return uint8ArrayToNativeStringAlgorand(a);