@across-protocol/sdk 4.3.31 → 4.3.32-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/cjs/arch/svm/SpokeUtils.d.ts +2 -2
  2. package/dist/cjs/arch/svm/SpokeUtils.js +30 -24
  3. package/dist/cjs/arch/svm/SpokeUtils.js.map +1 -1
  4. package/dist/cjs/arch/svm/encoders.d.ts +19 -0
  5. package/dist/cjs/arch/svm/encoders.js +52 -0
  6. package/dist/cjs/arch/svm/encoders.js.map +1 -0
  7. package/dist/cjs/arch/svm/index.d.ts +1 -0
  8. package/dist/cjs/arch/svm/index.js +1 -0
  9. package/dist/cjs/arch/svm/index.js.map +1 -1
  10. package/dist/cjs/arch/svm/utils.d.ts +2 -0
  11. package/dist/cjs/arch/svm/utils.js +18 -1
  12. package/dist/cjs/arch/svm/utils.js.map +1 -1
  13. package/dist/esm/arch/svm/SpokeUtils.d.ts +2 -2
  14. package/dist/esm/arch/svm/SpokeUtils.js +37 -26
  15. package/dist/esm/arch/svm/SpokeUtils.js.map +1 -1
  16. package/dist/esm/arch/svm/encoders.d.ts +19 -0
  17. package/dist/esm/arch/svm/encoders.js +43 -0
  18. package/dist/esm/arch/svm/encoders.js.map +1 -0
  19. package/dist/esm/arch/svm/index.d.ts +1 -0
  20. package/dist/esm/arch/svm/index.js +1 -0
  21. package/dist/esm/arch/svm/index.js.map +1 -1
  22. package/dist/esm/arch/svm/utils.d.ts +8 -0
  23. package/dist/esm/arch/svm/utils.js +22 -0
  24. package/dist/esm/arch/svm/utils.js.map +1 -1
  25. package/dist/types/arch/svm/SpokeUtils.d.ts +2 -2
  26. package/dist/types/arch/svm/SpokeUtils.d.ts.map +1 -1
  27. package/dist/types/arch/svm/encoders.d.ts +20 -0
  28. package/dist/types/arch/svm/encoders.d.ts.map +1 -0
  29. package/dist/types/arch/svm/index.d.ts +1 -0
  30. package/dist/types/arch/svm/index.d.ts.map +1 -1
  31. package/dist/types/arch/svm/utils.d.ts +8 -0
  32. package/dist/types/arch/svm/utils.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/src/arch/svm/SpokeUtils.ts +42 -20
  35. package/src/arch/svm/encoders.ts +86 -0
  36. package/src/arch/svm/index.ts +1 -0
  37. package/src/arch/svm/utils.ts +23 -0
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/arch/svm/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/arch/svm/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@across-protocol/sdk",
3
3
  "author": "UMA Team",
4
- "version": "4.3.31",
4
+ "version": "4.3.32-alpha.1",
5
5
  "license": "AGPL-3.0",
6
6
  "homepage": "https://docs.across.to/reference/sdk",
7
7
  "files": [
@@ -32,9 +32,11 @@ import {
32
32
  signTransactionMessageWithSigners,
33
33
  some,
34
34
  type TransactionSigner,
35
+ type WritableAccount,
36
+ type ReadonlyAccount,
35
37
  } from "@solana/kit";
36
38
  import assert from "assert";
37
- import { arrayify, hexZeroPad, hexlify } from "ethers/lib/utils";
39
+ import { arrayify } from "ethers/lib/utils";
38
40
  import { Logger } from "winston";
39
41
  import { CHAIN_IDs, TOKEN_SYMBOLS_MAP } from "../../constants";
40
42
  import { DepositWithBlock, FillStatus, FillWithBlock, RelayData, RelayExecutionEventInfo } from "../../interfaces";
@@ -66,6 +68,9 @@ import {
66
68
  toAddress,
67
69
  unwrapEventData,
68
70
  getRootBundlePda,
71
+ getAcrossPlusMessageDecoder,
72
+ getAccountMeta,
73
+ toSvmRelayData,
69
74
  } from "./";
70
75
  import { SvmCpiEventsClient } from "./eventsClient";
71
76
  import { SVM_BLOCK_NOT_AVAILABLE, SVM_SLOT_SKIPPED, isSolanaError } from "./provider";
@@ -601,6 +606,8 @@ export async function getFillRelayTx(
601
606
  getEventAuthority(program),
602
607
  ]);
