Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions ccip-cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,17 @@
"@coral-xyz/anchor": "^0.29.0",
"@ethers-ext/signer-ledger": "^6.0.0-beta.1",
"@inquirer/prompts": "8.7.0",
"@ledgerhq/hw-transport": "6.35.7",
"@ledgerhq/hw-app-aptos": "6.37.0",
"@ledgerhq/hw-app-canton": "0.12.6",
"@ledgerhq/hw-app-solana": "7.9.0",
"@ledgerhq/hw-transport-node-hid": "6.32.0",
"@mysten/sui": "^2.23.2",
"@solana/web3.js": "^1.98.4",
"@ton-community/ton-ledger": "^7.3.0",
"@ton/crypto": "^3.3.0",
"@ton/ton": "^16.3.0",
"bip32-path": "^0.4.2",
"bs58": "^6.0.0",
"ethers": "6.17.0",
"type-fest": "^5.8.0",
Expand Down
2 changes: 1 addition & 1 deletion ccip-cli/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Error.stackTraceLimit = 50 // show more stack frames for better debugging

// generate:nofail
// `const VERSION = '${require('./package.json').version}-${require('child_process').execSync('git rev-parse --short HEAD').toString().trim()}'`
const VERSION = '1.13.1-e6a58224'
const VERSION = '1.13.1-9e6a7f16'
// generate:end

