Skip to content

Commit 33f5b62

Browse files
committed
feat(devtools-aptos): add Aptos devtools packages for OmniGraph wire support
Implements proper Aptos integration following the OmniGraph pattern: Packages created: - @layerzerolabs/devtools-aptos: Connection factory, signer factory, OmniSDK - @layerzerolabs/protocol-devtools-aptos: EndpointV2, Uln302 SDKs - @layerzerolabs/ua-devtools-aptos: OFT SDK implementing IOApp interface Key features: - Transaction signing with sequence number tracking - Proper address normalization (32-byte format) - areBytes32Equal for cross-chain peer comparison - Support for setPeer, getPeer, setDelegate operations Example updates: - oft-main: Add Aptos contract configuration, dependencies, and wire support - oft-solana: Update to use real Aptos packages instead of stub implementations - Remove Aptos filtering from wire tasks to enable actual transaction processing Usage: 1. Set APTOS_PRIVATE_KEY environment variable 2. Create aptos/deploy.json with your oftAddress 3. Run: pnpm hardhat lz:oapp:wire --oapp-config layerzero.config.ts
1 parent 716a53d commit 33f5b62

33 files changed

Lines changed: 2368 additions & 62 deletions

File tree

examples/oft-main/.env.example

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,8 @@ STARKNET_ACCOUNT_ADDRESS=
3333
STARKNET_PRIVATE_KEY=
3434
RPC_URL_STARKNET=
3535
RPC_URL_STARKNET_TESTNET=
36+
37+
# Aptos Variables
38+
APTOS_PRIVATE_KEY=
39+
RPC_URL_APTOS=
40+
RPC_URL_APTOS_TESTNET=
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"oftAddress": "0x756f8ab056688d22687740f4a9aeec3b361170b28d08b719e28c4d38eed1043e"
3+
}

examples/oft-main/layerzero.config.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const INCLUDE_EVM = true
1616
const INCLUDE_SOLANA = false // Set to true when you deploy Solana OFT
1717
const INCLUDE_SUI = true
1818
const INCLUDE_STARKNET = true
19+
const INCLUDE_APTOS = true
1920

2021
// =============================================================================
2122
// ENFORCED OPTIONS
@@ -59,13 +60,23 @@ const STARKNET_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
5960
},
6061
]
6162

63+
const APTOS_ENFORCED_OPTIONS: OAppEnforcedOption[] = [
64+
{
65+
msgType: 1,
66+
optionType: ExecutorOptionType.LZ_RECEIVE,
67+
gas: 50000, // Gas units for lzReceive on Aptos
68+
value: 0,
69+
},
70+
]
71+
6272
// =============================================================================
6373
// DEPLOYMENT TYPES
6474
// =============================================================================
6575

6676
type SolanaDeployment = { oftStore: string }
6777
type SuiDeployment = { oftPackageId: string }
6878
type StarknetDeployment = { oftAddress: string }
79+
type AptosDeployment = { oftAddress: string }
6980

7081
// =============================================================================
7182
// HELPER FUNCTIONS
@@ -134,6 +145,16 @@ const starknetContract: OmniPointHardhat | null =
134145
}
135146
: null
136147