603
608
 
609
+ const _message = relayData.message.startsWith("0x") ? relayData.message.slice(2) : relayData.message;
610
+ const message = new Uint8Array(Buffer.from(_message, "hex"));
604
611
  const svmRelayData: SvmSpokeClient.FillRelayInput["relayData"] = {
605
612
  depositor: toAddress(depositor),
606
613
  recipient: toAddress(recipient),
@@ -613,9 +620,25 @@ export async function getFillRelayTx(
613
620
  depositId: new Uint8Array(intToU8Array32(relayData.depositId.toNumber())),
614
621
  fillDeadline: relayData.fillDeadline,
615
622
  exclusivityDeadline: relayData.exclusivityDeadline,
616
- message: new Uint8Array(Buffer.from(relayData.message, "hex")),
623
+ message,
617
624
  };
618
625
 
626
+ // Add remaining accounts if the relayData has a non-empty message.
627
+ // @dev ! since in the context of creating a `fillRelayTx`, `relayData` must be defined.
628
+ const remainingAccounts: (WritableAccount | ReadonlyAccount)[] = [];
629
+ if (message.length !== 0) {
630
+ const acrossPlusMessageDecoder = getAcrossPlusMessageDecoder();
631
+ const acrossPlusMessage = acrossPlusMessageDecoder.decode(message);
632
+ // The first `remainingAccount` _must_ be the handler address.
633
+ // https://github.com/across-protocol/contracts/blob/3310f8dc716407a5f97ef5fd2eae63df83251f2f/programs/svm-spoke/src/utils/message_utils.rs#L36.
634
+ remainingAccounts.push(getAccountMeta(acrossPlusMessage.handler, true));
635
+ remainingAccounts.push(
636
+ ...acrossPlusMessage.accounts.map((account, idx) =>
637
+ getAccountMeta(account, idx < acrossPlusMessage.accounts.length - acrossPlusMessage.read_only_len)
638
+ )
639
+ );
640
+ }
641
+
619
642
  const fillInput: SvmSpokeClient.FillRelayInput = {
620
643
  signer: signer,
621
644
  state,
@@ -636,7 +659,7 @@ export async function getFillRelayTx(
636
659
  };
637
660
  // Pass createRecipientAtaIfNeeded =true to the createFillInstruction function to create the recipient token account
638
661
  // if it doesn't exist.
639
- return createFillInstruction(signer, solanaClient, fillInput, mintInfo.data.decimals, true);
662
+ return createFillInstruction(signer, solanaClient, fillInput, mintInfo.data.decimals, true, remainingAccounts);
640
663
  }
641
664
 
642
665
  /**
@@ -653,7 +676,8 @@ export const createFillInstruction = async (
653
676
  solanaClient: SVMProvider,
654
677
  fillInput: SvmSpokeClient.FillRelayInput,
655
678
  tokenDecimals: number,
656
- createRecipientAtaIfNeeded: boolean = true
679
+ createRecipientAtaIfNeeded: boolean = true,
680
+ remainingAccounts: (WritableAccount | ReadonlyAccount)[] = []
657
681
  ) => {
658
682
  const mintInfo = await getMintInfo(solanaClient, fillInput.mint);
659
683
  const approveIx = getApproveCheckedInstruction(
@@ -682,6 +706,9 @@ export const createFillInstruction = async (
682
706
 
683
707
  const createFillIx = SvmSpokeClient.getFillRelayInstruction(fillInput);
684
708
 
709
+ // Add remaining accounts.
710
+ createFillIx.accounts.push(...remainingAccounts);
711
+
685
712
  return pipe(
686
713
  await createDefaultTransaction(solanaClient, signer),
687
714
  (tx) =>
@@ -882,28 +909,23 @@ export async function getAssociatedTokenAddress(
882
909
  }
883
910
 
884
911
  export function getRelayDataHash(relayData: RelayData, destinationChainId: number): string {
885
- const addressEncoder = getAddressEncoder();
912
+ assert(relayData.message.startsWith("0x"), "Message must be a hex string");
886
913
  const uint64Encoder = getU64Encoder();
887
- const uint32Encoder = getU32Encoder();
888
914
 
889
- assert(relayData.message.startsWith("0x"), "Message must be a hex string");
890
- const encodeAddress = (data: SdkAddress) => Uint8Array.from(addressEncoder.encode(toAddress(data)));
915
+ const svmRelayData = toSvmRelayData(relayData);
916
+ const relayDataEncoder = SvmSpokeClient.getRelayDataEncoder();
917
+ const encodedRelayData = relayDataEncoder.encode(svmRelayData);
918
+ const encodedMessage = Buffer.from(relayData.message.slice(2), "hex");
891
919
 
920
+ // Reformat the encoded relay data the same way it is done in the SvmSpoke:
921
+ // https://github.com/across-protocol/contracts/blob/3310f8dc716407a5f97ef5fd2eae63df83251f2f/programs/svm-spoke/src/utils/merkle_proof_utils.rs#L5
922
+ const messageOffset = encodedRelayData.length - 4 - encodedMessage.length;
892
923
  const contentToHash = Buffer.concat([
893
- encodeAddress(relayData.depositor),
894
- encodeAddress(relayData.recipient),
895
- encodeAddress(relayData.exclusiveRelayer),
896
- encodeAddress(relayData.inputToken),
897
- encodeAddress(relayData.outputToken),
898
- arrayify(hexZeroPad(hexlify(relayData.inputAmount), 32)),
899
- Uint8Array.from(uint64Encoder.encode(BigInt(relayData.outputAmount.toString()))),
900
- Uint8Array.from(uint64Encoder.encode(BigInt(relayData.originChainId.toString()))),
901
- arrayify(hexZeroPad(hexlify(relayData.depositId), 32)),
902
- Uint8Array.from(uint32Encoder.encode(relayData.fillDeadline)),
903
- Uint8Array.from(uint32Encoder.encode(relayData.exclusivityDeadline)),
904
- hashNonEmptyMessage(Buffer.from(arrayify(relayData.message))),
924
+ encodedRelayData.slice(0, messageOffset),
925
+ hashNonEmptyMessage(encodedMessage),
905
926
  Uint8Array.from(uint64Encoder.encode(BigInt(destinationChainId))),
906
927
  ]);
928
+
907
929
  return keccak256(contentToHash);
908
930
  }
909
931
 
@@ -0,0 +1,86 @@
1
+ import {
2
+ AccountRole,
3
+ addDecoderSizePrefix,
4
+ addEncoderSizePrefix,
5
+ getAddressDecoder,
6
+ getAddressEncoder,
7
+ getArrayEncoder,
8
+ getArrayDecoder,
9
+ getBytesDecoder,
10
+ getBytesEncoder,
11
+ getStructDecoder,
12
+ getStructEncoder,
13
+ getU8Decoder,
14
+ getU8Encoder,
15
+ getU32Decoder,
16
+ getU32Encoder,
17
+ getU64Decoder,
18
+ getU64Encoder,
19
+ type Address,
20
+ type Decoder,
21
+ type Encoder,
22
+ type ReadonlyUint8Array,
23
+ type WritableAccount,
24
+ type ReadonlyAccount,
25
+ } from "@solana/kit";
26
+
27
+ export type AcrossPlusMessage = {
28
+ handler: Address;
29
+ read_only_len: number;
30
+ value_amount: bigint;
31
+ accounts: Array<Address>;
32
+ handler_message: ReadonlyUint8Array;
33
+ };
34
+
35
+ export type CompiledIx = {
36
+ program_id_index: number;
37
+ account_key_indexes: number;
38
+ data: ReadonlyUint8Array;
39
+ };
40
+
41
+ export function getAcrossPlusMessageEncoder(): Encoder<AcrossPlusMessage> {
42
+ return getStructEncoder([
43
+ ["handler", getAddressEncoder()],
44
+ ["read_only_len", getU8Encoder()],
45
+ ["value_amount", getU64Encoder()],
46
+ ["accounts", getArrayEncoder(getAddressEncoder())],
47
+ ["handler_message", addEncoderSizePrefix(getBytesEncoder(), getU32Encoder())],
48
+ ]);
49
+ }
50
+
51
+ export function getAcrossPlusMessageDecoder(): Decoder<AcrossPlusMessage> {
52
+ return getStructDecoder([
53
+ ["handler", getAddressDecoder()],
54
+ ["read_only_len", getU8Decoder()],
55
+ ["value_amount", getU64Decoder()],
56
+ ["accounts", getArrayDecoder(getAddressDecoder())],
57
+ ["handler_message", addDecoderSizePrefix(getBytesDecoder(), getU32Decoder())],
58
+ ]);
59
+ }
60
+
61
+ export function getHandlerMessageEncoder(): Encoder<Array<CompiledIx>> {
62
+ return getArrayEncoder(getCompiledIxEncoder());
63
+ }
64
+
65
+ export function getCompiledIxEncoder(): Encoder<CompiledIx> {
66
+ return getStructEncoder([
67
+ ["program_id_index", getU8Encoder()],
68
+ ["account_key_indexes", getU8Encoder()],
69
+ ["data", addEncoderSizePrefix(getBytesEncoder(), getU32Encoder())],
70
+ ]);
71
+ }
72
+
73
+ export function getCompiledIxDecoder(): Decoder<CompiledIx> {
74
+ return getStructDecoder([
75
+ ["program_id_index", getU8Decoder()],
76
+ ["account_key_indexes", getU8Decoder()],
77
+ ["data", addDecoderSizePrefix(getBytesDecoder(), getU32Decoder())],
78
+ ]);
79
+ }
80
+
81
+ export function getAccountMeta(value: Address, isWritable: boolean): WritableAccount | ReadonlyAccount {
82
+ return Object.freeze({
83
+ address: value,
84
+ role: isWritable ? AccountRole.WRITABLE : AccountRole.READONLY,
85
+ });
86
+ }
@@ -5,3 +5,4 @@ export * from "./utils";
5
5
  export * from "./constants";
6
6
  export * from "./BlockUtils";
7
7
  export * from "./provider";
8
+ export * from "./encoders";
@@ -507,6 +507,29 @@ export const getEmergencyDeleteRootBundleRootBundleId = (body: Buffer): number =
507
507
  return result.rootBundleId.toNumber();
508
508
  };
509
509
 
510
+ /**
511
+ * Converts a common `RelayData` type to an SvmSpokeClient.RelayData` type. This is useful for when we need
512
+ * to interface directly with the SvmSpoke.
513
+ * @param relayData The common RelayData TS type.
514
+ * @returns RelayData which conforms to the typing of the SvmSpoke.
515
+ */
516
+ export function toSvmRelayData(relayData: RelayData): SvmSpokeClient.RelayData {
517
+ return {
518
+ originChainId: BigInt(relayData.originChainId),
519
+ depositor: address(relayData.depositor.toBase58()),
520
+ recipient: address(relayData.recipient.toBase58()),
521
+ depositId: ethers.utils.arrayify(ethers.utils.hexZeroPad(relayData.depositId.toHexString(), 32)),
522
+ inputToken: address(relayData.inputToken.toBase58()),
523
+ outputToken: address(relayData.outputToken.toBase58()),
524
+ inputAmount: ethers.utils.arrayify(ethers.utils.hexZeroPad(relayData.inputAmount.toHexString(), 32)),
525
+ outputAmount: relayData.outputAmount.toBigInt(),
526
+ message: Uint8Array.from(Buffer.from(relayData.message.slice(2), "hex")),
527
+ fillDeadline: relayData.fillDeadline,
528
+ exclusiveRelayer: address(relayData.exclusiveRelayer.toBase58()),
529
+ exclusivityDeadline: relayData.exclusivityDeadline,
530
+ };
531
+ }
532
+
510
533
  /**
511
534
  * Convert a bigint (0 ≤ n < 2^256) to a 32-byte Uint8Array (big-endian).
512
535
  * @param n The bigint to convert.