Skip to content

Commit ddeb5cd

Browse files
authored
feat(svm): include solana artifacts in package build output (#806) (#860)
* feat(svm): include solana artifacts in package build output (#806) * feat(svm): add types to dist Signed-off-by: Pablo Maldonado <[email protected]> * feat(svm): types Signed-off-by: Pablo Maldonado <[email protected]> * fix: ci Signed-off-by: Pablo Maldonado <[email protected]> * feat: add getters Signed-off-by: Pablo Maldonado <[email protected]> * feat: export only assets Signed-off-by: Pablo Maldonado <[email protected]> * fix: missing old import Signed-off-by: Pablo Maldonado <[email protected]> * fix: export svm Signed-off-by: Pablo Maldonado <[email protected]> * feat: read program id from deployed addresses or pass it as arg Signed-off-by: Pablo Maldonado <[email protected]> * refactor: rename generate-evm-assets Signed-off-by: Pablo Maldonado <[email protected]> * refactor: dif readme Signed-off-by: Pablo Maldonado <[email protected]> * refactor: remove diff readme Signed-off-by: Pablo Maldonado <[email protected]> * fix: imports Signed-off-by: Pablo Maldonado <[email protected]> --------- Signed-off-by: Pablo Maldonado <[email protected]> * fix: idl copy Signed-off-by: Pablo Maldonado <[email protected]> * feat: delete old deployment Signed-off-by: Pablo Maldonado <[email protected]> * feat: bump version to 3.0.24 Signed-off-by: Pablo Maldonado <[email protected]> --------- Signed-off-by: Pablo Maldonado <[email protected]>
1 parent a067a3c commit ddeb5cd

25 files changed

+263
-131
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ target
3232
**/*.rs.bk
3333
test-ledger
3434
idls
35+
src/svm/assets

index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from "./typechain";
22
export * from "./src/DeploymentUtils";
33
export * from "./utils";
4+
export * from "./src/svm";

package.json

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@across-protocol/contracts",
3-
"version": "3.0.23",
3+
"version": "3.0.24",
44
"author": "UMA Team",
55
"license": "AGPL-3.0-only",
66
"repository": {
@@ -26,16 +26,18 @@
2626
"lint-fix": "yarn prettier --write **/*.js **/*.ts ./programs/**/*.rs ./contracts**/*.sol && cargo +nightly fmt --all && cargo clippy",
2727
"clean-fast": "for dir in node_modules cache cache-zk artifacts artifacts-zk dist typechain; do mv \"${dir}\" \"_${dir}\"; rm -rf \"_${dir}\" &; done",
2828
"clean": "rm -rf node_modules cache cache-zk artifacts artifacts-zk dist typechain",
29+
"generate-svm-assets": "sh ./scripts/generate-svm-assets.sh",
2930
"build-evm": "hardhat compile",
3031
"build-svm": "echo 'Generating IDLs...' && anchor build > /dev/null 2>&1 || true && anchor run generateExternalTypes && anchor build",
3132
"build-ts": "tsc && rsync -a --include '*/' --include '*.d.ts' --exclude '*' ./typechain ./dist/",
32-
"build": "yarn build-evm && yarn build-svm && yarn build-ts",
33+
"copy-idl": "mkdir -p dist/src/svm/assets/idl && cp src/svm/assets/idl/*.json dist/src/svm/assets/idl/",
34+
"build": "yarn build-evm && yarn build-svm && yarn generate-svm-assets && yarn build-ts && yarn copy-idl",
3335
"test-evm": "IS_TEST=true hardhat test",
3436
"test-svm": "anchor test -- --features test",
3537
"test": "yarn test-evm && yarn test-svm",
3638
"test:report-gas": "IS_TEST=true REPORT_GAS=true hardhat test",
37-
"generate-contract-types": "rm -rf typechain && TYPECHAIN=ethers yarn hardhat typechain",
38-
"prepublish": "yarn build && hardhat export --export-all ./cache/massExport.json && ts-node ./scripts/processHardhatExport.ts && prettier --write ./deployments/deployments.json && yarn generate-contract-types",
39+
"generate-evm-assets": "rm -rf typechain && TYPECHAIN=ethers yarn hardhat typechain",
40+
"prepublish": "yarn build && hardhat export --export-all ./cache/massExport.json && ts-node ./scripts/processHardhatExport.ts && prettier --write ./deployments/deployments.json && yarn generate-evm-assets",
3941
"pre-commit-hook": "sh scripts/preCommitHook.sh"
4042
},
4143
"dependencies": {

scripts/generate-svm-assets.sh

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#!/bin/bash
2+
3+
# Set paths for source and destination
4+
TARGET_IDL="./target/idl"
5+
TARGET_TYPES="./target/types"
6+
SVM_ASSETS="./src/svm/assets"
7+
SVM_IDL="$SVM_ASSETS/idl"
8+
SVM_TYPES="$SVM_ASSETS"
9+
IDL_OUTPUT_FILE="$SVM_IDL/index.ts"
10+
TYPES_OUTPUT_FILE="$SVM_TYPES/index.ts"
11+
12+
# Ensure the destination directories exist
13+
mkdir -p "$SVM_IDL"
14+
mkdir -p "$SVM_TYPES"
15+
16+
# --- Copy Files ---
17+
echo "Copying IDL files..."
18+
cp -r "$TARGET_IDL/"* "$SVM_IDL/"
19+
20+
echo "Copying Types files..."
21+
cp -r "$TARGET_TYPES/"* "$SVM_TYPES/"
22+
23+
# --- Generate IDL index.ts ---
24+
echo "Generating IDL index.ts..."
25+
> "$IDL_OUTPUT_FILE"
26+
27+
# Add autogenerated file note
28+
{
29+
echo "// This file has been autogenerated. Do not edit manually."
30+
echo "// Generated by a script."
31+
echo
32+
} >> "$IDL_OUTPUT_FILE"
33+
34+
IMPORTS=""
35+
EXPORTS=""
36+
37+
for file in "$SVM_IDL"/*.json; do
38+
filename=$(basename -- "$file")
39+
name="${filename%.json}"
40+
camelCaseName=$(echo "$name" | awk -F'_' '{
41+
for (i=1; i<=NF; i++) {
42+
printf toupper(substr($i,1,1)) tolower(substr($i,2));
43+
}
44+
}')
45+
IMPORTS="${IMPORTS}const ${camelCaseName}Idl = require(\"./${filename}\");\n"
46+
EXPORTS="${EXPORTS} ${camelCaseName}Idl,\n"
47+
done
48+
49+
# Write the imports to the file
50+
printf "$IMPORTS" >> "$IDL_OUTPUT_FILE"
51+
52+
# Write the exports block
53+
{
54+
echo "export {"
55+
printf "$EXPORTS" | sed '$ s/,$//'
56+
echo "};"
57+
} >> "$IDL_OUTPUT_FILE"
58+
59+
echo "IDL index.ts generated successfully at $IDL_OUTPUT_FILE"
60+
61+
# --- Generate svm-types index.ts ---
62+
echo "Generating svm-types index.ts..."
63+
> "$TYPES_OUTPUT_FILE"
64+
65+
# Add autogenerated file note
66+
{
67+
echo "// This file has been autogenerated. Do not edit manually."
68+
echo "// Generated by a script."
69+
echo
70+
} >> "$TYPES_OUTPUT_FILE"
71+
72+
# Export * from ./idl
73+
echo "export * from \"./idl\";" >> "$TYPES_OUTPUT_FILE"
74+
75+
# Export * from each .ts file in ./svm-types, removing underscores and capitalizing names
76+
for file in "$SVM_TYPES"/*.ts; do
77+
[ "$(basename -- "$file")" = "index.ts" ] && continue
78+
filename=$(basename -- "$file")
79+
name="${filename%.ts}"
80+
camelCaseName=$(echo "$name" | awk -F'_' '{
81+
for (i=1; i<=NF; i++) {
82+
printf toupper(substr($i,1,1)) tolower(substr($i,2));
83+
}
84+
}')
85+
newName="${camelCaseName}Anchor"
86+
echo "export {${camelCaseName} as ${newName}} from \"./${name}\";" >> "$TYPES_OUTPUT_FILE"
87+
done
88+
89+
echo "svm-types index.ts generated successfully at $TYPES_OUTPUT_FILE"

scripts/svm/bridgeLiabilityToHubPool.ts

+5-11
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,10 @@
2424
*/
2525

2626
import * as anchor from "@coral-xyz/anchor";
27-
import { AnchorProvider, BN, Program } from "@coral-xyz/anchor";
27+
import { AnchorProvider, BN } from "@coral-xyz/anchor";
2828
import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID } from "@solana/spl-token";
2929
import { PublicKey, SystemProgram } from "@solana/web3.js";
3030
// eslint-disable-next-line camelcase
31-
import { MessageTransmitter } from "../../target/types/message_transmitter";
32-
import { SvmSpoke } from "../../target/types/svm_spoke";
33-
// eslint-disable-next-line camelcase
3431
import {
3532
CIRCLE_IRIS_API_URL_DEVNET,
3633
CIRCLE_IRIS_API_URL_MAINNET,
@@ -46,7 +43,7 @@ import {
4643
import { TOKEN_SYMBOLS_MAP } from "@across-protocol/constants";
4744
import { getNodeUrl } from "@uma/common";
4845
import { BigNumber, ethers } from "ethers";
49-
import { TokenMessengerMinter } from "../../target/types/token_messenger_minter";
46+
import { getMessageTransmitterProgram, getSpokePoolProgram, getTokenMessengerMinterProgram } from "../../src/svm";
5047
import { BondToken__factory } from "../../typechain";
5148
import { formatUsdc, requireEnv } from "./utils/helpers";
5249

@@ -55,10 +52,7 @@ const provider = AnchorProvider.env();
5552
anchor.setProvider(provider);
5653

5754
// Get Solana programs and IDLs.
58-
const svmSpokeIdl = require("../../target/idl/svm_spoke.json");
59-
const svmSpokeProgram = new Program<SvmSpoke>(svmSpokeIdl, provider);
60-
const messageTransmitterIdl = require("../../target/idl/message_transmitter.json");
61-
const tokenMessengerMinterIdl = require("../../target/idl/token_messenger_minter.json");
55+
const svmSpokeProgram = getSpokePoolProgram(provider);
6256

6357
// CCTP domains.
6458
const ethereumDomain = 0; // Ethereum
@@ -200,7 +194,7 @@ async function bridgeLiabilityToHubPool(): Promise<void> {
200194
}
201195

202196
async function bridgeTokensToHubPool(amount: BN, signer: anchor.Wallet, statePda: PublicKey, inputToken: PublicKey) {
203-
const messageTransmitterProgram = new Program<MessageTransmitter>(messageTransmitterIdl, provider);
197+
const messageTransmitterProgram = getMessageTransmitterProgram(provider);
204198

205199
const vault = getAssociatedTokenAddressSync(
206200
inputToken,
@@ -215,7 +209,7 @@ async function bridgeTokensToHubPool(amount: BN, signer: anchor.Wallet, statePda
215209
[Buffer.from("transfer_liability"), inputToken.toBuffer()],
216210
svmSpokeProgram.programId
217211
);
218-
const tokenMessengerMinterProgram = new Program<TokenMessengerMinter>(tokenMessengerMinterIdl, provider);
212+
const tokenMessengerMinterProgram = getTokenMessengerMinterProgram(provider);
219213

220214
const [tokenMessengerMinterSenderAuthority] = PublicKey.findProgramAddressSync(
221215
[Buffer.from("sender_authority")],

scripts/svm/closeRelayerPdas.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
// This script closes all Relayer PDAs associated with tracking fill Status. Relayers should do this periodically to
22
// reclaim the lamports within these tracking accounts. Fill Status PDAs can be closed on the deposit has expired.
33
import * as anchor from "@coral-xyz/anchor";
4-
import { BN, Program, AnchorProvider } from "@coral-xyz/anchor";
4+
import { AnchorProvider, BN } from "@coral-xyz/anchor";
55
import { PublicKey, SystemProgram } from "@solana/web3.js";
6-
import { SvmSpoke } from "../../target/types/svm_spoke";
76
import yargs from "yargs";
87
import { hideBin } from "yargs/helpers";
9-
import { calculateRelayEventHashUint8Array, readProgramEvents } from "../../src/svm";
8+
import { calculateRelayEventHashUint8Array, getSpokePoolProgram, readProgramEvents } from "../../src/svm";
109

1110
// Set up the provider
1211
const provider = AnchorProvider.env();
1312
anchor.setProvider(provider);
14-
const idl = require("../../target/idl/svm_spoke.json");
15-
const program = new Program<SvmSpoke>(idl, provider);
13+
const program = getSpokePoolProgram(provider);
1614
const programId = program.programId;
1715

1816
// Parse arguments

scripts/svm/enableRoute.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
// This script is used by a chain admin to enable or disable a route for a token on the Solana Spoke Pool.
22

33
import * as anchor from "@coral-xyz/anchor";
4-
import { BN, Program, AnchorProvider } from "@coral-xyz/anchor";
5-
import { PublicKey, SystemProgram } from "@solana/web3.js";
4+
import { AnchorProvider, BN } from "@coral-xyz/anchor";
65
import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync } from "@solana/spl-token";
7-
import { SvmSpoke } from "../../target/types/svm_spoke";
6+
import { PublicKey, SystemProgram } from "@solana/web3.js";
87
import yargs from "yargs";
98
import { hideBin } from "yargs/helpers";
9+
import { getSpokePoolProgram } from "../../src/svm";
1010

1111
// Set up the provider
1212
const provider = AnchorProvider.env();
1313
anchor.setProvider(provider);
14-
const idl = require("../../target/idl/svm_spoke.json");
15-
const program = new Program<SvmSpoke>(idl, provider);
14+
const program = getSpokePoolProgram(provider);
1615
const programId = program.programId;
1716
console.log("SVM-Spoke Program ID:", programId.toString());
1817

scripts/svm/executeRebalanceToHubPool.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@ import {
4343
import { BigNumber, ethers } from "ethers";
4444
import yargs from "yargs";
4545
import { hideBin } from "yargs/helpers";
46-
import { MessageTransmitter } from "../../target/types/message_transmitter";
47-
import { SvmSpoke } from "../../target/types/svm_spoke";
4846
import { CHAIN_IDs } from "../../utils/constants";
4947
// eslint-disable-next-line camelcase
5048
import { HubPool__factory } from "../../typechain";
@@ -61,12 +59,15 @@ import {
6159
CIRCLE_IRIS_API_URL_MAINNET,
6260
decodeMessageHeader,
6361
getMessages,
62+
getMessageTransmitterProgram,
6463
getSolanaChainId,
64+
getSpokePoolProgram,
6565
isSolanaDevnet,
6666
loadExecuteRelayerRefundLeafParams,
6767
SOLANA_SPOKE_STATE_SEED,
6868
SOLANA_USDC_DEVNET,
6969
SOLANA_USDC_MAINNET,
70+
SvmSpokeAnchor,
7071
} from "../../src/svm";
7172
import { RelayerRefundLeafSolana, RelayerRefundLeafType } from "../../src/types/svm";
7273

@@ -75,10 +76,9 @@ const provider = AnchorProvider.env();
7576
anchor.setProvider(provider);
7677

7778
// Get Solana programs.
78-
const svmSpokeIdl = require("../../target/idl/svm_spoke.json");
79-
const svmSpokeProgram = new Program<SvmSpoke>(svmSpokeIdl, provider);
80-
const messageTransmitterIdl = require("../../target/idl/message_transmitter.json");
81-
const messageTransmitterProgram = new Program<MessageTransmitter>(messageTransmitterIdl, provider);
79+
80+
const svmSpokeProgram = getSpokePoolProgram(provider);
81+
const messageTransmitterProgram = getMessageTransmitterProgram(provider);
8282

8383
const [messageTransmitterState] = PublicKey.findProgramAddressSync(
8484
[Buffer.from("message_transmitter")],
@@ -340,7 +340,7 @@ async function executeRootBalanceOnHubPool(solanaChainId: BigNumber) {
340340

341341
async function executeRelayerRefundLeaf(
342342
signer: anchor.Wallet,
343-
program: Program<SvmSpoke>,
343+
program: Program<SvmSpokeAnchor>,
344344
statePda: PublicKey,
345345
rootBundle: PublicKey,
346346
relayerRefundLeaf: RelayerRefundLeafSolana,

scripts/svm/executeRebalanceToSpokePool.ts

+11-15
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
// - HUB_POOL_ADDRESS: Hub Pool address
55

66
import * as anchor from "@coral-xyz/anchor";
7-
import { BN, Program, AnchorProvider } from "@coral-xyz/anchor";
7+
import { AnchorProvider, BN } from "@coral-xyz/anchor";
8+
import { getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID } from "@solana/spl-token";
89
import { AccountMeta, PublicKey, SystemProgram } from "@solana/web3.js";
9-
import { TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync } from "@solana/spl-token";
1010
import { getNodeUrl } from "@uma/common";
1111
// eslint-disable-next-line camelcase
12-
import { CHAIN_IDs, TOKEN_SYMBOLS_MAP } from "../../utils/constants";
13-
import { SvmSpoke } from "../../target/types/svm_spoke";
12+
import { CHAIN_IDs, TOKEN_SYMBOLS_MAP } from "@across-protocol/constants";
13+
import { BigNumber, ethers } from "ethers";
1414
import yargs from "yargs";
1515
import { hideBin } from "yargs/helpers";
1616
import {
@@ -19,30 +19,26 @@ import {
1919
decodeMessageHeader,
2020
evmAddressToPublicKey,
2121
getMessages,
22+
getMessageTransmitterProgram,
2223
getSolanaChainId,
24+
getSpokePoolProgram,
25+
getTokenMessengerMinterProgram,
2326
isSolanaDevnet,
2427
SOLANA_USDC_DEVNET,
2528
SOLANA_USDC_MAINNET,
2629
} from "../../src/svm";
27-
import { MessageTransmitter } from "../../target/types/message_transmitter";
28-
import { TokenMessengerMinter } from "../../target/types/token_messenger_minter";
29-
import { ethers, BigNumber } from "ethers";
30-
// eslint-disable-next-line camelcase
3130
import { HubPool__factory } from "../../typechain";
32-
import { constructSimpleRebalanceTree } from "./utils/poolRebalanceTree";
3331
import { requireEnv } from "./utils/helpers";
32+
import { constructSimpleRebalanceTree } from "./utils/poolRebalanceTree";
3433

3534
// Set up Solana provider.
3635
const provider = AnchorProvider.env();
3736
anchor.setProvider(provider);
3837

3938
// Get Solana programs.
40-
const svmSpokeIdl = require("../../target/idl/svm_spoke.json");
41-
const svmSpokeProgram = new Program<SvmSpoke>(svmSpokeIdl, provider);
42-
const messageTransmitterIdl = require("../../target/idl/message_transmitter.json");
43-
const messageTransmitterProgram = new Program<MessageTransmitter>(messageTransmitterIdl, provider);
44-
const tokenMessengerMinterIdl = require("../../target/idl/token_messenger_minter.json");
45-
const tokenMessengerMinterProgram = new Program<TokenMessengerMinter>(tokenMessengerMinterIdl, provider);
39+
const svmSpokeProgram = getSpokePoolProgram(provider);
40+
const messageTransmitterProgram = getMessageTransmitterProgram(provider);
41+
const tokenMessengerMinterProgram = getTokenMessengerMinterProgram(provider);
4642

4743
// Set up Ethereum provider and signer.
4844
const isDevnet = isSolanaDevnet(provider);

scripts/svm/fakeFillWithRandomDistribution.ts

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
// This script implements a fill where relayed tokens are distributed to random recipients via the message handler.
22
// Note that this should be run only on devnet as this is fake fill and all filled tokens are sent to random recipients.
33
import * as anchor from "@coral-xyz/anchor";
4-
import { BN, Program, AnchorProvider } from "@coral-xyz/anchor";
5-
import { AccountMeta, Keypair, PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js";
4+
import { AnchorProvider, BN } from "@coral-xyz/anchor";
65
import {
76
ASSOCIATED_TOKEN_PROGRAM_ID,
87
TOKEN_PROGRAM_ID,
8+
createApproveCheckedInstruction,
99
createTransferCheckedInstruction,
1010
getAssociatedTokenAddressSync,
11-
getOrCreateAssociatedTokenAccount,
1211
getMint,
13-
createApproveCheckedInstruction,
12+
getOrCreateAssociatedTokenAccount,
1413
} from "@solana/spl-token";
15-
import { SvmSpoke } from "../../target/types/svm_spoke";
14+
import { AccountMeta, Keypair, PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js";
1615
import yargs from "yargs";
1716
import { hideBin } from "yargs/helpers";
1817
import {
1918
AcrossPlusMessageCoder,
2019
MulticallHandlerCoder,
2120
calculateRelayHashUint8Array,
21+
getSpokePoolProgram,
2222
loadFillV3RelayParams,
2323
sendTransactionWithLookupTable,
2424
} from "../../src/svm";
@@ -29,8 +29,7 @@ const provider = AnchorProvider.env();
2929
anchor.setProvider(provider);
3030
const signer = (anchor.AnchorProvider.env().wallet as anchor.Wallet).payer;
3131

32-
const idl = require("../../target/idl/svm_spoke.json");
33-
const program = new Program<SvmSpoke>(idl, provider);
32+
const program = getSpokePoolProgram(provider);
3433
const programId = program.programId;
3534

3635
// Parse arguments

scripts/svm/initialize.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
// This script initializes a SVM spoke pool with initialization parameters.
22

33
import * as anchor from "@coral-xyz/anchor";
4-
import { BN, Program, AnchorProvider } from "@coral-xyz/anchor";
4+
import { AnchorProvider, BN } from "@coral-xyz/anchor";
55
import { PublicKey, SystemProgram } from "@solana/web3.js";
6-
import { SvmSpoke } from "../../target/types/svm_spoke";
76
import yargs from "yargs";
87
import { hideBin } from "yargs/helpers";
9-
import { evmAddressToPublicKey } from "../../src/svm";
8+
import { evmAddressToPublicKey, getSpokePoolProgram } from "../../src/svm";
109

1110
// Set up the provider
1211
const provider = AnchorProvider.env();
1312
anchor.setProvider(provider);
14-
const idl = require("../../target/idl/svm_spoke.json");
15-
const program = new Program<SvmSpoke>(idl, provider);
13+
const program = getSpokePoolProgram(provider);
1614
const programId = program.programId;
1715

1816
// Parse arguments

0 commit comments

Comments
 (0)