const require = createRequire(import.meta.url)
Expand Down
77 changes: 35 additions & 42 deletions ccip-cli/src/providers/canton.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,27 +141,26 @@ describe('canton/signer', () => {
describe('Ed25519TransactionSigner.sign()', () => {
it('returns a PartySignatures structure', async () => {
const signer = new Ed25519TransactionSigner(ZERO_SEED_HEX, PARTY_ID)
const result = await signer.sign(SAMPLE_HASH)
const result = await signer.signTxHash(SAMPLE_HASH)

assert.ok(result.signatures, 'result should have signatures array')
assert.equal(result.signatures.length, 1, 'should have one SinglePartySignatures entry')
assert.equal(result.signatures.length, 1, 'should have one Signature entry')
})

it('includes the correct party ID', async () => {
const signer = new Ed25519TransactionSigner(ZERO_SEED_HEX, PARTY_ID)
const result = await signer.sign(SAMPLE_HASH)
const result = await signer.signTxHash(SAMPLE_HASH)

assert.ok(result.signatures[0], 'should have first party signature')
assert.equal(result.signatures[0].party, PARTY_ID, 'party should match constructor argument')
assert.equal(result.party, PARTY_ID, 'party should match constructor argument')
})

it('produces a signature with correct properties', async () => {
const signer = new Ed25519TransactionSigner(ZERO_SEED_HEX, PARTY_ID)
const result = await signer.sign(SAMPLE_HASH)
const result = await signer.signTxHash(SAMPLE_HASH)

assert.ok(result.signatures[0], 'should have first party signature')
assert.ok(result.signatures[0].signatures[0], 'should have first signature')
const sig = result.signatures[0].signatures[0]
const sig = result.signatures[0]

assert.equal(
sig.format,
Expand All @@ -184,10 +183,10 @@ describe('canton/signer', () => {

it('produces a valid Ed25519 signature (64 bytes)', async () => {
const signer = new Ed25519TransactionSigner(ZERO_SEED_HEX, PARTY_ID)
const result = await signer.sign(SAMPLE_HASH)
const result = await signer.signTxHash(SAMPLE_HASH)

assert.ok(result.signatures[0]?.signatures[0], 'should have signature')
const sig = result.signatures[0].signatures[0]
assert.ok(result.signatures[0], 'should have signature')
const sig = result.signatures[0]
assert.ok(sig.signature, 'signature field should be present')
const sigBytes = Buffer.from(sig.signature, 'base64')

Expand All @@ -196,10 +195,10 @@ describe('canton/signer', () => {

it('produces a cryptographically valid signature', async () => {
const signer = new Ed25519TransactionSigner(TEST_SEED_HEX, PARTY_ID)
const result = await signer.sign(SAMPLE_HASH)
const result = await signer.signTxHash(SAMPLE_HASH)

assert.ok(result.signatures[0]?.signatures[0], 'should have signature')
const sig = result.signatures[0].signatures[0]
assert.ok(result.signatures[0], 'should have signature')
const sig = result.signatures[0]
assert.ok(sig.signature, 'signature field should be present')
const sigBytes = Buffer.from(sig.signature, 'base64')

Expand All @@ -217,13 +216,13 @@ describe('canton/signer', () => {
const hash1 = new Uint8Array(32).fill(0xaa)
const hash2 = new Uint8Array(32).fill(0xbb)

const result1 = await signer.sign(hash1)
const result2 = await signer.sign(hash2)
const result1 = await signer.signTxHash(hash1)
const result2 = await signer.signTxHash(hash2)

assert.ok(result1.signatures[0]?.signatures[0]?.signature, 'result1 should have signature')
assert.ok(result2.signatures[0]?.signatures[0]?.signature, 'result2 should have signature')
const sig1 = result1.signatures[0].signatures[0].signature
const sig2 = result2.signatures[0].signatures[0].signature
assert.ok(result1.signatures[0], 'result1 should have signature')
assert.ok(result2.signatures[0], 'result2 should have signature')
const sig1 = result1.signatures[0]
const sig2 = result2.signatures[0]

assert.notEqual(sig1, sig2, 'different hashes should produce different signatures')
})
Expand All @@ -232,13 +231,13 @@ describe('canton/signer', () => {
const signer1 = new Ed25519TransactionSigner(ZERO_SEED_HEX, PARTY_ID)
const signer2 = new Ed25519TransactionSigner(TEST_SEED_HEX, PARTY_ID)

const result1 = await signer1.sign(SAMPLE_HASH)
const result2 = await signer2.sign(SAMPLE_HASH)
const result1 = await signer1.signTxHash(SAMPLE_HASH)
const result2 = await signer2.signTxHash(SAMPLE_HASH)

assert.ok(result1.signatures[0]?.signatures[0]?.signature, 'result1 should have signature')
assert.ok(result2.signatures[0]?.signatures[0]?.signature, 'result2 should have signature')
const sig1 = result1.signatures[0].signatures[0].signature
const sig2 = result2.signatures[0].signatures[0].signature
assert.ok(result1.signatures[0]?.signature, 'result1 should have signature')
assert.ok(result2.signatures[0]?.signature, 'result2 should have signature')
const sig1 = result1.signatures[0].signature
const sig2 = result2.signatures[0].signature

assert.notEqual(sig1, sig2, 'different signers should produce different signatures')
})
Expand All @@ -247,9 +246,9 @@ describe('canton/signer', () => {
const signer = new Ed25519TransactionSigner(ZERO_SEED_HEX, PARTY_ID)
const emptyHash = new Uint8Array(0)

const result = await signer.sign(emptyHash)
assert.ok(result.signatures[0]?.signatures[0], 'should have signature')
const sig = result.signatures[0].signatures[0]
const result = await signer.signTxHash(emptyHash)
assert.ok(result.signatures[0], 'should have signature')
const sig = result.signatures[0]

assert.ok(sig.signature, 'should produce a signature even for empty input')

Expand Down Expand Up @@ -282,30 +281,24 @@ describe('canton/signer', () => {
const signer1 = new Ed25519TransactionSigner(ZERO_SEED_HEX, PARTY_ID)
const signer2 = new Ed25519TransactionSigner(TEST_SEED_HEX, PARTY_ID)

const result1 = await signer1.sign(SAMPLE_HASH)
const result2 = await signer2.sign(SAMPLE_HASH)
const result1 = await signer1.signTxHash(SAMPLE_HASH)
const result2 = await signer2.signTxHash(SAMPLE_HASH)

assert.ok(result1.signatures[0], 'result1 should have party signature')
assert.ok(result2.signatures[0], 'result2 should have party signature')

// Both should have the same party
assert.equal(result1.signatures[0].party, PARTY_ID)
assert.equal(result2.signatures[0].party, PARTY_ID)
assert.equal(result1.party, PARTY_ID)
assert.equal(result2.party, PARTY_ID)

assert.ok(result1.signatures[0].signatures[0], 'result1 should have signature')
assert.ok(result2.signatures[0].signatures[0], 'result2 should have signature')
assert.ok(result1.signatures[0], 'result1 should have signature')
assert.ok(result2.signatures[0], 'result2 should have signature')

// But different fingerprints
assert.notEqual(
result1.signatures[0].signatures[0].signedBy,
result2.signatures[0].signatures[0].signedBy,
)
assert.notEqual(result1.signatures[0].signedBy, result2.signatures[0].signedBy)

// And different signatures
assert.notEqual(
result1.signatures[0].signatures[0].signature,
result2.signatures[0].signatures[0].signature,
)
assert.notEqual(result1.signatures[0].signature, result2.signatures[0].signature)
})
})
})
Loading
Loading