148+
// Aptos Contract
149+
const aptosDeployment = loadJsonOptional<AptosDeployment>('./aptos/deploy.json')
150+
const aptosContract: OmniPointHardhat | null =
151+
INCLUDE_APTOS && aptosDeployment?.oftAddress
152+
? {
153+
eid: EndpointId.APTOS_V2_MAINNET,
154+
address: aptosDeployment.oftAddress,
155+
}
156+
: null
157+
137158
// =============================================================================
138159
// PATHWAY GENERATION
139160
// =============================================================================
@@ -178,6 +199,9 @@ const generatePathways = (): Pathway[] => {
178199
if (starknetContract) {
179200
contracts.push({ contract: starknetContract, options: STARKNET_ENFORCED_OPTIONS, dvns: [] })
180201
}
202+
if (aptosContract) {
203+
contracts.push({ contract: aptosContract, options: APTOS_ENFORCED_OPTIONS, dvns: ['LayerZero Labs'] })
204+
}
181205

182206
// Generate full mesh pathways
183207
for (let i = 0; i < contracts.length; i++) {
@@ -211,6 +235,7 @@ export default async function () {
211235
if (solanaContract) contracts.push({ contract: solanaContract })
212236
if (suiContract) contracts.push({ contract: suiContract })
213237
if (starknetContract) contracts.push({ contract: starknetContract })
238+
if (aptosContract) contracts.push({ contract: aptosContract })
214239

215240
console.log(`LayerZero Config: ${contracts.length} contracts, ${pathways.length} pathways`)
216241
console.log(` Contracts: ${contracts.map((c) => c.contract.eid).join(', ')}`)

examples/oft-main/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@
2424
"hardhat-deploy": "^0.12.1"
2525
},
2626
"devDependencies": {
27+
"@aptos-labs/ts-sdk": "^1.33.1",
2728
"@coral-xyz/anchor": "^0.31.1",
2829
"@ethersproject/abi": "^5.7.0",
2930
"@ethersproject/abstract-signer": "^5.7.0",
3031
"@ethersproject/bytes": "^5.7.0",
3132
"@ethersproject/contracts": "^5.7.0",
3233
"@ethersproject/providers": "^5.7.0",
3334
"@layerzerolabs/devtools": "workspace:^2.0.5",
35+
"@layerzerolabs/devtools-aptos": "workspace:^",
3436
"@layerzerolabs/devtools-evm": "~3.0.0",
3537
"@layerzerolabs/devtools-evm-hardhat": "^4.0.0",
3638
"@layerzerolabs/devtools-solana": "~3.0.6",
@@ -53,6 +55,7 @@
5355
"@layerzerolabs/oft-v2-solana-sdk": "^3.0.136",
5456
"@layerzerolabs/prettier-config-next": "^2.3.39",
5557
"@layerzerolabs/protocol-devtools": "^3.0.0",
58+
"@layerzerolabs/protocol-devtools-aptos": "workspace:^",
5659
"@layerzerolabs/protocol-devtools-evm": "~5.0.0",
5760
"@layerzerolabs/protocol-devtools-solana": "^8.0.3",
5861
"@layerzerolabs/protocol-devtools-starknet": "workspace:^",
@@ -64,6 +67,7 @@
6467
"@layerzerolabs/toolbox-foundry": "~0.1.12",
6568
"@layerzerolabs/toolbox-hardhat": "~0.6.12",
6669
"@layerzerolabs/ua-devtools": "~5.0.0",
70+
"@layerzerolabs/ua-devtools-aptos": "workspace:^",
6771
"@layerzerolabs/ua-devtools-evm": "~7.0.0",
6872
"@layerzerolabs/ua-devtools-evm-hardhat": "~9.0.0",
6973
"@layerzerolabs/ua-devtools-solana": "~8.0.2",
Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
// Re-export from the real Aptos devtools packages
2+
import { createConnectionFactory, createSignerFactory } from '@layerzerolabs/devtools-aptos'
3+
import { createOFTFactory } from '@layerzerolabs/ua-devtools-aptos'
4+
5+
// Re-export the OFT factory directly
6+
export const createAptosOAppFactory = createOFTFactory
7+
8+
// Create a wrapper for the signer factory that uses the default connection factory
9+
// This maintains backwards compatibility with the existing call signature
10+
export const createAptosSignerFactory = (privateKey?: string) => {
11+
const connectionFactory = createConnectionFactory()
12+
return createSignerFactory(connectionFactory, privateKey)
13+
}
14+
15+
// Keep the old exports for backwards compatibility but mark them deprecated
116
export { AptosEndpointV2 } from './aptosEndpointV2'
2-
export { createAptosOAppFactory } from './aptosSdkFactory'
3-
export { createAptosSignerFactory } from './aptosSignerFactory'
17+
export { createAptosOAppFactory as createAptosOAppFactoryLegacy } from './aptosSdkFactory'
18+
export { createAptosSignerFactory as createAptosSignerFactoryLegacy } from './aptosSignerFactory'

examples/oft-main/tasks/common/wire.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,18 @@ task(TASK_LZ_OAPP_WIRE)
199199
...subtaskArgs,
200200
configurator: configurator ?? subtaskArgs.configurator,
201201
sdkFactory,
202+
// Note: Previously, Aptos/Initia contracts were filtered out because the SDK was a stub.
203+
// With the real @layerzerolabs/ua-devtools-aptos package, we now include Aptos in wiring.
204+
// Initia is still filtered out as it doesn't have a full SDK implementation yet.
202205
graph: {
203206
...subtaskArgs.graph,
204207
contracts: subtaskArgs.graph.contracts.filter((contract) => {
205208
const chainType = endpointIdToChainType(contract.point.eid)
206-
return chainType !== ChainType.APTOS && chainType !== ChainType.INITIA
209+
return chainType !== ChainType.INITIA
207210
}),
208211
connections: subtaskArgs.graph.connections.filter((connection) => {
209212
const fromChainType = endpointIdToChainType(connection.vector.from.eid)
210-
return fromChainType !== ChainType.APTOS && fromChainType !== ChainType.INITIA
213+
return fromChainType !== ChainType.INITIA
211214
}),
212215
},
213216
})

examples/oft-solana/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"@ethersproject/contracts": "^5.7.0",
3232
"@ethersproject/providers": "^5.7.0",
3333
"@layerzerolabs/devtools": "~2.0.3",
34+
"@layerzerolabs/devtools-aptos": "workspace:^",
3435
"@layerzerolabs/devtools-evm": "~3.0.0",
3536
"@layerzerolabs/devtools-evm-hardhat": "^4.0.0",
3637
"@layerzerolabs/devtools-solana": "~3.0.6",
@@ -48,6 +49,7 @@
4849
"@layerzerolabs/oft-v2-solana-sdk": "^3.0.136",
4950
"@layerzerolabs/prettier-config-next": "^2.3.39",
5051
"@layerzerolabs/protocol-devtools": "^3.0.0",
52+
"@layerzerolabs/protocol-devtools-aptos": "workspace:^",
5153
"@layerzerolabs/protocol-devtools-evm": "~5.0.0",
5254
"@layerzerolabs/protocol-devtools-solana": "^8.0.3",
5355
"@layerzerolabs/solhint-config": "^3.0.12",
@@ -56,6 +58,7 @@
5658
"@layerzerolabs/toolbox-foundry": "~0.1.12",
5759
"@layerzerolabs/toolbox-hardhat": "~0.6.12",
5860
"@layerzerolabs/ua-devtools": "~5.0.0",
61+
"@layerzerolabs/ua-devtools-aptos": "workspace:^",
5962
"@layerzerolabs/ua-devtools-evm": "~7.0.0",
6063
"@layerzerolabs/ua-devtools-evm-hardhat": "~9.0.0",
6164
"@layerzerolabs/ua-devtools-solana": "~8.0.2",
Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
// Re-export from the real Aptos devtools packages
2+
import { createConnectionFactory, createSignerFactory } from '@layerzerolabs/devtools-aptos'
3+
import { createOFTFactory } from '@layerzerolabs/ua-devtools-aptos'
4+
5+
// Re-export the OFT factory directly
6+
export const createAptosOAppFactory = createOFTFactory
7+
8+
// Create a wrapper for the signer factory that uses the default connection factory
9+
// This maintains backwards compatibility with the existing call signature
10+
export const createAptosSignerFactory = (privateKey?: string) => {
11+
const connectionFactory = createConnectionFactory()
12+
return createSignerFactory(connectionFactory, privateKey)
13+
}
14+
15+
// Keep the old exports for backwards compatibility but mark them deprecated
116
export { AptosEndpointV2 } from './aptosEndpointV2'
2-
export { createAptosOAppFactory } from './aptosSdkFactory'
3-
export { createAptosSignerFactory } from './aptosSignerFactory'
17+
export { createAptosOAppFactory as createAptosOAppFactoryLegacy } from './aptosSdkFactory'
18+
export { createAptosSignerFactory as createAptosSignerFactoryLegacy } from './aptosSignerFactory'

examples/oft-solana/tasks/common/wire.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,15 +184,18 @@ task(TASK_LZ_OAPP_WIRE)
184184
...subtaskArgs,
185185
configurator: configurator ?? subtaskArgs.configurator,
186186
sdkFactory,
187+
// Note: Previously, Aptos/Initia contracts were filtered out because the SDK was a stub.
188+
// With the real @layerzerolabs/ua-devtools-aptos package, we now include Aptos in wiring.
189+
// Initia is still filtered out as it doesn't have a full SDK implementation yet.
187190
graph: {
188191
...subtaskArgs.graph,
189192
contracts: subtaskArgs.graph.contracts.filter((contract) => {
190193
const chainType = endpointIdToChainType(contract.point.eid)
191-
return chainType !== ChainType.APTOS && chainType !== ChainType.INITIA
194+
return chainType !== ChainType.INITIA
192195
}),
193196
connections: subtaskArgs.graph.connections.filter((connection) => {
194197
const fromChainType = endpointIdToChainType(connection.vector.from.eid)
195-
return fromChainType !== ChainType.APTOS && fromChainType !== ChainType.INITIA
198+
return fromChainType !== ChainType.INITIA
196199
}),
197200
},
198201
})
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
{
2+
"name": "@layerzerolabs/devtools-aptos",
3+
"version": "0.1.0",
4+
"description": "Developer utilities for working with LayerZero Aptos contracts",
5+
"repository": {
6+
"type": "git",
7+
"url": "git+https://github.com/LayerZero-Labs/devtools.git",
8+
"directory": "packages/devtools-aptos"
9+
},
10+
"license": "MIT",
11+
"exports": {
12+
".": {
13+
"types": "./dist/index.d.ts",
14+
"require": "./dist/index.js",
15+
"import": "./dist/index.mjs"
16+
},
17+
"./*": {
18+
"types": "./dist/*.d.ts",
19+
"require": "./dist/*.js",
20+
"import": "./dist/*.mjs"
21+
}
22+
},
23+
"main": "./dist/index.js",
24+
"module": "./dist/index.mjs",
25+
"types": "./dist/index.d.ts",
26+
"files": [
27+
"./dist/index.*"
28+
],
29+
"scripts": {
30+
"prebuild": "tsc -noEmit",
31+
"build": "$npm_execpath tsup --clean",
32+
"clean": "rm -rf dist",
33+
"dev": "$npm_execpath tsup --watch",
34+
"lint": "$npm_execpath eslint '**/*.{js,ts,json}'",
35+
"lint:fix": "eslint --fix '**/*.{js,ts,json}'",
36+
"test": "jest --ci --passWithNoTests"
37+
},
38+
"dependencies": {
39+
"p-memoize": "~4.0.4"
40+
},
41+
"devDependencies": {
42+
"@aptos-labs/ts-sdk": "^1.33.1",
43+
"@layerzerolabs/devtools": "~2.0.4",
44+
"@layerzerolabs/io-devtools": "~0.3.2",
45+
"@layerzerolabs/lz-aptos-sdk-v2": "^3.0.59",
46+
"@layerzerolabs/lz-definitions": "^3.0.148",
47+
"@swc/core": "^1.4.0",
48+
"@swc/jest": "^0.2.36",
49+
"@types/jest": "^29.5.12",
50+
"jest": "^29.7.0",
51+
"ts-node": "^10.9.2",
52+
"tslib": "~2.6.2",
53+
"tsup": "~8.0.1",
54+
"typescript": "^5.4.4"
55+
},
56+
"peerDependencies": {
57+
"@aptos-labs/ts-sdk": "^1.33.1",
58+
"@layerzerolabs/devtools": "~2.0.4",
59+
"@layerzerolabs/io-devtools": "~0.3.2",
60+
"@layerzerolabs/lz-definitions": "^3.0.148"
61+
},
62+
"publishConfig": {
63+
"access": "public"
64+
}
65+
}

0 commit comments

Comments
 (0)