ox
Version:
94 lines (79 loc) • 3.15 kB
text/typescript
import { Hex } from 'ox'
import { TokenId } from 'ox/tempo'
import { expect, test } from 'vitest'
test('from', () => {
expect(TokenId.from(0n)).toBe(0n)
expect(TokenId.from(0x1)).toBe(1n)
expect(TokenId.from(0xdef)).toBe(0xdefn)
expect(TokenId.from('0x20c0000000000000000000000000000000000000')).toBe(0n)
expect(TokenId.from('0x20c0000000000000000000000000000000000001')).toBe(1n)
expect(TokenId.from('0x20c0000000000000000000000000000000000def')).toBe(
0xdefn,
)
})
test('fromAddress', () => {
expect(
TokenId.fromAddress('0x20c0000000000000000000000000000000000000'),
).toBe(0n)
expect(
TokenId.fromAddress('0x20c0000000000000000000000000000000000001'),
).toBe(1n)
expect(
TokenId.fromAddress('0x20c0000000000000000000000000000000000def'),
).toBe(0xdefn)
// tempo address input
const tempoAddr = 'tempox0x20c0000000000000000000000000000000000001'
expect(TokenId.fromAddress(tempoAddr)).toBe(1n)
})
test('toAddress', () => {
expect(TokenId.toAddress(0n)).toBe(
'0x20c0000000000000000000000000000000000000',
)
expect(TokenId.toAddress('0x20c0000000000000000000000000000000000000')).toBe(
'0x20c0000000000000000000000000000000000000',
)
expect(TokenId.toAddress(1n)).toBe(
'0x20c0000000000000000000000000000000000001',
)
expect(TokenId.toAddress(0xdefn)).toBe(
'0x20c0000000000000000000000000000000000def',
)
// tempo address input
const tempoAddr = 'tempox0x20c0000000000000000000000000000000000001'
expect(TokenId.toAddress(tempoAddr)).toBe(
'0x20C0000000000000000000000000000000000001',
)
})
test('compute', () => {
const sender = '0x1234567890123456789012345678901234567890'
const salt1 =
'0x0000000000000000000000000000000000000000000000000000000000000001'
const salt2 =
'0x0000000000000000000000000000000000000000000000000000000000000002'
const id1 = TokenId.compute({ sender, salt: salt1 })
const id2 = TokenId.compute({ sender, salt: salt2 })
const address1 = TokenId.toAddress(id1)
const address2 = TokenId.toAddress(id2)
// deterministic: same inputs produce same output
expect(TokenId.compute({ sender, salt: salt1 })).toBe(id1)
// different salts produce different addresses
expect(address1).not.toBe(address2)
// address suffix matches id
expect(Hex.slice(address1, 12)).toBe(Hex.fromNumber(id1, { size: 8 }))
// addresses have TIP-20 prefix (0x20c0 followed by zeroes for 12 bytes total)
expect(address1.toLowerCase().startsWith('0x20c000000000000000000000')).toBe(
true,
)
expect(address2.toLowerCase().startsWith('0x20c000000000000000000000')).toBe(
true,
)
// addresses are 20 bytes (40 hex chars + 0x prefix)
expect(address1.length).toBe(42)
// different senders produce different addresses
const otherSender = '0xabcdefabcdefabcdefabcdefabcdefabcdefabcd'
const address3 = TokenId.compute({ sender: otherSender, salt: salt1 })
expect(address3).not.toBe(address1)
// tempo address input produces same result
const tempoSender = 'tempox0x1234567890123456789012345678901234567890'
expect(TokenId.compute({ sender: tempoSender, salt: salt1 })).toBe(id1)
})