Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Native AvalancheJS transactions in L1 Wizard #1995

Closed
wants to merge 14 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
convert warp works
  • Loading branch information
containerman17 committed Jan 13, 2025
commit ba31cfc0bd9041e1f3a59ee0a56bb3b3f828dcee
20 changes: 16 additions & 4 deletions components/tools/L1Launcher/DeployContracts/convertWarp.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { describe, it, expect } from 'vitest';
import { addressCallBytes, MarshalSubnetToL1ConversionData, MarshalSubnetToL1ConversionDataArgs, PackL1ConversionMessage, SubnetToL1ConversionID, packWarpMessage } from './convertWarp';
import { getAddressCallBytes, MarshalSubnetToL1ConversionData, MarshalSubnetToL1ConversionDataArgs, PackL1ConversionMessage, SubnetToL1ConversionID, packWarpMessage, addressedCallPayloadFromL1ConversionID } from './convertWarp';
import { bytesToHex, hexToBytes } from 'viem';
import { cb58ToBytes } from '../utils/cb58';

const node1PopJson = `{"nodeID":"NodeID-FTbzbUVtjSpKC4nFFFM9Gb8iAqJKZpzMQ","nodePOP":{"publicKey":"0xa2ea5071b185225223ceb743fe265b47905fff03c64d6517733b9f79bde4937bfab0a7b903e697e2b4b5b90a7aa74427","proofOfPossession":"0x98b52bcfbbb9425f14ca97aedcfc318e00f92daaac711cb0b6a7da4af9c9aac20f4ce986f45165747c4f5ece93860c250640e060a0ac6af89c95f2aadff1eb2515bb9fdd05dbdfa12bf63ba7e07dc53b94f37c31a3ecc680fdb76cc300821b8c"}}`;
const node2PopJson = `{"nodeID":"NodeID-5o3bfUMfJhxfKYSKu3VyiAq7APVZNyX19","nodePOP":{"publicKey":"0xa09e63e32ce3b24205455bc470b54d6260bc826821857458b67adcab63ea842b392407b9dff0564ce520f6337ac2b5ca","proofOfPossession":"0x83fdae9dc276b17c8fe21f2800b6794466102d17d59ff914e667ed2ba4fecd948ad226b7d3aec6e5c813a303ef58429919ee029472646c582e636b07051fc495ae4c12f3b624f87945a489d5902472e53239a9a1417be83ecd6c9cd987f32663"}}`;
Expand Down Expand Up @@ -41,19 +42,19 @@ describe('MarshalSubnetToL1ConversionData', () => {

cases.forEach(({ name, sourceAddress, payload, expected }) => {
it(name, () => {
const result = addressCallBytes(sourceAddress, payload);
const result = getAddressCallBytes(sourceAddress, payload);
expect(bytesToHex(result)).toBe(expected);
});
});
});

it.skip('packs L1 conversion message', () => {
it('packs L1 conversion message', () => {
const expectedMessage = "0x" + "000000000005" + //fuji ID
"0000000000000000000000000000000000000000000000000000000000000000" + //platform chain id
"00000034" + // ?
"0000000000010000000000000026000000000000ae4984e3c1f0b73c2e160b899295e4a2d44b2229f23bdb7b8eccbbbcb0ba7d93" //subnetConversionAddressedCall

const message = PackL1ConversionMessage(defaultArgs, 5);
const message = PackL1ConversionMessage(defaultArgs, 5, "11111111111111111111111111111111LpoYY");
expect(bytesToHex(message)).toBe(expectedMessage);
});

Expand All @@ -72,4 +73,15 @@ describe('MarshalSubnetToL1ConversionData', () => {
"11223344" // message
);
});

it('creates addressed call payload from L1 conversion ID', () => {
const subnetConversionID = cb58ToBytes("PFWYqXhRtrKGRvnSwCpxMXKa9d1pHmY8ASzu8mRCCBCb25p17");
const result = addressedCallPayloadFromL1ConversionID(subnetConversionID);

expect(bytesToHex(result)).toBe("0x" +
"0000" + // codec version
"00000000" + // empty source address length
"32858f45b192eeb190e643f6915d45f832def5d2021b77b151867ec29843af18" // subnetConversionID bytes
);
});
});
36 changes: 29 additions & 7 deletions components/tools/L1Launcher/DeployContracts/convertWarp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import { sha256 } from '@noble/hashes/sha256';
import { cb58ToBytes } from "../utils/cb58";
import { pvmSerial, } from '@avalabs/avalanchejs';
import { bytesToHex } from 'viem';

export interface MarshalSubnetToL1ConversionDataArgs {
subnetId: string;
Expand Down Expand Up @@ -101,22 +102,43 @@ export const SubnetToL1ConversionID = (args: MarshalSubnetToL1ConversionDataArgs
return sha256(data);
}

export const addressCallBytes = (sourceAddress: Uint8Array, conversionID: Uint8Array): Uint8Array => {
export const getAddressCallBytes = (sourceAddress: Uint8Array, conversionID: Uint8Array): Uint8Array => {
const parts: Uint8Array[] = [];

parts.push(encodeUint16(codecVersion));
parts.push(encodeInt32(1));//FIXME: I have zero idea what this is, but every time it is "00000001"
parts.push(encodeInt32(sourceAddress.length));
parts.push(sourceAddress);
parts.push(encodeInt32(conversionID.length));
parts.push(conversionID);
parts.push(encodeVarBytes(sourceAddress));
parts.push(encodeVarBytes(conversionID));

return concatenateUint8Arrays(...parts);
}

export function addressedCallPayloadFromL1ConversionID(subnetConversionID: Uint8Array): Uint8Array {
const parts: Uint8Array[] = [];

// Add codec version (uint16)
parts.push(encodeUint16(codecVersion));

// Add empty source address length (uint32)
parts.push(encodeInt32(0));

// Add subnetConversionID
parts.push(subnetConversionID);

return concatenateUint8Arrays(...parts);
}

export function PackL1ConversionMessage(args: MarshalSubnetToL1ConversionDataArgs, networkID: number, sourceChainID: string): Uint8Array {
const subnetConversionID = SubnetToL1ConversionID(args);

console.log("subnetConversionID: ", bytesToHex(subnetConversionID))
const addressedCallPayload = addressedCallPayloadFromL1ConversionID(subnetConversionID)
console.log("addressedCallPayload: ", bytesToHex(addressedCallPayload))

const subnetConversionAddressedCall = getAddressCallBytes(new Uint8Array([]), addressedCallPayload)
console.log("subnetConversionAddressedCall: ", bytesToHex(subnetConversionAddressedCall))

export function PackL1ConversionMessage(args: MarshalSubnetToL1ConversionDataArgs, networkID: number): Uint8Array {
throw new Error("Not implemented");
return packWarpMessage(networkID, sourceChainID, subnetConversionAddressedCall);
}

export function packWarpMessage(networkID: number, sourceChainID: string, message: Uint8Array): Uint8Array {
Expand Down
2 changes: 2 additions & 0 deletions components/tools/L1Launcher/utils/cb58.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export function cb58ToBytes(cb58: string): Uint8Array {
return decodedBytes.slice(0, -CHECKSUM_LENGTH);
}


export function cb58ToHex(cb58: string, include0x: boolean = true): string {
const rawBytes = cb58ToBytes(cb58);
return (include0x ? '0x' : '') + bytesToHex(rawBytes);
Expand All @@ -34,3 +35,4 @@ export function hexToCB58(hex: string): string {

return base58.encode(combined);
}