Skip to content
5 changes: 5 additions & 0 deletions .changeset/tempo-funding.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ox": patch
---

Added Tempo funding transaction codecs, committed policy rules, native DEX funding payloads, and access key funding authorization.
61 changes: 61 additions & 0 deletions src/tempo/FundingPolicy.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { describe, expect, test } from 'vitest'
import * as FundingPolicy from './FundingPolicy.js'

const token = '0x0101010101010101010101010101010101010101' as const
const target = '0x0202020202020202020202020202020202020202' as const
const requirement = {
token,
amount: 50n,
sources: [{ target, data: '0xab' as const }],
slippageBps: 100,
}

const rules = {
maxSlippageBps: 100,
sources: { [token]: requirement.sources },
}
describe('encode', () => {
test('ABI encodes, decodes and hashes canonical rules', () => {
expect(FundingPolicy.decode(FundingPolicy.encode(rules))).toEqual(rules)
expect(FundingPolicy.hash(rules)).toMatch(/^0x[0-9a-f]{64}$/)
expect(() =>
FundingPolicy.decode(`${FundingPolicy.encode(rules)}00`),
).toThrow()
})
})

describe('hash', () => {
test('canonical token order preserves significant source order', () => {
const second = '0x0303030303030303030303030303030303030303'
const first = {
...rules,
sources: { [second]: requirement.sources, [token]: requirement.sources },
}
const reordered = {
...rules,
sources: { [token]: requirement.sources, [second]: requirement.sources },
}
expect(FundingPolicy.encode(first)).toBe(FundingPolicy.encode(reordered))
const sources = [...requirement.sources, { target, data: '0xcd' as const }]
expect(
FundingPolicy.hash({ ...rules, sources: { [token]: sources } }),
).not.toBe(
FundingPolicy.hash({
...rules,
sources: { [token]: [...sources].reverse() },
}),
)
})
})

describe('toTuple', () => {
test('rejects invalid policy IDs and admins', () => {
for (const value of [
0n,
2n ** 64n,
{ admins: [], rules },
{ admins: [token, token], rules },
])
expect(() => FundingPolicy.toTuple(value)).toThrow()
})
})
Loading
Loading