62 lines
2.6 KiB
TypeScript
62 lines
2.6 KiB
TypeScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { decodeToken } from '@trumpsignal/core/crypto'
|
|
import {
|
|
protectiveStopPct,
|
|
deriskLadder,
|
|
isSystem2,
|
|
isSupportedTradingSource,
|
|
} from '@trumpsignal/core/signal-categories'
|
|
import { buildMessage, bodyHash } from '@trumpsignal/core/signed-request'
|
|
import { simulateExit } from '@trumpsignal/core/backtest'
|
|
import { computeComposite } from '@trumpsignal/core/macro-scoring'
|
|
// Fernet's published cross-language verification vector, not generated by this implementation.
|
|
// https://github.com/fernet/spec/blob/master/verify.json
|
|
const token =
|
|
'gAAAAAAdwJ6wAAECAwQFBgcICQoLDA0ODy021cpGVWKZ_eEwCGM4BLLF_5CV9dOPmrhuVUPgJobwOz7JcbmrR64jVmpU4IwqDA=='
|
|
const secret = Buffer.from('cw_0x689RpI-jtRR7oE8h_eQsKImvJapLeSbXpwF4e4=', 'base64url')
|
|
test('reads the external Fernet verification vector and rejects tampering', () => {
|
|
assert.equal(decodeToken(token, secret), 'hello')
|
|
const raw = Buffer.from(token, 'base64url')
|
|
raw[30] ^= 1
|
|
assert.throws(() => decodeToken(raw.toString('base64url'), secret))
|
|
})
|
|
test('System 2 remains distinct from Trump and funding is alert-only', () => {
|
|
assert.equal(isSystem2('truth'), false)
|
|
assert.equal(isSystem2('btc_bottom_reversal'), true)
|
|
assert.equal(isSupportedTradingSource('funding_reversal'), false)
|
|
assert.equal(isSupportedTradingSource('unknown'), false)
|
|
})
|
|
test('actual leverage sets the final de-risk level inside liquidation', () => {
|
|
assert.equal(protectiveStopPct(2), 35)
|
|
assert.equal(protectiveStopPct(10), 8.5)
|
|
assert.deepEqual(deriskLadder(10, 'aggressive'), [
|
|
[-5.1, 0.25, false],
|
|
[-6.8, 0.25, false],
|
|
[-8.5, 0.5, true],
|
|
])
|
|
})
|
|
test('signed bodies cannot be reordered or substituted', () => {
|
|
assert.equal(bodyHash({ b: 2, a: 1 }), bodyHash({ a: 1, b: 2 }))
|
|
assert.notEqual(bodyHash({ trade_id: 1 }), bodyHash({ trade_id: 2 }))
|
|
assert.equal(
|
|
buildMessage('view_user', '0xABC', 123, null),
|
|
'TrumpSignal · view_user\nwallet: 0xabc\ntimestamp: 123\nbody: -',
|
|
)
|
|
})
|
|
test('a bar hitting stop and take-profit takes the conservative stop path', () => {
|
|
const result = simulateExit([{ time_ms: 0, open: 100, high: 110, low: 90, close: 105 }], 'long', {
|
|
stop_loss_pct: 1.5,
|
|
take_profit_pct: 2,
|
|
trailing_stop_pct: null,
|
|
trailing_activate_at_pct: null,
|
|
max_hold_hours: 6,
|
|
})
|
|
assert.equal(result.reason, 'stop_loss')
|
|
assert.equal(result.pnl_pct, -1.5)
|
|
})
|
|
test('missing macro data is excluded, not silently treated as neutral', () => {
|
|
assert.deepEqual(computeComposite({}), [null, null])
|
|
assert.deepEqual(computeComposite({ fear_greed: 0, btc_open_interest_usd: 1e12 }), [100, 'BULL'])
|
|
})
|