@shogun-sdk/intents-sdk 1.0.0
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.
- package/README.md +124 -0
- package/dist/_esm/chains.js +46 -0
- package/dist/_esm/chains.js.map +1 -0
- package/dist/_esm/config.js +2 -0
- package/dist/_esm/config.js.map +1 -0
- package/dist/_esm/constants.js +46 -0
- package/dist/_esm/constants.js.map +1 -0
- package/dist/_esm/core/evm/abi/erc20.js +313 -0
- package/dist/_esm/core/evm/abi/erc20.js.map +1 -0
- package/dist/_esm/core/evm/abi/source-chain-guard.js +1716 -0
- package/dist/_esm/core/evm/abi/source-chain-guard.js.map +1 -0
- package/dist/_esm/core/evm/intent-provider.js +59 -0
- package/dist/_esm/core/evm/intent-provider.js.map +1 -0
- package/dist/_esm/core/evm/order-signature.js +19 -0
- package/dist/_esm/core/evm/order-signature.js.map +1 -0
- package/dist/_esm/core/evm/permit2.js +31 -0
- package/dist/_esm/core/evm/permit2.js.map +1 -0
- package/dist/_esm/core/evm/sdk.js +79 -0
- package/dist/_esm/core/evm/sdk.js.map +1 -0
- package/dist/_esm/core/evm/validator.js +46 -0
- package/dist/_esm/core/evm/validator.js.map +1 -0
- package/dist/_esm/core/evm/viem-provider.js +76 -0
- package/dist/_esm/core/evm/viem-provider.js.map +1 -0
- package/dist/_esm/core/order.js +190 -0
- package/dist/_esm/core/order.js.map +1 -0
- package/dist/_esm/core/sdk.js +120 -0
- package/dist/_esm/core/sdk.js.map +1 -0
- package/dist/_esm/core/solana/client.js +19 -0
- package/dist/_esm/core/solana/client.js.map +1 -0
- package/dist/_esm/core/solana/generated/accounts/adminSingleton.js +56 -0
- package/dist/_esm/core/solana/generated/accounts/adminSingleton.js.map +1 -0
- package/dist/_esm/core/solana/generated/accounts/guard.js +62 -0
- package/dist/_esm/core/solana/generated/accounts/guard.js.map +1 -0
- package/dist/_esm/core/solana/generated/accounts/index.js +11 -0
- package/dist/_esm/core/solana/generated/accounts/index.js.map +1 -0
- package/dist/_esm/core/solana/generated/accounts/order.js +78 -0
- package/dist/_esm/core/solana/generated/accounts/order.js.map +1 -0
- package/dist/_esm/core/solana/generated/errors/index.js +9 -0
- package/dist/_esm/core/solana/generated/errors/index.js.map +1 -0
- package/dist/_esm/core/solana/generated/errors/sourceChainGuard.js +35 -0
- package/dist/_esm/core/solana/generated/errors/sourceChainGuard.js.map +1 -0
- package/dist/_esm/core/solana/generated/index.js +13 -0
- package/dist/_esm/core/solana/generated/index.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/cancelOrder.js +125 -0
- package/dist/_esm/core/solana/generated/instructions/cancelOrder.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/claimTokens.js +142 -0
- package/dist/_esm/core/solana/generated/instructions/claimTokens.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/collectProtocolFees.js +146 -0
- package/dist/_esm/core/solana/generated/instructions/collectProtocolFees.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/createGuard.js +236 -0
- package/dist/_esm/core/solana/generated/instructions/createGuard.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/createOrder.js +182 -0
- package/dist/_esm/core/solana/generated/instructions/createOrder.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/index.js +19 -0
- package/dist/_esm/core/solana/generated/instructions/index.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/initialize.js +109 -0
- package/dist/_esm/core/solana/generated/instructions/initialize.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/preStartOrderExecution.js +123 -0
- package/dist/_esm/core/solana/generated/instructions/preStartOrderExecution.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/setAdmin.js +98 -0
- package/dist/_esm/core/solana/generated/instructions/setAdmin.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/setAuctioneerPubKey.js +104 -0
- package/dist/_esm/core/solana/generated/instructions/setAuctioneerPubKey.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/startOrderExecution.js +105 -0
- package/dist/_esm/core/solana/generated/instructions/startOrderExecution.js.map +1 -0
- package/dist/_esm/core/solana/generated/instructions/startOrderExecutionAfterSwap.js +113 -0
- package/dist/_esm/core/solana/generated/instructions/startOrderExecutionAfterSwap.js.map +1 -0
- package/dist/_esm/core/solana/generated/programs/index.js +9 -0
- package/dist/_esm/core/solana/generated/programs/index.js.map +1 -0
- package/dist/_esm/core/solana/generated/programs/sourceChainGuard.js +82 -0
- package/dist/_esm/core/solana/generated/programs/sourceChainGuard.js.map +1 -0
- package/dist/_esm/core/solana/generated/shared/index.js +82 -0
- package/dist/_esm/core/solana/generated/shared/index.js.map +1 -0
- package/dist/_esm/core/solana/generated/types/adminUpdated.js +18 -0
- package/dist/_esm/core/solana/generated/types/adminUpdated.js.map +1 -0
- package/dist/_esm/core/solana/generated/types/auctioneerPubkeyUpdated.js +24 -0
- package/dist/_esm/core/solana/generated/types/auctioneerPubkeyUpdated.js.map +1 -0
- package/dist/_esm/core/solana/generated/types/executionStarted.js +30 -0
- package/dist/_esm/core/solana/generated/types/executionStarted.js.map +1 -0
- package/dist/_esm/core/solana/generated/types/guardCreated.js +28 -0
- package/dist/_esm/core/solana/generated/types/guardCreated.js.map +1 -0
- package/dist/_esm/core/solana/generated/types/index.js +16 -0
- package/dist/_esm/core/solana/generated/types/index.js.map +1 -0
- package/dist/_esm/core/solana/generated/types/orderCancelled.js +18 -0
- package/dist/_esm/core/solana/generated/types/orderCancelled.js.map +1 -0
- package/dist/_esm/core/solana/generated/types/orderCreated.js +36 -0
- package/dist/_esm/core/solana/generated/types/orderCreated.js.map +1 -0
- package/dist/_esm/core/solana/generated/types/orderFulfilled.js +18 -0
- package/dist/_esm/core/solana/generated/types/orderFulfilled.js.map +1 -0
- package/dist/_esm/core/solana/generated/types/tokenInSwapped.js +26 -0
- package/dist/_esm/core/solana/generated/types/tokenInSwapped.js.map +1 -0
- package/dist/_esm/core/solana/order-instructions.js +92 -0
- package/dist/_esm/core/solana/order-instructions.js.map +1 -0
- package/dist/_esm/core/solana/sdk.js +111 -0
- package/dist/_esm/core/solana/sdk.js.map +1 -0
- package/dist/_esm/core/solana/validator.js +22 -0
- package/dist/_esm/core/solana/validator.js.map +1 -0
- package/dist/_esm/core/sui/client.js +3 -0
- package/dist/_esm/core/sui/client.js.map +1 -0
- package/dist/_esm/core/sui/order-transaction.js +56 -0
- package/dist/_esm/core/sui/order-transaction.js.map +1 -0
- package/dist/_esm/core/sui/sdk.js +94 -0
- package/dist/_esm/core/sui/sdk.js.map +1 -0
- package/dist/_esm/core/sui/validator.js +25 -0
- package/dist/_esm/core/sui/validator.js.map +1 -0
- package/dist/_esm/errors/index.js +94 -0
- package/dist/_esm/errors/index.js.map +1 -0
- package/dist/_esm/index.js +7 -0
- package/dist/_esm/index.js.map +1 -0
- package/dist/_esm/package.json +1 -0
- package/dist/_esm/types/intent.js +2 -0
- package/dist/_esm/types/intent.js.map +1 -0
- package/dist/_esm/utils/base-validator.js +51 -0
- package/dist/_esm/utils/base-validator.js.map +1 -0
- package/dist/_esm/utils/logger.js +109 -0
- package/dist/_esm/utils/logger.js.map +1 -0
- package/dist/_esm/utils/order-validator.js +75 -0
- package/dist/_esm/utils/order-validator.js.map +1 -0
- package/dist/_esm/utils/parsers.js +10 -0
- package/dist/_esm/utils/parsers.js.map +1 -0
- package/dist/_esm/utils/type-utils.js +2 -0
- package/dist/_esm/utils/type-utils.js.map +1 -0
- package/dist/_types/chains.d.ts +69 -0
- package/dist/_types/chains.d.ts.map +1 -0
- package/dist/_types/config.d.ts +21 -0
- package/dist/_types/config.d.ts.map +1 -0
- package/dist/_types/constants.d.ts +18 -0
- package/dist/_types/constants.d.ts.map +1 -0
- package/dist/_types/core/evm/abi/erc20.d.ts +240 -0
- package/dist/_types/core/evm/abi/erc20.d.ts.map +1 -0
- package/dist/_types/core/evm/abi/source-chain-guard.d.ts +1343 -0
- package/dist/_types/core/evm/abi/source-chain-guard.d.ts.map +1 -0
- package/dist/_types/core/evm/intent-provider.d.ts +12 -0
- package/dist/_types/core/evm/intent-provider.d.ts.map +1 -0
- package/dist/_types/core/evm/order-signature.d.ts +19 -0
- package/dist/_types/core/evm/order-signature.d.ts.map +1 -0
- package/dist/_types/core/evm/permit2.d.ts +75 -0
- package/dist/_types/core/evm/permit2.d.ts.map +1 -0
- package/dist/_types/core/evm/sdk.d.ts +50 -0
- package/dist/_types/core/evm/sdk.d.ts.map +1 -0
- package/dist/_types/core/evm/validator.d.ts +13 -0
- package/dist/_types/core/evm/validator.d.ts.map +1 -0
- package/dist/_types/core/evm/viem-provider.d.ts +9657 -0
- package/dist/_types/core/evm/viem-provider.d.ts.map +1 -0
- package/dist/_types/core/order.d.ts +122 -0
- package/dist/_types/core/order.d.ts.map +1 -0
- package/dist/_types/core/sdk.d.ts +86 -0
- package/dist/_types/core/sdk.d.ts.map +1 -0
- package/dist/_types/core/solana/client.d.ts +11 -0
- package/dist/_types/core/solana/client.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/accounts/adminSingleton.d.ts +36 -0
- package/dist/_types/core/solana/generated/accounts/adminSingleton.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/accounts/guard.d.ts +48 -0
- package/dist/_types/core/solana/generated/accounts/guard.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/accounts/index.d.ts +11 -0
- package/dist/_types/core/solana/generated/accounts/index.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/accounts/order.d.ts +92 -0
- package/dist/_types/core/solana/generated/accounts/order.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/errors/index.d.ts +9 -0
- package/dist/_types/core/solana/generated/errors/index.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/errors/sourceChainGuard.d.ts +27 -0
- package/dist/_types/core/solana/generated/errors/sourceChainGuard.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/index.d.ts +13 -0
- package/dist/_types/core/solana/generated/index.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/cancelOrder.d.ts +108 -0
- package/dist/_types/core/solana/generated/instructions/cancelOrder.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/claimTokens.d.ts +131 -0
- package/dist/_types/core/solana/generated/instructions/claimTokens.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/collectProtocolFees.d.ts +91 -0
- package/dist/_types/core/solana/generated/instructions/collectProtocolFees.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/createGuard.d.ts +133 -0
- package/dist/_types/core/solana/generated/instructions/createGuard.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/createOrder.d.ts +122 -0
- package/dist/_types/core/solana/generated/instructions/createOrder.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/index.d.ts +19 -0
- package/dist/_types/core/solana/generated/instructions/index.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/initialize.d.ts +63 -0
- package/dist/_types/core/solana/generated/instructions/initialize.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/preStartOrderExecution.d.ts +105 -0
- package/dist/_types/core/solana/generated/instructions/preStartOrderExecution.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/setAdmin.d.ts +61 -0
- package/dist/_types/core/solana/generated/instructions/setAdmin.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/setAuctioneerPubKey.d.ts +68 -0
- package/dist/_types/core/solana/generated/instructions/setAuctioneerPubKey.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/startOrderExecution.d.ts +85 -0
- package/dist/_types/core/solana/generated/instructions/startOrderExecution.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/instructions/startOrderExecutionAfterSwap.d.ts +95 -0
- package/dist/_types/core/solana/generated/instructions/startOrderExecutionAfterSwap.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/programs/index.d.ts +9 -0
- package/dist/_types/core/solana/generated/programs/index.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/programs/sourceChainGuard.d.ts +59 -0
- package/dist/_types/core/solana/generated/programs/sourceChainGuard.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/shared/index.d.ts +52 -0
- package/dist/_types/core/solana/generated/shared/index.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/types/adminUpdated.d.ts +16 -0
- package/dist/_types/core/solana/generated/types/adminUpdated.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/types/auctioneerPubkeyUpdated.d.ts +17 -0
- package/dist/_types/core/solana/generated/types/auctioneerPubkeyUpdated.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/types/executionStarted.d.ts +26 -0
- package/dist/_types/core/solana/generated/types/executionStarted.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/types/guardCreated.d.ts +19 -0
- package/dist/_types/core/solana/generated/types/guardCreated.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/types/index.d.ts +16 -0
- package/dist/_types/core/solana/generated/types/index.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/types/orderCancelled.d.ts +16 -0
- package/dist/_types/core/solana/generated/types/orderCancelled.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/types/orderCreated.d.ts +32 -0
- package/dist/_types/core/solana/generated/types/orderCreated.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/types/orderFulfilled.d.ts +16 -0
- package/dist/_types/core/solana/generated/types/orderFulfilled.d.ts.map +1 -0
- package/dist/_types/core/solana/generated/types/tokenInSwapped.d.ts +22 -0
- package/dist/_types/core/solana/generated/types/tokenInSwapped.d.ts.map +1 -0
- package/dist/_types/core/solana/order-instructions.d.ts +12 -0
- package/dist/_types/core/solana/order-instructions.d.ts.map +1 -0
- package/dist/_types/core/solana/sdk.d.ts +65 -0
- package/dist/_types/core/solana/sdk.d.ts.map +1 -0
- package/dist/_types/core/solana/validator.d.ts +9 -0
- package/dist/_types/core/solana/validator.d.ts.map +1 -0
- package/dist/_types/core/sui/client.d.ts +3 -0
- package/dist/_types/core/sui/client.d.ts.map +1 -0
- package/dist/_types/core/sui/order-transaction.d.ts +9 -0
- package/dist/_types/core/sui/order-transaction.d.ts.map +1 -0
- package/dist/_types/core/sui/sdk.d.ts +55 -0
- package/dist/_types/core/sui/sdk.d.ts.map +1 -0
- package/dist/_types/core/sui/validator.d.ts +9 -0
- package/dist/_types/core/sui/validator.d.ts.map +1 -0
- package/dist/_types/errors/index.d.ts +32 -0
- package/dist/_types/errors/index.d.ts.map +1 -0
- package/dist/_types/index.d.ts +10 -0
- package/dist/_types/index.d.ts.map +1 -0
- package/dist/_types/types/intent.d.ts +129 -0
- package/dist/_types/types/intent.d.ts.map +1 -0
- package/dist/_types/utils/base-validator.d.ts +28 -0
- package/dist/_types/utils/base-validator.d.ts.map +1 -0
- package/dist/_types/utils/logger.d.ts +35 -0
- package/dist/_types/utils/logger.d.ts.map +1 -0
- package/dist/_types/utils/order-validator.d.ts +40 -0
- package/dist/_types/utils/order-validator.d.ts.map +1 -0
- package/dist/_types/utils/parsers.d.ts +4 -0
- package/dist/_types/utils/parsers.d.ts.map +1 -0
- package/dist/_types/utils/type-utils.d.ts +2 -0
- package/dist/_types/utils/type-utils.d.ts.map +1 -0
- package/package.json +62 -0
- package/src/chains.ts +77 -0
- package/src/config.ts +24 -0
- package/src/constants.ts +61 -0
- package/src/core/evm/abi/erc20.ts +312 -0
- package/src/core/evm/abi/source-chain-guard.ts +1715 -0
- package/src/core/evm/intent-provider.ts +63 -0
- package/src/core/evm/order-signature.ts +33 -0
- package/src/core/evm/permit2.ts +60 -0
- package/src/core/evm/sdk.ts +74 -0
- package/src/core/evm/validator.ts +60 -0
- package/src/core/evm/viem-provider.ts +79 -0
- package/src/core/order.ts +186 -0
- package/src/core/sdk.ts +154 -0
- package/src/core/solana/client.ts +37 -0
- package/src/core/solana/generated/accounts/adminSingleton.ts +136 -0
- package/src/core/solana/generated/accounts/guard.ts +156 -0
- package/src/core/solana/generated/accounts/index.ts +11 -0
- package/src/core/solana/generated/accounts/order.ts +218 -0
- package/src/core/solana/generated/errors/index.ts +9 -0
- package/src/core/solana/generated/errors/sourceChainGuard.ts +52 -0
- package/src/core/solana/generated/index.ts +13 -0
- package/src/core/solana/generated/instructions/cancelOrder.ts +357 -0
- package/src/core/solana/generated/instructions/claimTokens.ts +419 -0
- package/src/core/solana/generated/instructions/collectProtocolFees.ts +383 -0
- package/src/core/solana/generated/instructions/createGuard.ts +569 -0
- package/src/core/solana/generated/instructions/createOrder.ts +480 -0
- package/src/core/solana/generated/instructions/index.ts +19 -0
- package/src/core/solana/generated/instructions/initialize.ts +231 -0
- package/src/core/solana/generated/instructions/preStartOrderExecution.ts +362 -0
- package/src/core/solana/generated/instructions/setAdmin.ts +211 -0
- package/src/core/solana/generated/instructions/setAuctioneerPubKey.ts +241 -0
- package/src/core/solana/generated/instructions/startOrderExecution.ts +293 -0
- package/src/core/solana/generated/instructions/startOrderExecutionAfterSwap.ts +323 -0
- package/src/core/solana/generated/programs/index.ts +9 -0
- package/src/core/solana/generated/programs/sourceChainGuard.ts +223 -0
- package/src/core/solana/generated/shared/index.ts +124 -0
- package/src/core/solana/generated/types/adminUpdated.ts +35 -0
- package/src/core/solana/generated/types/auctioneerPubkeyUpdated.ts +44 -0
- package/src/core/solana/generated/types/executionStarted.ts +63 -0
- package/src/core/solana/generated/types/guardCreated.ts +50 -0
- package/src/core/solana/generated/types/index.ts +16 -0
- package/src/core/solana/generated/types/orderCancelled.ts +35 -0
- package/src/core/solana/generated/types/orderCreated.ts +80 -0
- package/src/core/solana/generated/types/orderFulfilled.ts +35 -0
- package/src/core/solana/generated/types/tokenInSwapped.ts +53 -0
- package/src/core/solana/order-instructions.ts +131 -0
- package/src/core/solana/sdk.ts +135 -0
- package/src/core/solana/validator.ts +26 -0
- package/src/core/sui/client.ts +3 -0
- package/src/core/sui/order-transaction.ts +78 -0
- package/src/core/sui/sdk.ts +95 -0
- package/src/core/sui/validator.ts +32 -0
- package/src/errors/index.ts +106 -0
- package/src/index.ts +10 -0
- package/src/types/intent.ts +143 -0
- package/src/utils/base-validator.ts +64 -0
- package/src/utils/logger.ts +128 -0
- package/src/utils/order-validator.ts +103 -0
- package/src/utils/parsers.ts +8 -0
- package/src/utils/type-utils.ts +1 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was AUTOGENERATED using the codama library.
|
|
3
|
+
* Please DO NOT EDIT THIS FILE, instead use visitors
|
|
4
|
+
* to add features, then rerun codama to update it.
|
|
5
|
+
*
|
|
6
|
+
* @see https://github.com/codama-idl/codama
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
type Address,
|
|
11
|
+
type Codec,
|
|
12
|
+
combineCodec,
|
|
13
|
+
type Decoder,
|
|
14
|
+
type Encoder,
|
|
15
|
+
getAddressDecoder,
|
|
16
|
+
getAddressEncoder,
|
|
17
|
+
getStructDecoder,
|
|
18
|
+
getStructEncoder,
|
|
19
|
+
} from '@solana/kit';
|
|
20
|
+
|
|
21
|
+
export type OrderFulfilled = { orderId: Address };
|
|
22
|
+
|
|
23
|
+
export type OrderFulfilledArgs = OrderFulfilled;
|
|
24
|
+
|
|
25
|
+
export function getOrderFulfilledEncoder(): Encoder<OrderFulfilledArgs> {
|
|
26
|
+
return getStructEncoder([['orderId', getAddressEncoder()]]);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function getOrderFulfilledDecoder(): Decoder<OrderFulfilled> {
|
|
30
|
+
return getStructDecoder([['orderId', getAddressDecoder()]]);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getOrderFulfilledCodec(): Codec<OrderFulfilledArgs, OrderFulfilled> {
|
|
34
|
+
return combineCodec(getOrderFulfilledEncoder(), getOrderFulfilledDecoder());
|
|
35
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was AUTOGENERATED using the codama library.
|
|
3
|
+
* Please DO NOT EDIT THIS FILE, instead use visitors
|
|
4
|
+
* to add features, then rerun codama to update it.
|
|
5
|
+
*
|
|
6
|
+
* @see https://github.com/codama-idl/codama
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
type Address,
|
|
11
|
+
type Codec,
|
|
12
|
+
combineCodec,
|
|
13
|
+
type Decoder,
|
|
14
|
+
type Encoder,
|
|
15
|
+
getAddressDecoder,
|
|
16
|
+
getAddressEncoder,
|
|
17
|
+
getStructDecoder,
|
|
18
|
+
getStructEncoder,
|
|
19
|
+
getU64Decoder,
|
|
20
|
+
getU64Encoder,
|
|
21
|
+
} from '@solana/kit';
|
|
22
|
+
|
|
23
|
+
export type TokenInSwapped = {
|
|
24
|
+
orderId: Address;
|
|
25
|
+
solver: Address;
|
|
26
|
+
stablecoinsAmount: bigint;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type TokenInSwappedArgs = {
|
|
30
|
+
orderId: Address;
|
|
31
|
+
solver: Address;
|
|
32
|
+
stablecoinsAmount: number | bigint;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export function getTokenInSwappedEncoder(): Encoder<TokenInSwappedArgs> {
|
|
36
|
+
return getStructEncoder([
|
|
37
|
+
['orderId', getAddressEncoder()],
|
|
38
|
+
['solver', getAddressEncoder()],
|
|
39
|
+
['stablecoinsAmount', getU64Encoder()],
|
|
40
|
+
]);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function getTokenInSwappedDecoder(): Decoder<TokenInSwapped> {
|
|
44
|
+
return getStructDecoder([
|
|
45
|
+
['orderId', getAddressDecoder()],
|
|
46
|
+
['solver', getAddressDecoder()],
|
|
47
|
+
['stablecoinsAmount', getU64Decoder()],
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function getTokenInSwappedCodec(): Codec<TokenInSwappedArgs, TokenInSwapped> {
|
|
52
|
+
return combineCodec(getTokenInSwappedEncoder(), getTokenInSwappedDecoder());
|
|
53
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type Address,
|
|
3
|
+
address,
|
|
4
|
+
createNoopSigner,
|
|
5
|
+
fetchEncodedAccount,
|
|
6
|
+
generateKeyPairSigner,
|
|
7
|
+
getAddressEncoder,
|
|
8
|
+
getProgramDerivedAddress,
|
|
9
|
+
type IInstruction,
|
|
10
|
+
type KeyPairSigner,
|
|
11
|
+
} from '@solana/kit';
|
|
12
|
+
import { getTransferSolInstruction, SYSTEM_PROGRAM_ADDRESS } from '@solana-program/system';
|
|
13
|
+
import {
|
|
14
|
+
ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
|
|
15
|
+
fetchMint,
|
|
16
|
+
getCreateAssociatedTokenInstructionAsync,
|
|
17
|
+
getSyncNativeInstruction,
|
|
18
|
+
} from '@solana-program/token';
|
|
19
|
+
import { ChainID } from '../../chains.js';
|
|
20
|
+
import { NATIVE_SOLANA_TOKEN_ADDRESS, SRC_CHAIN_GUARD, WRAPPED_SOL_MINT_ADDRESS } from '../../constants.js';
|
|
21
|
+
import type { Order } from '../order.js';
|
|
22
|
+
import { getDefaultSolanaRPC } from './client.js';
|
|
23
|
+
import { getCreateOrderInstruction } from './generated/index.js';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Generates Solana order instructions for creating an order
|
|
27
|
+
* @param order The order to generate instructions
|
|
28
|
+
* @returns Object containing the order public key and instructions
|
|
29
|
+
*/
|
|
30
|
+
export async function getSolanaOrderInstructions(order: Order): Promise<{
|
|
31
|
+
orderKeyPair: KeyPairSigner<string>;
|
|
32
|
+
instructions: IInstruction[];
|
|
33
|
+
}> {
|
|
34
|
+
const rpc = getDefaultSolanaRPC();
|
|
35
|
+
const orderSigner = await generateKeyPairSigner();
|
|
36
|
+
const signer = createNoopSigner(order.user as Address);
|
|
37
|
+
|
|
38
|
+
let tokenInMint = address(order.sourceTokenAddress);
|
|
39
|
+
|
|
40
|
+
const orderUserAddress = address(order.user);
|
|
41
|
+
const spendingNative = tokenInMint === NATIVE_SOLANA_TOKEN_ADDRESS;
|
|
42
|
+
|
|
43
|
+
if (spendingNative) {
|
|
44
|
+
tokenInMint = WRAPPED_SOL_MINT_ADDRESS;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const tokenMintProgram = await fetchMint(rpc, tokenInMint);
|
|
48
|
+
|
|
49
|
+
const guardAddress = address(SRC_CHAIN_GUARD[ChainID.Solana]);
|
|
50
|
+
|
|
51
|
+
const addressEncoder = getAddressEncoder();
|
|
52
|
+
|
|
53
|
+
const [tokenInProgramAccount] = await getProgramDerivedAddress({
|
|
54
|
+
programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
|
|
55
|
+
seeds: [
|
|
56
|
+
addressEncoder.encode(orderUserAddress),
|
|
57
|
+
addressEncoder.encode(tokenMintProgram.programAddress),
|
|
58
|
+
addressEncoder.encode(tokenInMint),
|
|
59
|
+
],
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const [guardProgramAccount] = await getProgramDerivedAddress({
|
|
63
|
+
programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
|
|
64
|
+
seeds: [
|
|
65
|
+
// Owner
|
|
66
|
+
addressEncoder.encode(guardAddress),
|
|
67
|
+
// Token program
|
|
68
|
+
addressEncoder.encode(tokenMintProgram.programAddress),
|
|
69
|
+
// mint address
|
|
70
|
+
addressEncoder.encode(tokenInMint),
|
|
71
|
+
],
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const instructions: Array<IInstruction> = [];
|
|
75
|
+
|
|
76
|
+
// Handle native SOL
|
|
77
|
+
if (spendingNative) {
|
|
78
|
+
order.sourceTokenAddress = WRAPPED_SOL_MINT_ADDRESS;
|
|
79
|
+
|
|
80
|
+
const userTokenInAccount = await fetchEncodedAccount(rpc, tokenInProgramAccount);
|
|
81
|
+
|
|
82
|
+
if (!userTokenInAccount.exists) {
|
|
83
|
+
const createAccountIx = await getCreateAssociatedTokenInstructionAsync({
|
|
84
|
+
payer: signer,
|
|
85
|
+
ata: tokenInProgramAccount,
|
|
86
|
+
owner: orderUserAddress,
|
|
87
|
+
mint: tokenMintProgram.address,
|
|
88
|
+
tokenProgram: tokenMintProgram.programAddress,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
instructions.push(createAccountIx);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const transferIx = getTransferSolInstruction({
|
|
95
|
+
source: signer,
|
|
96
|
+
destination: userTokenInAccount.address,
|
|
97
|
+
amount: order.sourceTokenAmount,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const syncNativeIx = getSyncNativeInstruction({
|
|
101
|
+
account: userTokenInAccount.address,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
instructions.push(transferIx, syncNativeIx);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const executionHashUint8Array = order.executionDetailsHashToBytes();
|
|
108
|
+
|
|
109
|
+
const createOrderIx = getCreateOrderInstruction({
|
|
110
|
+
user: signer,
|
|
111
|
+
order: orderSigner,
|
|
112
|
+
guard: address(SRC_CHAIN_GUARD[ChainID.Solana]),
|
|
113
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
114
|
+
associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
|
|
115
|
+
tokenInMint: tokenInMint,
|
|
116
|
+
userTokenInAccount: tokenInProgramAccount,
|
|
117
|
+
guardTokenInAccount: guardProgramAccount,
|
|
118
|
+
tokenInProgram: tokenMintProgram.programAddress,
|
|
119
|
+
amountIn: order.sourceTokenAmount,
|
|
120
|
+
deadline: order.deadline,
|
|
121
|
+
executionDetailsHash: executionHashUint8Array,
|
|
122
|
+
minStablecoinsAmount: order.minStablecoinAmount,
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
instructions.push(createOrderIx);
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
instructions,
|
|
129
|
+
orderKeyPair: orderSigner,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import {
|
|
2
|
+
appendTransactionMessageInstructions,
|
|
3
|
+
compileTransaction,
|
|
4
|
+
createKeyPairFromBytes,
|
|
5
|
+
createNoopSigner,
|
|
6
|
+
createSignerFromKeyPair,
|
|
7
|
+
createTransactionMessage,
|
|
8
|
+
getBase58Encoder,
|
|
9
|
+
type KeyPairSigner,
|
|
10
|
+
pipe,
|
|
11
|
+
setTransactionMessageFeePayerSigner,
|
|
12
|
+
setTransactionMessageLifetimeUsingBlockhash,
|
|
13
|
+
signTransaction,
|
|
14
|
+
} from '@solana/kit';
|
|
15
|
+
import type { SolanaConfig } from '../../config.js';
|
|
16
|
+
import type { PreparedOrder } from '../../types/intent.js';
|
|
17
|
+
import { Order } from '../order.js';
|
|
18
|
+
import { BaseSDK } from '../sdk.js';
|
|
19
|
+
import { createSolanaClient, type SolanaClient } from './client.js';
|
|
20
|
+
import { getSolanaOrderInstructions } from './order-instructions.js';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Solana-specific SDK implementation
|
|
24
|
+
*
|
|
25
|
+
* Handles Solana-specific aspects of cross-chain swaps using Solana blockchain.
|
|
26
|
+
* Uses @solana/kit for transaction creation, signing, and submission.
|
|
27
|
+
* Supports cross-chain swaps from Solana to other supported chains.
|
|
28
|
+
*/
|
|
29
|
+
export class SolanaSDK extends BaseSDK {
|
|
30
|
+
/** Configuration for Solana connection and authentication */
|
|
31
|
+
private readonly config: SolanaConfig;
|
|
32
|
+
/** Client for Solana RPC interactions and transaction handling */
|
|
33
|
+
private client: SolanaClient;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Creates a new instance of the Solana SDK
|
|
37
|
+
*
|
|
38
|
+
* @param config Solana configuration including privateKey, commitment level, and optional RPC URL
|
|
39
|
+
*/
|
|
40
|
+
constructor(config: SolanaConfig) {
|
|
41
|
+
super();
|
|
42
|
+
this.config = config;
|
|
43
|
+
this.client = createSolanaClient(config);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Gets the user's Solana wallet address derived from their private key
|
|
48
|
+
*
|
|
49
|
+
* Uses @solana/kit to securely derive the wallet address from the private key
|
|
50
|
+
*
|
|
51
|
+
* @returns Promise resolving to the user's Solana address as a Base58-encoded string
|
|
52
|
+
* @throws {SolanaError} If address derivation fails
|
|
53
|
+
*/
|
|
54
|
+
public async getUserAddress(): Promise<string> {
|
|
55
|
+
const signer = await this.getUserSigner();
|
|
56
|
+
|
|
57
|
+
return signer.address;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Creates a CryptoKeyPair from the user's private key
|
|
62
|
+
*
|
|
63
|
+
* Converts the Base58-encoded private key to the format required by WebCrypto API
|
|
64
|
+
*
|
|
65
|
+
* @returns Promise resolving to a CryptoKeyPair for transaction signing
|
|
66
|
+
* @private
|
|
67
|
+
*/
|
|
68
|
+
private async getUserCryptoKeypair(): Promise<CryptoKeyPair> {
|
|
69
|
+
const encoder = getBase58Encoder();
|
|
70
|
+
const bytesWithPrefix = encoder.encode(this.config.privateKey);
|
|
71
|
+
return createKeyPairFromBytes(bytesWithPrefix);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Creates a KeyPairSigner from the user's crypto keypair
|
|
76
|
+
*
|
|
77
|
+
* The KeyPairSigner is used for transaction signing and verification
|
|
78
|
+
*
|
|
79
|
+
* @returns Promise resolving to a KeyPairSigner for transaction operations
|
|
80
|
+
* @private
|
|
81
|
+
*/
|
|
82
|
+
private async getUserSigner(): Promise<KeyPairSigner<string>> {
|
|
83
|
+
const signer = await this.getUserCryptoKeypair();
|
|
84
|
+
return createSignerFromKeyPair(signer);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Prepares a Solana order for submission
|
|
89
|
+
*
|
|
90
|
+
* This method:
|
|
91
|
+
* 1. Gets the user's signer from their private key
|
|
92
|
+
* 2. Generates Solana-specific instructions for the order
|
|
93
|
+
* 3. Creates, signs, and submits the transaction to the Solana blockchain
|
|
94
|
+
* 4. Returns the prepared order with the orderPubkey for tracking
|
|
95
|
+
*
|
|
96
|
+
* @param order The validated order to prepare
|
|
97
|
+
* @returns Promise resolving to a prepared order with Solana-specific data
|
|
98
|
+
* @protected
|
|
99
|
+
*/
|
|
100
|
+
protected async prepareOrder(order: Order): Promise<PreparedOrder> {
|
|
101
|
+
const signer = await this.getUserSigner();
|
|
102
|
+
const signerKeyPair = await this.getUserCryptoKeypair();
|
|
103
|
+
|
|
104
|
+
const { orderKeyPair, instructions } = await getSolanaOrderInstructions(order);
|
|
105
|
+
|
|
106
|
+
const noopSigner = createNoopSigner(signer.address);
|
|
107
|
+
|
|
108
|
+
const { value: latestBlockhash } = await this.client.rpc
|
|
109
|
+
.getLatestBlockhash({ commitment: this.config.commitment })
|
|
110
|
+
.send();
|
|
111
|
+
|
|
112
|
+
// TODO: Think if we should include transaction message on getSolanaOrderInstructions
|
|
113
|
+
const transactionMessage = pipe(
|
|
114
|
+
createTransactionMessage({ version: 0 }),
|
|
115
|
+
(tx) => setTransactionMessageFeePayerSigner(noopSigner, tx),
|
|
116
|
+
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
|
|
117
|
+
(tx) => appendTransactionMessageInstructions(instructions, tx),
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const myTx = compileTransaction(transactionMessage);
|
|
121
|
+
|
|
122
|
+
const signature = await signTransaction([signerKeyPair, orderKeyPair.keyPair], myTx);
|
|
123
|
+
|
|
124
|
+
await this.client.sendAndConfirmTransaction(signature, {
|
|
125
|
+
commitment: this.config.commitment,
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
order,
|
|
130
|
+
preparedData: {
|
|
131
|
+
orderPubkey: orderKeyPair.address,
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { isAddress as isSolanaAddress } from '@solana/kit';
|
|
2
|
+
import { MAX_UINT_64 } from '../../constants.js';
|
|
3
|
+
import { BaseValidator } from '../../utils/base-validator.js';
|
|
4
|
+
|
|
5
|
+
export class SolanaValidator extends BaseValidator {
|
|
6
|
+
isValidAddress(address: string): boolean {
|
|
7
|
+
return isSolanaAddress(address);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
isValidTokenAddress(tokenAddress: string): boolean {
|
|
11
|
+
return isSolanaAddress(tokenAddress);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
isValidAmount(amount: bigint): boolean {
|
|
15
|
+
return amount > 0n && amount < MAX_UINT_64;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
protected getChainName(): string {
|
|
19
|
+
return 'Solana';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public async chainSpecificValidation(): Promise<void> {
|
|
23
|
+
// No chain-specific validation implemented for now for Solana
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
2
|
+
import { normalizeSuiObjectId, SUI_TYPE_ARG } from '@mysten/sui/utils';
|
|
3
|
+
|
|
4
|
+
import { ChainID } from '../../chains.js';
|
|
5
|
+
import {
|
|
6
|
+
SRC_CHAIN_GUARD,
|
|
7
|
+
SUI_GUARD_COLLATERAL_TYPE,
|
|
8
|
+
SUI_GUARD_STABLECOIN_TYPE,
|
|
9
|
+
SUI_PACKAGE_ID,
|
|
10
|
+
} from '../../constants.js';
|
|
11
|
+
import { ValidationError } from '../../errors/index.js';
|
|
12
|
+
import type { Order } from '../order.js';
|
|
13
|
+
import { createSuiClient } from './client.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Generates Sui order transaction for creating an order
|
|
17
|
+
* @param order The order to generate transaction for
|
|
18
|
+
* @returns Object containing the transaction
|
|
19
|
+
*/
|
|
20
|
+
export async function getSuiOrderTransaction(order: Order): Promise<Transaction> {
|
|
21
|
+
const userAddress = order.user;
|
|
22
|
+
const client = createSuiClient();
|
|
23
|
+
const coins = await client.getCoins({
|
|
24
|
+
owner: userAddress,
|
|
25
|
+
coinType: order.sourceTokenAddress,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const guardAddress = SRC_CHAIN_GUARD[ChainID.Sui];
|
|
29
|
+
|
|
30
|
+
const sourceTokenInCoins = coins.data.sort((a, b) => Number(b.balance) - Number(a.balance));
|
|
31
|
+
|
|
32
|
+
if (sourceTokenInCoins.length === 0) {
|
|
33
|
+
throw new ValidationError(`No token (${order.sourceTokenAddress}) to create order`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const coinsInSum = sourceTokenInCoins.reduce((acc, coin) => acc + BigInt(coin.balance), 0n);
|
|
37
|
+
|
|
38
|
+
if (coinsInSum < order.sourceTokenAmount) {
|
|
39
|
+
throw new ValidationError(
|
|
40
|
+
`Insufficient balance to create order. Total coins is ${coinsInSum}, but order requires ${order.sourceTokenAmount}`,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const spendingGasCoin = normalizeSuiObjectId(order.sourceTokenAddress) === normalizeSuiObjectId(SUI_TYPE_ARG);
|
|
45
|
+
|
|
46
|
+
const tx = new Transaction();
|
|
47
|
+
const coinInArg = spendingGasCoin ? tx.gas : sourceTokenInCoins[0]!.coinObjectId;
|
|
48
|
+
|
|
49
|
+
if (sourceTokenInCoins.length > 1) {
|
|
50
|
+
// Merging coins IN into a single object just in case
|
|
51
|
+
tx.mergeCoins(
|
|
52
|
+
// merge into 1st coin object
|
|
53
|
+
coinInArg,
|
|
54
|
+
// merge the rest of coins
|
|
55
|
+
sourceTokenInCoins.slice(1).map((coin) => coin.coinObjectId),
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const [coinIn] = tx.splitCoins(coinInArg, [order.sourceTokenAmount]);
|
|
60
|
+
|
|
61
|
+
tx.moveCall({
|
|
62
|
+
package: SUI_PACKAGE_ID,
|
|
63
|
+
module: 'source_chain_guard',
|
|
64
|
+
function: 'create_order',
|
|
65
|
+
arguments: [
|
|
66
|
+
tx.object(guardAddress),
|
|
67
|
+
coinIn,
|
|
68
|
+
tx.pure.u64(order.minStablecoinAmount),
|
|
69
|
+
tx.pure.u64(order.deadline * 1000), // Convert to milliseconds
|
|
70
|
+
tx.pure.vector('u8', order.executionDetailsHashToBytes()),
|
|
71
|
+
],
|
|
72
|
+
typeArguments: [SUI_GUARD_COLLATERAL_TYPE, order.sourceTokenAddress, SUI_GUARD_STABLECOIN_TYPE],
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
tx.setSender(userAddress);
|
|
76
|
+
|
|
77
|
+
return tx;
|
|
78
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { SuiClient } from '@mysten/sui/client';
|
|
2
|
+
import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';
|
|
3
|
+
|
|
4
|
+
import type { SuiConfig } from '../../config.js';
|
|
5
|
+
import { OrderCreationError } from '../../errors/index.js';
|
|
6
|
+
import type { PreparedOrder } from '../../types/intent.js';
|
|
7
|
+
import { Order } from '../order.js';
|
|
8
|
+
import { BaseSDK } from '../sdk.js';
|
|
9
|
+
import { createSuiClient } from './client.js';
|
|
10
|
+
import { getSuiOrderTransaction } from './order-transaction.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Sui-specific SDK implementation
|
|
14
|
+
*
|
|
15
|
+
* Handles Sui-specific aspects of cross-chain swaps using the Sui blockchain.
|
|
16
|
+
* Uses @mysten/sui libraries for transaction creation, signing, and submission.
|
|
17
|
+
* Supports cross-chain swaps from Sui to other supported chains.
|
|
18
|
+
*/
|
|
19
|
+
export class SuiSDK extends BaseSDK {
|
|
20
|
+
/** Configuration for Sui connection and authentication */
|
|
21
|
+
private readonly config: SuiConfig;
|
|
22
|
+
/** Client for Sui RPC interactions and transaction handling */
|
|
23
|
+
private client: SuiClient;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new instance of the Sui SDK
|
|
27
|
+
*
|
|
28
|
+
* @param config Sui configuration including privateKey and optional RPC URL
|
|
29
|
+
*/
|
|
30
|
+
constructor(config: SuiConfig) {
|
|
31
|
+
super();
|
|
32
|
+
this.config = config;
|
|
33
|
+
this.client = createSuiClient();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Gets the user's Sui wallet address derived from their private key
|
|
38
|
+
*
|
|
39
|
+
* Uses Ed25519Keypair to securely derive the wallet address from the private key
|
|
40
|
+
*
|
|
41
|
+
* @returns Promise resolving to the user's Sui address as a hex string
|
|
42
|
+
*/
|
|
43
|
+
public async getUserAddress(): Promise<string> {
|
|
44
|
+
return this.getKeyPair().toSuiAddress();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates an Ed25519Keypair from the user's private key
|
|
49
|
+
*
|
|
50
|
+
* The keypair is used for transaction signing and address derivation
|
|
51
|
+
*
|
|
52
|
+
* @returns Ed25519Keypair for cryptographic operations
|
|
53
|
+
* @private
|
|
54
|
+
*/
|
|
55
|
+
private getKeyPair(): Ed25519Keypair {
|
|
56
|
+
return Ed25519Keypair.fromSecretKey(this.config.privateKey);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Prepares a Sui order for submission
|
|
61
|
+
*
|
|
62
|
+
* This method:
|
|
63
|
+
* 1. Gets the user's keypair from their private key
|
|
64
|
+
* 2. Generates Sui-specific transaction for the order
|
|
65
|
+
* 3. Signs and executes the transaction on the Sui blockchain
|
|
66
|
+
* 4. Returns the prepared order with the transaction hash for tracking
|
|
67
|
+
*
|
|
68
|
+
* @param order The validated order to prepare
|
|
69
|
+
* @returns Promise resolving to a prepared order with Sui-specific data
|
|
70
|
+
* @protected
|
|
71
|
+
*/
|
|
72
|
+
protected async prepareOrder(order: Order): Promise<PreparedOrder> {
|
|
73
|
+
try {
|
|
74
|
+
const signer = this.getKeyPair();
|
|
75
|
+
|
|
76
|
+
const transaction = await getSuiOrderTransaction(order);
|
|
77
|
+
|
|
78
|
+
const tx = await this.client.signAndExecuteTransaction({
|
|
79
|
+
signer,
|
|
80
|
+
transaction,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
await this.client.waitForTransaction({ digest: tx.digest });
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
order,
|
|
87
|
+
preparedData: {
|
|
88
|
+
transactionHash: tx.digest,
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
} catch (error) {
|
|
92
|
+
throw new OrderCreationError('Failed to prepare Sui order', error);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';
|
|
2
|
+
import { MAX_UINT_64 } from '../../constants.js';
|
|
3
|
+
import { BaseValidator } from '../../utils/base-validator.js';
|
|
4
|
+
|
|
5
|
+
const SUI_TOKEN_ADDRESS_REGEX = /^0x[a-fA-F0-9]{64}::\w+::\w+$/;
|
|
6
|
+
|
|
7
|
+
export class SuiValidator extends BaseValidator {
|
|
8
|
+
isValidAddress(address: string): boolean {
|
|
9
|
+
return isValidSuiAddress(normalizeSuiAddress(address));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
isValidTokenAddress(tokenAddress: string): boolean {
|
|
13
|
+
const [address] = tokenAddress.split('::');
|
|
14
|
+
|
|
15
|
+
const isValidAddress = address !== undefined ? this.isValidAddress(address) : false;
|
|
16
|
+
|
|
17
|
+
return isValidAddress && SUI_TOKEN_ADDRESS_REGEX.test(tokenAddress);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
isValidAmount(amount: bigint): boolean {
|
|
21
|
+
return amount > 0n && amount < MAX_UINT_64;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
protected getChainName(): string {
|
|
25
|
+
return 'Sui';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public async chainSpecificValidation(): Promise<void> {
|
|
29
|
+
// No chain-specific validation implemented for now for Sui
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
export class BaseError extends Error {
|
|
2
|
+
constructor(
|
|
3
|
+
message: string,
|
|
4
|
+
public override readonly cause?: unknown,
|
|
5
|
+
) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = this.constructor.name;
|
|
8
|
+
Object.setPrototypeOf(this, BaseError.prototype);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Format the error for logging/debugging
|
|
12
|
+
public toJSON(): Record<string, unknown> {
|
|
13
|
+
return {
|
|
14
|
+
name: this.name,
|
|
15
|
+
message: this.message,
|
|
16
|
+
cause: this.formatCause(),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
private formatCause(): unknown {
|
|
21
|
+
if (this.cause instanceof Error) {
|
|
22
|
+
if ('toJSON' in this.cause && typeof this.cause.toJSON === 'function') {
|
|
23
|
+
return this.cause.toJSON();
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
name: this.cause.name,
|
|
27
|
+
message: this.cause.message,
|
|
28
|
+
...(this.cause.stack && { stack: this.cause.stack }),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return this.cause;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Chain-specific error classes
|
|
36
|
+
export class EVMError extends BaseError {
|
|
37
|
+
constructor(message: string, cause?: unknown) {
|
|
38
|
+
super(message, cause);
|
|
39
|
+
Object.setPrototypeOf(this, EVMError.prototype);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class SolanaError extends BaseError {
|
|
44
|
+
constructor(message: string, cause?: unknown) {
|
|
45
|
+
super(message, cause);
|
|
46
|
+
Object.setPrototypeOf(this, SolanaError.prototype);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class SuiError extends BaseError {
|
|
51
|
+
constructor(message: string, cause?: unknown) {
|
|
52
|
+
super(message, cause);
|
|
53
|
+
Object.setPrototypeOf(this, SuiError.prototype);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Specific error types
|
|
58
|
+
export class ValidationError extends BaseError {
|
|
59
|
+
constructor(message: string, cause?: unknown) {
|
|
60
|
+
super(message, cause);
|
|
61
|
+
Object.setPrototypeOf(this, ValidationError.prototype);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export class OrderCreationError extends BaseError {
|
|
66
|
+
constructor(message: string, cause?: unknown) {
|
|
67
|
+
super(message, cause);
|
|
68
|
+
Object.setPrototypeOf(this, OrderCreationError.prototype);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export class NetworkError extends BaseError {
|
|
73
|
+
constructor(message: string, cause?: unknown) {
|
|
74
|
+
super(message, cause);
|
|
75
|
+
Object.setPrototypeOf(this, NetworkError.prototype);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export class InsufficientBalanceError extends BaseError {
|
|
80
|
+
constructor(message: string, cause?: unknown) {
|
|
81
|
+
super(message, cause);
|
|
82
|
+
Object.setPrototypeOf(this, InsufficientBalanceError.prototype);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export class InsufficientAllowanceError extends BaseError {
|
|
87
|
+
constructor(message: string, cause?: unknown) {
|
|
88
|
+
super(message, cause);
|
|
89
|
+
Object.setPrototypeOf(this, InsufficientAllowanceError.prototype);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function handleError(error: unknown): BaseError {
|
|
93
|
+
if (error instanceof BaseError) {
|
|
94
|
+
return error;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (error instanceof Error) {
|
|
98
|
+
return new BaseError(error.message, error);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return new BaseError(
|
|
102
|
+
typeof error === 'string' ? error : 'Unknown error occurred',
|
|
103
|
+
|
|
104
|
+
error,
|
|
105
|
+
);
|
|
106
|
+
}
|