feat: bridges, PMM, flash workflow, token-aggregation, and deployment docs
- CCIP/trustless bridge contracts, GRU tokens, DEX/PMM tests, reserve vault. - Token-aggregation service routes, planner, chain config, relay env templates. - Config snapshots and multi-chain deployment markdown updates. - gitignore services/btc-intake/dist/ (tsc output); do not track dist. Run forge build && forge test before deploy (large solc graph). Made-with: Cursor
This commit is contained in:
215
services/token-aggregation/src/api/routes/token-mapping.test.ts
Normal file
215
services/token-aggregation/src/api/routes/token-mapping.test.ts
Normal file
@@ -0,0 +1,215 @@
|
||||
import { createServer } from 'http';
|
||||
import express from 'express';
|
||||
import tokenMappingRoutes from './token-mapping';
|
||||
|
||||
jest.mock('../middleware/cache');
|
||||
|
||||
function createApp() {
|
||||
const app = express();
|
||||
app.use('/api/v1/token-mapping', tokenMappingRoutes);
|
||||
return app;
|
||||
}
|
||||
|
||||
async function startServer(app: express.Application): Promise<{ server: ReturnType<typeof createServer>; baseUrl: string }> {
|
||||
const server = createServer(app);
|
||||
await new Promise<void>((resolve) => server.listen(0, () => resolve()));
|
||||
const port = (server.address() as { port: number }).port;
|
||||
return { server, baseUrl: `http://127.0.0.1:${port}` };
|
||||
}
|
||||
|
||||
describe('Token mapping API with GRU Transport overlay', () => {
|
||||
let server: ReturnType<typeof createServer>;
|
||||
let baseUrl: string;
|
||||
const originalChain138Bridge = process.env.CHAIN138_L1_BRIDGE;
|
||||
const originalBscBridge = process.env.CW_BRIDGE_BSC;
|
||||
const originalReserveVerifier = process.env.CW_RESERVE_VERIFIER_CHAIN138;
|
||||
const originalReserveVault = process.env.CW_STABLECOIN_RESERVE_VAULT;
|
||||
const originalReserveSystem = process.env.CW_RESERVE_SYSTEM;
|
||||
const originalMaxOutstanding = process.env.CW_MAX_OUTSTANDING_USDT_BSC;
|
||||
const originalMainnetBridge = process.env.CW_BRIDGE_MAINNET;
|
||||
const originalBtcMainnetOutstanding = process.env.CW_MAX_OUTSTANDING_BTC_MAINNET;
|
||||
const originalOptimismBridge = process.env.CW_BRIDGE_OPTIMISM;
|
||||
const originalGasHybridVerifier = process.env.CW_GAS_HYBRID_CAP_VERIFIER_CHAIN138;
|
||||
const originalGasEscrowVault = process.env.CW_GAS_ESCROW_VAULT_CHAIN138;
|
||||
const originalGasTreasurySystem = process.env.CW_GAS_TREASURY_SYSTEM;
|
||||
const originalEthL2Outstanding = process.env.CW_MAX_OUTSTANDING_ETH_L2_OPTIMISM;
|
||||
const originalEthL2Supply = process.env.CW_GAS_OUTSTANDING_ETH_L2_OPTIMISM;
|
||||
const originalEthL2Escrowed = process.env.CW_GAS_ESCROWED_ETH_L2_OPTIMISM;
|
||||
const originalEthL2Treasury = process.env.CW_GAS_TREASURY_BACKED_ETH_L2_OPTIMISM;
|
||||
const originalEthL2Cap = process.env.CW_GAS_TREASURY_CAP_ETH_L2_OPTIMISM;
|
||||
const originalCwL1Bridge = process.env.CW_L1_BRIDGE;
|
||||
const originalCwL1BridgeChain138 = process.env.CW_L1_BRIDGE_CHAIN138;
|
||||
|
||||
beforeAll(async () => {
|
||||
const started = await startServer(createApp());
|
||||
server = started.server;
|
||||
baseUrl = started.baseUrl;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
if (originalChain138Bridge === undefined) {
|
||||
delete process.env.CHAIN138_L1_BRIDGE;
|
||||
} else {
|
||||
process.env.CHAIN138_L1_BRIDGE = originalChain138Bridge;
|
||||
}
|
||||
if (originalBscBridge === undefined) {
|
||||
delete process.env.CW_BRIDGE_BSC;
|
||||
} else {
|
||||
process.env.CW_BRIDGE_BSC = originalBscBridge;
|
||||
}
|
||||
if (originalReserveVerifier === undefined) {
|
||||
delete process.env.CW_RESERVE_VERIFIER_CHAIN138;
|
||||
} else {
|
||||
process.env.CW_RESERVE_VERIFIER_CHAIN138 = originalReserveVerifier;
|
||||
}
|
||||
if (originalReserveVault === undefined) {
|
||||
delete process.env.CW_STABLECOIN_RESERVE_VAULT;
|
||||
} else {
|
||||
process.env.CW_STABLECOIN_RESERVE_VAULT = originalReserveVault;
|
||||
}
|
||||
if (originalReserveSystem === undefined) {
|
||||
delete process.env.CW_RESERVE_SYSTEM;
|
||||
} else {
|
||||
process.env.CW_RESERVE_SYSTEM = originalReserveSystem;
|
||||
}
|
||||
if (originalMaxOutstanding === undefined) {
|
||||
delete process.env.CW_MAX_OUTSTANDING_USDT_BSC;
|
||||
} else {
|
||||
process.env.CW_MAX_OUTSTANDING_USDT_BSC = originalMaxOutstanding;
|
||||
}
|
||||
if (originalMainnetBridge === undefined) {
|
||||
delete process.env.CW_BRIDGE_MAINNET;
|
||||
} else {
|
||||
process.env.CW_BRIDGE_MAINNET = originalMainnetBridge;
|
||||
}
|
||||
if (originalBtcMainnetOutstanding === undefined) {
|
||||
delete process.env.CW_MAX_OUTSTANDING_BTC_MAINNET;
|
||||
} else {
|
||||
process.env.CW_MAX_OUTSTANDING_BTC_MAINNET = originalBtcMainnetOutstanding;
|
||||
}
|
||||
for (const [key, value] of Object.entries({
|
||||
CW_BRIDGE_OPTIMISM: originalOptimismBridge,
|
||||
CW_GAS_HYBRID_CAP_VERIFIER_CHAIN138: originalGasHybridVerifier,
|
||||
CW_GAS_ESCROW_VAULT_CHAIN138: originalGasEscrowVault,
|
||||
CW_GAS_TREASURY_SYSTEM: originalGasTreasurySystem,
|
||||
CW_MAX_OUTSTANDING_ETH_L2_OPTIMISM: originalEthL2Outstanding,
|
||||
CW_GAS_OUTSTANDING_ETH_L2_OPTIMISM: originalEthL2Supply,
|
||||
CW_GAS_ESCROWED_ETH_L2_OPTIMISM: originalEthL2Escrowed,
|
||||
CW_GAS_TREASURY_BACKED_ETH_L2_OPTIMISM: originalEthL2Treasury,
|
||||
CW_GAS_TREASURY_CAP_ETH_L2_OPTIMISM: originalEthL2Cap,
|
||||
})) {
|
||||
if (value === undefined) {
|
||||
delete process.env[key];
|
||||
} else {
|
||||
process.env[key] = value;
|
||||
}
|
||||
}
|
||||
if (originalCwL1Bridge === undefined) {
|
||||
delete process.env.CW_L1_BRIDGE;
|
||||
} else {
|
||||
process.env.CW_L1_BRIDGE = originalCwL1Bridge;
|
||||
}
|
||||
if (originalCwL1BridgeChain138 === undefined) {
|
||||
delete process.env.CW_L1_BRIDGE_CHAIN138;
|
||||
} else {
|
||||
process.env.CW_L1_BRIDGE_CHAIN138 = originalCwL1BridgeChain138;
|
||||
}
|
||||
});
|
||||
|
||||
afterAll((done) => {
|
||||
server.close(done);
|
||||
});
|
||||
|
||||
it('returns the active GRU transport overlay', async () => {
|
||||
const res = await fetch(`${baseUrl}/api/v1/token-mapping/transport/active`);
|
||||
expect(res.status).toBe(200);
|
||||
const body = (await res.json()) as Record<string, unknown>;
|
||||
expect(body.system).toMatchObject({
|
||||
name: 'GRU Monetary Transport Layer',
|
||||
shortName: 'GRU Transport',
|
||||
});
|
||||
expect(Array.isArray(body.transportPairs)).toBe(true);
|
||||
expect((body.transportPairs as unknown[]).length).toBeGreaterThan(0);
|
||||
expect(body.counts).toMatchObject({
|
||||
transportPairs: expect.any(Number),
|
||||
runtimeReadyTransportPairs: expect.any(Number),
|
||||
});
|
||||
});
|
||||
|
||||
it('resolves active cUSDT transport from Chain 138 to BSC', async () => {
|
||||
process.env.CHAIN138_L1_BRIDGE = '0x3333333333333333333333333333333333333333';
|
||||
process.env.CW_BRIDGE_BSC = '0x4444444444444444444444444444444444444444';
|
||||
process.env.CW_RESERVE_VERIFIER_CHAIN138 = '0x5555555555555555555555555555555555555555';
|
||||
process.env.CW_STABLECOIN_RESERVE_VAULT = '0x6666666666666666666666666666666666666666';
|
||||
process.env.CW_RESERVE_SYSTEM = '0x7777777777777777777777777777777777777777';
|
||||
process.env.CW_MAX_OUTSTANDING_USDT_BSC = '1000000';
|
||||
|
||||
const source = '0x93E66202A11B1772E55407B32B44e5Cd8eda7f22';
|
||||
const res = await fetch(
|
||||
`${baseUrl}/api/v1/token-mapping/resolve?fromChain=138&toChain=56&address=${source}`
|
||||
);
|
||||
|
||||
expect(res.status).toBe(200);
|
||||
const body = (await res.json()) as Record<string, unknown>;
|
||||
expect(body.addressOnTarget).toBe('0x9a1D0dBEE997929ED02fD19E0E199704d20914dB');
|
||||
expect(body.activeTransportEligible).toBe(true);
|
||||
expect(body.gruTransportRuntimeReady).toBe(true);
|
||||
expect(body.gruTransportPairKey).toBe('138-56-cUSDT-cWUSDT');
|
||||
expect(body.gruTransportCanonicalToken).toMatchObject({
|
||||
symbol: 'cUSDT',
|
||||
activeVersion: 'v1',
|
||||
x402PreferredVersion: 'v2',
|
||||
});
|
||||
});
|
||||
|
||||
it('resolves active cBTC transport from Chain 138 to Ethereum mainnet', async () => {
|
||||
process.env.CHAIN138_L1_BRIDGE = '0x3333333333333333333333333333333333333333';
|
||||
process.env.CW_BRIDGE_MAINNET = '0x4444444444444444444444444444444444444444';
|
||||
process.env.CW_RESERVE_VERIFIER_CHAIN138 = '0x5555555555555555555555555555555555555555';
|
||||
process.env.CW_STABLECOIN_RESERVE_VAULT = '0x6666666666666666666666666666666666666666';
|
||||
process.env.CW_RESERVE_SYSTEM = '0x7777777777777777777777777777777777777777';
|
||||
process.env.CW_MAX_OUTSTANDING_BTC_MAINNET = '2100000000000000';
|
||||
|
||||
const source = '0xcb7c000000000000000000000000000000000138';
|
||||
const res = await fetch(
|
||||
`${baseUrl}/api/v1/token-mapping/resolve?fromChain=138&toChain=1&address=${source}`
|
||||
);
|
||||
|
||||
expect(res.status).toBe(200);
|
||||
const body = (await res.json()) as Record<string, unknown>;
|
||||
expect(body.addressOnTarget).toBe('0xcb7c000000000000000000000000000000000001');
|
||||
expect(body.activeTransportEligible).toBe(true);
|
||||
expect(body.gruTransportRuntimeReady).toBe(true);
|
||||
expect(body.gruTransportPairKey).toBe('138-1-cBTC-cWBTC');
|
||||
});
|
||||
|
||||
it('resolves gas-family transport metadata for the shared ETH L2 lane', async () => {
|
||||
process.env.CHAIN138_L1_BRIDGE = '0x3333333333333333333333333333333333333333';
|
||||
process.env.CW_BRIDGE_OPTIMISM = '0x4444444444444444444444444444444444444444';
|
||||
process.env.CW_GAS_HYBRID_CAP_VERIFIER_CHAIN138 = '0x5555555555555555555555555555555555555555';
|
||||
process.env.CW_GAS_ESCROW_VAULT_CHAIN138 = '0x6666666666666666666666666666666666666666';
|
||||
process.env.CW_GAS_TREASURY_SYSTEM = '0x7777777777777777777777777777777777777777';
|
||||
process.env.CW_MAX_OUTSTANDING_ETH_L2_OPTIMISM = '125';
|
||||
process.env.CW_GAS_OUTSTANDING_ETH_L2_OPTIMISM = '125';
|
||||
process.env.CW_GAS_ESCROWED_ETH_L2_OPTIMISM = '100';
|
||||
process.env.CW_GAS_TREASURY_BACKED_ETH_L2_OPTIMISM = '25';
|
||||
process.env.CW_GAS_TREASURY_CAP_ETH_L2_OPTIMISM = '25';
|
||||
|
||||
/** Matches token-mapping-multichain.json 138→10 Compliant_ETH_L2_cW (not FALLBACK cETHL2 placeholder). */
|
||||
const source = '0x18a6b163d255cc0cb32b99697843b487d059907d';
|
||||
const res = await fetch(
|
||||
`${baseUrl}/api/v1/token-mapping/resolve?fromChain=138&toChain=10&address=${source}`
|
||||
);
|
||||
|
||||
expect(res.status).toBe(200);
|
||||
const body = (await res.json()) as Record<string, unknown>;
|
||||
expect(body.addressOnTarget).toBe('0x95007ec50d0766162f77848edf7bdc4eba147fb4');
|
||||
expect(body.activeTransportEligible).toBe(true);
|
||||
expect(body.gruTransportRuntimeReady).toBe(true);
|
||||
expect(body.gruTransportPairKey).toBe('138-10-cETHL2-cWETHL2');
|
||||
expect(body.gruTransportAssetClass).toBe('gas_native');
|
||||
expect(body.gruTransportFamilyKey).toBe('eth_l2');
|
||||
expect(body.gruTransportBackingMode).toBe('hybrid_cap');
|
||||
expect(body.gruTransportRedeemPolicy).toBe('family_fungible_inventory_gated');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user