-
Notifications
You must be signed in to change notification settings - Fork 0
/
circle-emulator.ts
102 lines (96 loc) · 3.7 KB
/
circle-emulator.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import * as anchor from "@project-serum/anchor";
import { createMintToCheckedInstruction } from "@solana/spl-token";
import { ApiError } from "../shared/error";
import { FAKE_USDC, RPC_URL, USDC_DECIMALS } from "../constants";
import { BANK_AUTH } from "../program/constants";
import { createWorkspace, WorkSpace } from "../program/workspace";
import { CircleClient, CircleDepositArgs } from "./client";
import { Card, CvvResults } from "@circle-fin/circle-sdk";
/**
* This is an Emulator for the Circle SDK. It uses mocked data to simulate the Circle SDK.
* This is used for testing purposes.
*/
export class CircleEmulator implements CircleClient {
private readonly connection: anchor.web3.Connection;
private readonly provider: anchor.AnchorProvider;
private readonly payer: anchor.web3.Keypair;
private constructor(sdk: WorkSpace) {
this.connection = sdk.connection;
this.provider = sdk.provider;
this.payer = sdk.payer;
}
/**
*
* @returns CircleEmulator with default values for the workspace
*/
public static ofDefaults(): CircleEmulator {
return new CircleEmulator(createWorkspace(RPC_URL, BANK_AUTH));
}
/**
*
* @param sdk - Workspace to use for the emulator
* @returns CircleEmulator with the provided workspace
*/
public static withSdk(sdk: WorkSpace) {
return new CircleEmulator(sdk);
}
/**
*
* Simulates the deposit of USDC into a user's account by Minting Fake USDC to the destination ATA
*
* @param args CircleDepositArgs - The set of arguments needed to deposit funds into a user's account
* @throws generalServerError if the MintTo transaction fails
*/
public async depositUsdc(args: CircleDepositArgs): Promise<void> {
const tokenMint: anchor.web3.PublicKey = FAKE_USDC.publicKey;
const destination: anchor.web3.PublicKey = new anchor.web3.PublicKey(args.destinationAtaString);
const decimalAmount = args.amount * (10 ** USDC_DECIMALS);
let ix = createMintToCheckedInstruction(tokenMint, destination, this.provider.publicKey, decimalAmount, USDC_DECIMALS);
let transaction = new anchor.web3.Transaction().add(ix);
try {
const { blockhash, lastValidBlockHeight } = await this.connection.getLatestBlockhash();
transaction.recentBlockhash = blockhash;
transaction.lastValidBlockHeight = lastValidBlockHeight;
const txId = await anchor.web3.sendAndConfirmTransaction(this.connection, transaction, [this.payer]);
return;
}
catch {
ApiError.generalServerError("Failed to deposit funds.");
}
}
/**
*
* Fetches a demo card for testing from a given id
*
* @param id - The id of the card to fetch (not currently utilzied)
* @returns a predefined card object
*/
public async fetchCard(id: string): Promise<Card> {
//TODO fill in with something better
return {
id: "baronsupercard",
status: "pending",
billingDetails: {
name: "Baron Bilano",
city: "Baronville",
country: "Baronia",
line1: "123 Baron Street",
postalCode: "12345"
},
expMonth: 1,
expYear: 2025,
network: "VISA",
last4: "4321",
fingerprint: "alskjdflajksdflj",
verification: {
avs: "laksjlkasjdf",
cvv: CvvResults.Pass
},
metadata: {
email: "baron.bilano@gmail.com"
},
createDate: "21:30:38Z",
updateDate: "21:30:38Z"
}
}
}