@ledgerhq/coin-ton
Version:
142 lines • 7.25 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.testDestination = void 0;
const specs_1 = require("@ledgerhq/coin-framework/bot/specs");
const cryptoassets_1 = require("@ledgerhq/cryptoassets");
const devices_1 = require("@ledgerhq/devices");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const expect_1 = __importDefault(require("expect"));
const invariant_1 = __importDefault(require("invariant"));
const speculos_deviceActions_1 = require("./speculos-deviceActions");
const utils_1 = require("./utils");
const MIN_SAFE = new bignumber_js_1.default(1.5e7); // approx two txs' fees (0.015 TON)
const testDestination = ({ destination, destinationBeforeTransaction, sendingOperation, }) => {
const amount = sendingOperation.value;
const inOp = destination.operations.find(op => op.hash === sendingOperation.hash && op.type === "IN");
const inFees = inOp?.fee ?? (0, bignumber_js_1.default)(0);
(0, specs_1.botTest)("account balance increased with transaction amount", () => (0, expect_1.default)(destination.balance.toString()).toBe(destinationBeforeTransaction.balance.plus(amount).minus(inFees).toString()));
(0, specs_1.botTest)("operation amount is consistent with sendingOperation", () => (0, expect_1.default)({
type: inOp?.type,
amount: inOp?.value?.toString(),
}).toMatchObject({
type: "IN",
amount: amount.toString(),
}));
};
exports.testDestination = testDestination;
const tonSpecs = {
name: "TON",
currency: (0, cryptoassets_1.getCryptoCurrencyById)("ton"),
appQuery: {
model: devices_1.DeviceModelId.nanoSP,
appName: "TON",
},
genericDeviceAction: (0, speculos_deviceActions_1.generateDeviceActionFlow)(utils_1.BotScenario.DEFAULT),
testTimeout: 6 * 60 * 1000,
minViableAmount: MIN_SAFE,
transactionCheck: ({ maxSpendable }) => {
(0, invariant_1.default)(maxSpendable.gt(MIN_SAFE), "balance is too low");
},
mutations: [
{
name: "Send ~50%",
feature: "send",
maxRun: 1,
testDestination: exports.testDestination,
transaction: ({ account, siblings, bridge, maxSpendable }) => {
(0, invariant_1.default)(maxSpendable.gt(MIN_SAFE), "balance is too low");
const updates = [
{ recipient: (0, specs_1.pickSiblings)(siblings).freshAddress },
{ amount: maxSpendable.div(2).integerValue() },
{ comment: { isEncrypted: false, text: "LL Bot" } },
];
return {
transaction: bridge.createTransaction(account),
updates,
};
},
test: ({ accountBeforeTransaction, operation, account, transaction }) => {
// we don't know the exact amount in fees, so we accept +- 20% of expected fees
const baseAmount = accountBeforeTransaction.balance.minus(transaction.amount);
const maxBalance = baseAmount.minus(transaction.fees.multipliedBy(0.8).integerValue());
const minBalance = baseAmount.minus(transaction.fees.multipliedBy(1.2).integerValue());
(0, specs_1.botTest)("account spendable balance decreased with operation", () => {
(0, expect_1.default)(account.spendableBalance.lte(maxBalance)).toBe(true);
(0, expect_1.default)(account.spendableBalance.gte(minBalance)).toBe(true);
});
(0, specs_1.botTest)("operation comment", () => (0, expect_1.default)(operation.extra).toMatchObject({
comment: transaction.comment,
}));
},
},
{
name: "Transfer Max",
feature: "sendMax",
maxRun: 1,
transaction: ({ account, siblings, bridge }) => {
const updates = [
{ recipient: (0, specs_1.pickSiblings)(siblings).freshAddress },
{ useAllAmount: true },
{ comment: { isEncrypted: false, text: "LL Bot" } },
];
return {
transaction: bridge.createTransaction(account),
updates,
};
},
testDestination: exports.testDestination,
test: ({ account, transaction, operation }) => {
(0, specs_1.botTest)("account spendable balance is zero", () => (0, expect_1.default)(account.spendableBalance.toFixed()).toBe("0"));
(0, specs_1.botTest)("operation comment", () => (0, expect_1.default)(operation.extra).toMatchObject({
comment: transaction.comment,
}));
},
},
{
name: "Send ~50% jUSDT",
feature: "tokens",
maxRun: 1,
deviceAction: (0, speculos_deviceActions_1.generateDeviceActionFlow)(utils_1.BotScenario.TOKEN_TRANSFER),
transaction: ({ account, bridge, maxSpendable, siblings }) => {
(0, invariant_1.default)(maxSpendable.gt(0), "Spendable balance is too low");
const subAccount = account.subAccounts?.find(a => a.type === "TokenAccount" && a.spendableBalance.gt(0));
const recipient = siblings[0].freshAddress;
(0, invariant_1.default)(subAccount && subAccount.type === "TokenAccount", "no subAccount with jUSDT");
const amount = subAccount.balance.div(1.9 + 0.2 * Math.random()).integerValue();
const updates = [
{
subAccountId: subAccount.id,
},
{
recipient,
},
{
amount,
},
];
if (Math.random() < 0.5)
updates.push({ comment: { isEncrypted: false, text: "LL Bot" } });
return {
transaction: bridge.createTransaction(account),
updates,
};
},
test: ({ account, accountBeforeTransaction, operation, transaction, status }) => {
const subAccountId = transaction.subAccountId;
const subAccount = account.subAccounts?.find(sa => sa.id === subAccountId);
const subAccountBeforeTransaction = accountBeforeTransaction.subAccounts?.find(sa => sa.id === subAccountId);
(0, specs_1.botTest)("subAccount balance moved with the tx status amount", () => (0, expect_1.default)(subAccount?.balance.toString()).toBe(subAccountBeforeTransaction?.balance.minus(status.amount).toString()));
(0, specs_1.botTest)("operation comment", () => (0, expect_1.default)(operation.extra).toMatchObject({
comment: transaction.comment,
}));
},
},
],
};
exports.default = {
tonSpecs,
};
//# sourceMappingURL=specs.js.map