@ledgerhq/coin-ton
Version:
211 lines • 9.96 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@ton/core");
const config_1 = require("../../config");
const constants_1 = require("../../constants");
const utils_1 = require("../../utils");
const api_fixtures_1 = __importStar(require("../fixtures/api.fixtures"));
const common_fixtures_1 = require("../fixtures/common.fixtures");
describe("TON addresses", () => {
const addr = {
raw: "0:074c7194d64e8218f2cfaab8e79b34201adbed0f8fa7f2773e604dd39969b5ff",
rawWrong: "0:074c7194d64e8218f2cfaab8e79b34201adbed0f8fa7f2773e604dd39969b5f",
bounceUrl: "EQAHTHGU1k6CGPLPqrjnmzQgGtvtD4-n8nc-YE3TmWm1_1JZ",
bounceNoUrl: "EQAHTHGU1k6CGPLPqrjnmzQgGtvtD4+n8nc+YE3TmWm1/1JZ",
bounceWrong: "EQAHTHGU1k6CGPLPqrjnmzQgGtvtD4+n8nc+YE3TmWm1/1J",
noBounceUrl: "UQAHTHGU1k6CGPLPqrjnmzQgGtvtD4-n8nc-YE3TmWm1_w-c",
noBounceNoUrl: "UQAHTHGU1k6CGPLPqrjnmzQgGtvtD4+n8nc+YE3TmWm1/w+c",
noBounceWrong: "UQAHTHGU1k6CGPLPqrjnmzQgGtvtD4+n8nc+YE3TmWm1/w+",
diff: "UQBjrXgZbYDCpxLKpgMnBe985kYDfUeriuYUafbuKgdBpWuJ",
};
test("Check if addresses are valid", () => {
expect((0, utils_1.isAddressValid)(addr.raw)).toBe(true);
expect((0, utils_1.isAddressValid)(addr.bounceUrl)).toBe(true);
expect((0, utils_1.isAddressValid)(addr.bounceNoUrl)).toBe(true);
expect((0, utils_1.isAddressValid)(addr.noBounceUrl)).toBe(true);
expect((0, utils_1.isAddressValid)(addr.noBounceNoUrl)).toBe(true);
expect((0, utils_1.isAddressValid)(addr.rawWrong)).toBe(false);
expect((0, utils_1.isAddressValid)(addr.bounceWrong)).toBe(false);
expect((0, utils_1.isAddressValid)(addr.noBounceWrong)).toBe(false);
expect((0, utils_1.isAddressValid)(addr.diff)).toBe(true);
});
test("Compare addresses", () => {
expect((0, utils_1.addressesAreEqual)(addr.raw, addr.bounceUrl)).toBe(true);
expect((0, utils_1.addressesAreEqual)(addr.raw, addr.noBounceUrl)).toBe(true);
expect((0, utils_1.addressesAreEqual)(addr.bounceUrl, addr.noBounceUrl)).toBe(true);
expect((0, utils_1.addressesAreEqual)(addr.rawWrong, addr.noBounceUrl)).toBe(false);
expect((0, utils_1.addressesAreEqual)(addr.noBounceNoUrl, addr.diff)).toBe(false);
});
});
test("TON Comments are valid", () => {
const msg = (e, m) => ({ isEncrypted: e, text: m });
expect((0, utils_1.commentIsValid)(msg(false, ""))).toBe(true);
expect((0, utils_1.commentIsValid)(msg(false, "Hello world!"))).toBe(true);
expect((0, utils_1.commentIsValid)(msg(false, " 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789"))).toBe(true);
expect((0, utils_1.commentIsValid)(msg(false, " 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 "))).toBe(false);
expect((0, utils_1.commentIsValid)(msg(false, "😀"))).toBe(false);
expect((0, utils_1.commentIsValid)(msg(true, ""))).toBe(false);
});
describe("TON transfers", () => {
const commentPayload = {
type: "comment",
text: "",
};
const transferPayload = {
type: "jetton-transfer",
queryId: null,
amount: BigInt(0),
destination: new core_1.Address(0, Buffer.alloc(32)),
responseDestination: new core_1.Address(0, Buffer.alloc(32)),
customPayload: null,
forwardAmount: BigInt(0),
forwardPayload: null,
knownJetton: null,
};
const nftPayload = {
type: "nft-transfer",
queryId: null,
newOwner: new core_1.Address(0, Buffer.alloc(32)),
responseDestination: new core_1.Address(0, Buffer.alloc(32)),
customPayload: null,
forwardAmount: BigInt(0),
forwardPayload: null,
};
test("Check if the transaction is jetton transfer", () => {
/**
* Checks if the given payload is a jetton transfer.
*/
const isJettonTransfer = (payload) => payload.type === "jetton-transfer";
expect(isJettonTransfer(commentPayload)).toBe(false);
expect(isJettonTransfer(transferPayload)).toBe(true);
expect(isJettonTransfer(nftPayload)).toBe(false);
});
});
describe("Get TON paths", () => {
const correctPath = ["44'/607'/0'/0'/0'/0'", "m/44'/607'/0'/0'/0'/0'"];
const wrongPaths = [
"44'/607'/0'/0'/0'",
"44'/607'/0'/0/'/0'",
"44'/607'/0'/0'/x'/0'",
"44'/607'/0'/-3'/0'/0'",
"44'/607'/0'/2147483650'/0'/0'",
];
test("Correct paths return a correct response", () => {
correctPath.map((path) => {
expect((0, utils_1.getLedgerTonPath)(path)).toStrictEqual([44, 607, 0, 0, 0, 0]);
});
});
test("Wrong paths fail", () => {
wrongPaths.map((path) => {
expect(() => (0, utils_1.getLedgerTonPath)(path)).toThrow(/^(\[ton\] Path)/);
});
});
});
describe("Build TON transaction", () => {
beforeAll(() => {
(0, config_1.setCoinConfig)(() => ({
status: {
type: "active",
},
infra: {
API_TON_ENDPOINT: api_fixtures_1.API_TON_ENDPOINT,
KNOWN_JETTONS: [],
},
}));
api_fixtures_1.default.listen();
});
afterAll(() => {
api_fixtures_1.default.close();
});
const seqno = 22;
test("Build TON transaction with an specific amount", () => {
const tonTransaction = (0, utils_1.buildTonTransaction)(common_fixtures_1.transaction, seqno, common_fixtures_1.account);
// Convert the Address to string to compare
expect({ ...tonTransaction, to: tonTransaction.to.toString() }).toEqual({
to: core_1.Address.parse(common_fixtures_1.transaction.recipient).toString(),
seqno,
amount: BigInt(common_fixtures_1.transaction.amount.toString()),
bounce: false,
timeout: (0, utils_1.getTransferExpirationTime)(),
sendMode: 3,
});
});
test("Build TON transaction when useAllAmount is true and there is a comment", () => {
const transaction = {
...common_fixtures_1.transaction,
comment: { text: "valid comment", isEncrypted: false },
useAllAmount: true,
};
const tonTransaction = (0, utils_1.buildTonTransaction)(transaction, seqno, common_fixtures_1.account);
// Convert the Address to string to compare
expect({ ...tonTransaction, to: tonTransaction.to.toString() }).toEqual({
to: core_1.Address.parse(transaction.recipient).toString(),
seqno,
amount: BigInt(0),
bounce: false,
timeout: (0, utils_1.getTransferExpirationTime)(),
sendMode: 128,
payload: { type: "comment", text: transaction.comment.text },
});
});
test("Build jetton transaction with an specific amount", () => {
const jettonTransfer = (0, utils_1.buildTonTransaction)(common_fixtures_1.jettonTransaction, seqno, common_fixtures_1.account);
// Convert the Addresses to string to compare
expect({
...jettonTransfer,
to: jettonTransfer.to.toString(),
payload: undefined,
}).toStrictEqual({
to: core_1.Address.parse(common_fixtures_1.account.subAccounts?.[0].jettonWallet ?? "").toString(),
seqno,
amount: (0, core_1.toNano)(constants_1.TOKEN_TRANSFER_MAX_FEE),
bounce: true,
timeout: (0, utils_1.getTransferExpirationTime)(),
sendMode: 3,
payload: undefined,
});
expect(jettonTransfer.payload?.type).toStrictEqual("jetton-transfer");
expect({
...jettonTransfer.payload,
destination: jettonTransfer.payload.destination.toString(),
responseDestination: jettonTransfer.payload.responseDestination.toString(),
queryId: jettonTransfer.payload.queryId?.toString(),
amount: jettonTransfer.payload.amount.toString(),
forwardAmount: jettonTransfer.payload.forwardAmount.toString(),
}).toStrictEqual({
type: "jetton-transfer",
queryId: constants_1.TOKEN_TRANSFER_QUERY_ID.toString(),
amount: common_fixtures_1.jettonTransaction.amount.toFixed(),
destination: core_1.Address.parse(common_fixtures_1.jettonTransaction.recipient).toString(),
responseDestination: core_1.Address.parse(common_fixtures_1.account.freshAddress).toString(),
customPayload: null,
forwardAmount: constants_1.TOKEN_TRANSFER_FORWARD_AMOUNT.toString(),
forwardPayload: null,
knownJetton: null,
});
});
});
//# sourceMappingURL=utils.unit.test.js.map