duly / test/chains.test.mjs · raw
import test from 'node:test';import assert from 'node:assert/strict';import { addressOk, chainName, groupTokens, parseRefundTag, refundTag } from '../web/lib/chains.js';test('addresses are checked per chain', () => {  assert.ok(addressOk('base', '0x8d9716a9f13fe82ba59e74b3ce032842eb357818'));  assert.ok(!addressOk('base', '0x123'));  assert.ok(!addressOk('base', 'alice.near'));  assert.ok(addressOk('sol', '9cYFzrmHRcsYzLhAWsNemzCy75ZhETn2px4MS8oDDReR'));  assert.ok(!addressOk('sol', '0x8d9716a9f13fe82ba59e74b3ce032842eb357818'));  assert.ok(addressOk('btc', 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'));  assert.ok(addressOk('near', 'alice.near'));  assert.ok(!addressOk('near', 'Alice!'));});test('popular tokens and chains come first, and bad rows are skipped', () => {  const g = groupTokens([    { assetId: 'a', symbol: 'ZZZ', blockchain: 'eth' },    { assetId: 'b', symbol: 'USDC', blockchain: 'eth' },    { assetId: 'c', symbol: 'USDC', blockchain: 'base' },    { assetId: '', symbol: 'BAD', blockchain: 'eth' },  ]);  assert.deepEqual(g.map((x) => x.symbol), ['USDC', 'ZZZ']);  assert.deepEqual(g[0].options.map((o) => o.blockchain), ['base', 'eth']);});test('refund tags only pass what the contract would store', () => {  assert.equal(refundTag('base', 'USDC', '0xabc'), 'base:USDC:0xabc');  assert.equal(refundTag('base', 'U$D', '0xabc'), '');  assert.equal(refundTag('base', 'USDC', 'x'.repeat(90)), '');  assert.deepEqual(parseRefundTag('base:USDC:0xabc'), { chain: 'base', symbol: 'USDC', address: '0xabc' });  assert.equal(parseRefundTag(''), null);  assert.equal(chainName('unknownchain'), 'unknownchain');});test('a coin lists its home chain first', () => {  const g = groupTokens([    { assetId: 'a', symbol: 'BTC', blockchain: 'near' },    { assetId: 'b', symbol: 'BTC', blockchain: 'btc' },  ]);  assert.equal(g[0].options[0].blockchain, 'btc');});