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');});