Skip to content

Commit f61d4dd

Browse files
authored
feat(target_chains/sui): add iota network (#2428)
* chore(target_chains/sui): vendor wormhole dependencies for iota * chore(target_chains/sui): add new chain ids for new networks * chore(target_chains/sui): add iota cli and sdk packages with no change * chore(target_chains/sui): update iota_testnet move.toml and use iota libs * feat(target_chains/sui): add iota js sdk * feat(contract_manager): add support for iota * feat(target_chains/sui): add iota cli lib * chore(target_chains/sui): add some misc files math lib is deprecated. * fix: address feedbacks * fix: remove any
1 parent 4ab8195 commit f61d4dd

File tree

170 files changed

+30368
-128
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

170 files changed

+30368
-128
lines changed

contract_manager/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"@cosmjs/cosmwasm-stargate": "^0.32.3",
2727
"@cosmjs/stargate": "^0.32.3",
2828
"@injectivelabs/networks": "^1.14.6",
29+
"@iota/iota-sdk": "^0.5.0",
2930
"@mysten/sui": "^1.3.0",
3031
"@pythnetwork/client": "catalog:",
3132
"@pythnetwork/cosmwasm-deploy-tools": "workspace:*",
@@ -36,6 +37,7 @@
3637
"@pythnetwork/pyth-sdk-solidity": "workspace:^",
3738
"@pythnetwork/pyth-starknet-js": "^0.2.1",
3839
"@pythnetwork/pyth-sui-js": "workspace:*",
40+
"@pythnetwork/pyth-iota-js": "workspace:*",
3941
"@pythnetwork/pyth-ton": "workspace:*",
4042
"@pythnetwork/pyth-ton-js": "workspace:*",
4143
"@pythnetwork/solana-utils": "workspace:^",

contract_manager/scripts/sync_wormhole_guardian_set.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
CosmWasmPriceFeedContract,
66
DefaultStore,
77
EvmPriceFeedContract,
8+
IotaWormholeContract,
89
SuiWormholeContract,
910
toPrivateKey,
1011
} from "../src";
@@ -32,6 +33,7 @@ async function main() {
3233
for (const contract of Object.values(DefaultStore.wormhole_contracts)) {
3334
if (
3435
contract instanceof SuiWormholeContract ||
36+
contract instanceof IotaWormholeContract ||
3537
contract instanceof AptosWormholeContract
3638
) {
3739
if (chains && !chains.includes(contract.getChain().getId())) {

contract_manager/src/chains.ts

Lines changed: 80 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ import {
2020
InjectiveExecutor,
2121
} from "@pythnetwork/cosmwasm-deploy-tools";
2222
import { Network } from "@injectivelabs/networks";
23+
import { IotaClient } from "@iota/iota-sdk/client";
2324
import { SuiClient } from "@mysten/sui/client";
24-
import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519";
25+
import { Ed25519Keypair as IotaEd25519Keypair } from "@iota/iota-sdk/keypairs/ed25519";
26+
import { Ed25519Keypair as SuiEd25519Keypair } from "@mysten/sui/keypairs/ed25519";
2527
import { TokenId } from "./token";
2628
import { BN, Provider, Wallet, WalletUnlocked } from "fuels";
2729
import { FUEL_ETH_ASSET_ID } from "@pythnetwork/pyth-fuel-js";
@@ -38,6 +40,8 @@ import { keyPairFromSeed } from "@ton/crypto";
3840
import { PythContract } from "@pythnetwork/pyth-ton-js";
3941
import * as nearAPI from "near-api-js";
4042
import * as bs58 from "bs58";
43+
import { MIST_PER_SUI } from "@mysten/sui/utils";
44+
import { NANOS_PER_IOTA } from "@iota/iota-sdk/utils";
4145
import * as chains from "viem/chains";
4246

4347
/**
@@ -337,8 +341,8 @@ export class SuiChain extends Chain {
337341
}
338342

339343
async getAccountAddress(privateKey: PrivateKey): Promise<string> {
340-
const keypair = Ed25519Keypair.fromSecretKey(
341-
Buffer.from(privateKey, "hex")
344+
const keypair = SuiEd25519Keypair.fromSecretKey(
345+
new Uint8Array(Buffer.from(privateKey, "hex"))
342346
);
343347
return keypair.toSuiAddress();
344348
}
@@ -348,7 +352,73 @@ export class SuiChain extends Chain {
348352
const balance = await provider.getBalance({
349353
owner: await this.getAccountAddress(privateKey),
350354
});
351-
return Number(balance.totalBalance) / 10 ** 9;
355+
return Number(balance.totalBalance) / Number(MIST_PER_SUI);
356+
}
357+
}
358+
359+
export class IotaChain extends Chain {
360+
static type = "IotaChain";
361+
362+
constructor(
363+
id: string,
364+
mainnet: boolean,
365+
wormholeChainName: string,
366+
nativeToken: TokenId | undefined,
367+
public rpcUrl: string
368+
) {
369+
super(id, mainnet, wormholeChainName, nativeToken);
370+
}
371+
372+
static fromJson(parsed: ChainConfig): IotaChain {
373+
if (parsed.type !== IotaChain.type) throw new Error("Invalid type");
374+
return new IotaChain(
375+
parsed.id,
376+
parsed.mainnet,
377+
parsed.wormholeChainName,
378+
parsed.nativeToken,
379+
parsed.rpcUrl
380+
);
381+
}
382+
383+
toJson(): KeyValueConfig {
384+
return {
385+
id: this.id,
386+
wormholeChainName: this.wormholeChainName,
387+
mainnet: this.mainnet,
388+
rpcUrl: this.rpcUrl,
389+
type: IotaChain.type,
390+
};
391+
}
392+
393+
getType(): string {
394+
return IotaChain.type;
395+
}
396+
397+
/**
398+
* Returns the payload for a governance contract upgrade instruction for contracts deployed on this chain
399+
* @param digest hex string of the 32 byte digest for the new package without the 0x prefix
400+
*/
401+
generateGovernanceUpgradePayload(digest: string): Buffer {
402+
return new UpgradeContract256Bit(this.wormholeChainName, digest).encode();
403+
}
404+
405+
getProvider(): IotaClient {
406+
return new IotaClient({ url: this.rpcUrl });
407+
}
408+
409+
async getAccountAddress(privateKey: PrivateKey): Promise<string> {
410+
const keypair = IotaEd25519Keypair.fromSecretKey(
411+
new Uint8Array(Buffer.from(privateKey, "hex"))
412+
);
413+
return keypair.toIotaAddress();
414+
}
415+
416+
async getAccountBalance(privateKey: PrivateKey): Promise<number> {
417+
const provider = this.getProvider();
418+
const balance = await provider.getBalance({
419+
owner: await this.getAccountAddress(privateKey),
420+
});
421+
return Number(balance.totalBalance) / Number(NANOS_PER_IOTA);
352422
}
353423
}
354424

@@ -932,7 +1002,9 @@ export class NearChain extends Chain {
9321002

9331003
async getAccountAddress(privateKey: PrivateKey): Promise<string> {
9341004
return Buffer.from(
935-
Ed25519Keypair.fromSecretKey(Buffer.from(privateKey, "hex"))
1005+
SuiEd25519Keypair.fromSecretKey(
1006+
new Uint8Array(Buffer.from(privateKey, "hex"))
1007+
)
9361008
.getPublicKey()
9371009
.toRawBytes()
9381010
).toString("hex");
@@ -951,7 +1023,9 @@ export class NearChain extends Chain {
9511023
): Promise<nearAPI.Account> {
9521024
const keyStore = new nearAPI.keyStores.InMemoryKeyStore();
9531025
if (typeof senderPrivateKey !== "undefined") {
954-
const key = bs58.encode(Buffer.from(senderPrivateKey, "hex"));
1026+
const key = bs58.encode(
1027+
new Uint8Array(Buffer.from(senderPrivateKey, "hex"))
1028+
);
9551029
const keyPair = nearAPI.KeyPair.fromString(key);
9561030
const address = await this.getAccountAddress(senderPrivateKey);
9571031
await keyStore.setKey(this.networkId, address, keyPair);

contract_manager/src/contracts/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export * from "./cosmwasm";
33
export * from "./evm";
44
export * from "./fuel";
55
export * from "./sui";
6+
export * from "./iota";
67
export * from "./wormhole";
78
export * from "./evm_abis";
89
export * from "./ton";

0 commit comments

Comments
 (0)