import {
createTestnetClient,
createMemoryKeyService,
createMemorySigner,
transfer,
near,
isNatError
} from 'near-api-ts';
interface PaymentResult {
success: boolean;
transactionId?: string;
error?: string;
}
async function sendPayment(
fromAccount: string,
privateKey: string,
toAccount: string,
amount: string
): Promise<PaymentResult> {
try {
// Setup
const client = createTestnetClient();
const keyService = createMemoryKeyService({
keySource: { privateKey }
});
const signer = createMemorySigner({
signerAccountId: fromAccount,
client,
keyService
});
// Validate amount
const nearAmount = near(amount);
if (nearAmount.near <= 0) {
return {
success: false,
error: 'Amount must be positive'
};
}
// Execute transaction
const result = await signer.executeTransaction({
intent: {
action: transfer({ amount: nearAmount }),
receiverAccountId: toAccount
}
});
return {
success: true,
transactionId: result.transactionOutcome.id
};
} catch (error) {
// Handle specific errors
if (isNatError(error, 'MemorySigner.ExecuteTransaction.Rpc.Transaction.Signer.Balance.TooLow')) {
return {
success: false,
error: 'Insufficient balance'
};
} else if (isNatError(error, 'MemorySigner.ExecuteTransaction.Rpc.Account.NotFound')) {
return {
success: false,
error: 'Receiver account not found'
};
} else {
return {
success: false,
error: 'Transaction failed'
};
}
}
}
// Usage
const result = await sendPayment(
'sender.testnet',
'ed25519:your-private-key',
'receiver.testnet',
'5.5'
);
if (result.success) {
console.log('Payment successful!');
console.log('Transaction ID:', result.transactionId);
} else {
console.error('Payment failed:', result.error);
}