[xc-admin] Add ser/de for Cosmos Upgrades (#758)
* Add ser/de for Cosmos Upgrades * Add comment * Fix print
This commit is contained in:
parent
c2484b1514
commit
99ed193764
|
@ -286,7 +286,13 @@ program
|
|||
keys: ix.keys as AccountMeta[],
|
||||
})
|
||||
);
|
||||
console.log(JSON.stringify(parsed, null, 2));
|
||||
console.log(
|
||||
JSON.stringify(
|
||||
parsed,
|
||||
(key, value) => (typeof value === "bigint" ? value.toString() : value), // return everything else unchanged
|
||||
2
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
multisigCommand("approve", "Approve a transaction sitting in the multisig")
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
import {
|
||||
decodeGovernancePayload,
|
||||
PythGovernanceHeader,
|
||||
} from "../governance_payload";
|
||||
import { CosmosUpgradeContract } from "../governance_payload/UpgradeContract";
|
||||
|
||||
test("Upgrade contract ser/de", (done) => {
|
||||
jest.setTimeout(60000);
|
||||
|
||||
const expectedUpgradeContract = new CosmosUpgradeContract(
|
||||
"injective",
|
||||
BigInt("18446744073709551614")
|
||||
);
|
||||
const buffer = expectedUpgradeContract.encode();
|
||||
|
||||
console.log(buffer.toJSON());
|
||||
expect(
|
||||
buffer.equals(
|
||||
Buffer.from([
|
||||
80, 84, 71, 77, 1, 0, 0, 19, 255, 255, 255, 255, 255, 255, 255, 254,
|
||||
])
|
||||
)
|
||||
).toBeTruthy();
|
||||
|
||||
const actualHeader = PythGovernanceHeader.decode(buffer);
|
||||
|
||||
if (actualHeader) {
|
||||
expect(actualHeader.targetChainId).toBe("injective");
|
||||
expect(actualHeader.action).toBe("UpgradeContract");
|
||||
} else {
|
||||
done("Not an instance of CosmosUpgradeContract");
|
||||
}
|
||||
|
||||
const actualUpgradeContract = decodeGovernancePayload(buffer);
|
||||
|
||||
if (actualUpgradeContract instanceof CosmosUpgradeContract) {
|
||||
expect(actualUpgradeContract.targetChainId).toBe("injective");
|
||||
expect(actualUpgradeContract.codeId).toBe(BigInt("18446744073709551614"));
|
||||
} else {
|
||||
done("Not an instance of CosmosUpgradeContract");
|
||||
}
|
||||
|
||||
done();
|
||||
});
|
|
@ -0,0 +1,38 @@
|
|||
import { ChainName } from "@certusone/wormhole-sdk";
|
||||
import { PythGovernanceAction, PythGovernanceHeader } from ".";
|
||||
|
||||
export class CosmosUpgradeContract implements PythGovernanceAction {
|
||||
readonly targetChainId: ChainName;
|
||||
readonly codeId: bigint;
|
||||
|
||||
constructor(targetChainId: ChainName, codeId: bigint) {
|
||||
this.targetChainId = targetChainId;
|
||||
this.codeId = codeId;
|
||||
}
|
||||
|
||||
static span: number = 8;
|
||||
static decode(data: Buffer): CosmosUpgradeContract | undefined {
|
||||
const header = PythGovernanceHeader.decode(data);
|
||||
if (!header) return undefined;
|
||||
|
||||
const codeId = data.subarray(PythGovernanceHeader.span).readBigUInt64BE();
|
||||
if (!codeId) return undefined;
|
||||
|
||||
return new CosmosUpgradeContract(header.targetChainId, codeId);
|
||||
}
|
||||
|
||||
/** Encode CosmosUpgradeContract */
|
||||
encode(): Buffer {
|
||||
const headerBuffer = new PythGovernanceHeader(
|
||||
this.targetChainId,
|
||||
"UpgradeContract"
|
||||
).encode();
|
||||
|
||||
const buffer = Buffer.alloc(
|
||||
PythGovernanceHeader.span + CosmosUpgradeContract.span
|
||||
);
|
||||
|
||||
const span = buffer.writeBigUInt64BE(this.codeId);
|
||||
return Buffer.concat([headerBuffer, buffer.subarray(0, span)]);
|
||||
}
|
||||
}
|
|
@ -7,6 +7,7 @@ import {
|
|||
import * as BufferLayout from "@solana/buffer-layout";
|
||||
import { PACKET_DATA_SIZE } from "@solana/web3.js";
|
||||
import { ExecutePostedVaa } from "./ExecutePostedVaa";
|
||||
import { CosmosUpgradeContract } from "./UpgradeContract";
|
||||
|
||||
export interface PythGovernanceAction {
|
||||
readonly targetChainId: ChainName;
|
||||
|
@ -148,6 +149,9 @@ export function decodeGovernancePayload(
|
|||
switch (header.action) {
|
||||
case "ExecutePostedVaa":
|
||||
return ExecutePostedVaa.decode(data);
|
||||
case "UpgradeContract":
|
||||
//TO DO : Support non-cosmos upgrades
|
||||
return CosmosUpgradeContract.decode(data);
|
||||
default:
|
||||
return undefined;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue