import {
NetworkEnum,
SDK,
SolanaAddress,
HashLock,
EvmAddress,
SvmSrcEscrowFactory,
OrderStatus
} from '@1inch/cross-chain-sdk'
import { utils, web3 } from '@coral-xyz/anchor'
import { randomBytes } from 'node:crypto'
import { setTimeout } from 'node:timers/promises'
import assert from 'node:assert'
const authKey = process.env.DEV_PORTAL_API_TOKEN
assert(authKey, 'provide auth key in DEV_PORTAL_API_TOKEN')
const signerPrivateKey = process.env.SOLANA_PRIVATE_KEY
assert(signerPrivateKey, 'provide solana private key in SOLANA_PRIVATE_KEY')
const makerSigner = web3.Keypair.fromSecretKey(
utils.bytes.bs58.decode(signerPrivateKey)
)
const SOLANA_RPC = 'https://api.mainnet-beta.solana.com'
const sdk = new SDK({
url: 'https://api.1inch.com/fusion-plus',
authKey
})
const USDT_SOL = 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB'
const USDT_ETHEREUM = '0xdac17f958d2ee523a2206206994597c13d831ec7'
const maker = makerSigner.publicKey.toBase58()
const receiver = '0x962a836519109e162754161000D65d9Dc027Fa0F'
const srcToken = SolanaAddress.fromString(USDT_SOL)
const dstToken = EvmAddress.fromString(USDT_ETHEREUM)
const amount = 10_000_000n // 10 USDT
const srcChainId = NetworkEnum.SOLANA
const dstChainId = NetworkEnum.ETHEREUM
async function main(): Promise<void> {
const quote = await sdk.getQuote({
amount: amount.toString(),
srcChainId,
dstChainId,
srcTokenAddress: srcToken.toString(),
dstTokenAddress: dstToken.toString(),
enableEstimate: true,
walletAddress: maker
})
const preset = quote.getPreset(quote.recommendedPreset)
const secrets = Array.from({ length: preset.secretsCount }).map(
() => '0x' + randomBytes(32).toString('hex')
)
const secretHashes = secrets.map(HashLock.hashSecret)
const leaves = HashLock.getMerkleLeaves(secrets)
const hashLock = secrets.length > 1
? HashLock.forMultipleFills(leaves)
: HashLock.forSingleFill(secrets[0])
const order = quote.createSolanaOrder({
hashLock,
receiver: EvmAddress.fromString(receiver),
preset: quote.recommendedPreset
})
const orderHash = await sdk.announceOrder(order, quote.quoteId, secretHashes)
console.log('announced order to relayer', orderHash)
const ix = SvmSrcEscrowFactory.DEFAULT.createOrder(order, {
srcTokenProgramId: SolanaAddress.TOKEN_PROGRAM_ID
})
const tx = new web3.Transaction().add({
data: ix.data,
programId: new web3.PublicKey(ix.programId.toBuffer()),
keys: ix.accounts.map((a) => ({
isSigner: a.isSigner,
isWritable: a.isWritable,
pubkey: new web3.PublicKey(a.pubkey.toBuffer())
}))
})
const connection = new web3.Connection(SOLANA_RPC)
const result = await connection.sendTransaction(tx, [makerSigner])
console.log('submitted order', result)
await setTimeout(5000)
const alreadyShared = new Set<number>()
while (true) {
const readyToAcceptSecretes = await sdk.getReadyToAcceptSecretFills(orderHash)
const idxes = readyToAcceptSecretes.fills.map((f) => f.idx)
for (const idx of idxes) {
if (!alreadyShared.has(idx)) {
await sdk.submitSecret(orderHash, secrets[idx])
alreadyShared.add(idx)
console.log('submitted secret', secrets[idx])
}
}
const { status } = await sdk.getOrderStatus(orderHash)
if (
status === OrderStatus.Executed ||
status === OrderStatus.Expired ||
status === OrderStatus.Refunded
) {
break
}
await setTimeout(5000)
}
const statusResponse = await sdk.getOrderStatus(orderHash)
console.log(statusResponse)
}
main()