@reown/appkit-solana-react-native 0.0.0-feat-siwx-20250924133535 → 0.0.0-feat-siwx-20250924195327
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/lib/commonjs/adapter.js +11 -3
- package/lib/commonjs/adapter.js.map +1 -1
- package/lib/commonjs/utils/createSPLTokenTransaction.js +96 -0
- package/lib/commonjs/utils/createSPLTokenTransaction.js.map +1 -0
- package/lib/commonjs/utils/createSendTransaction.js +3 -17
- package/lib/commonjs/utils/createSendTransaction.js.map +1 -1
- package/lib/module/adapter.js +11 -3
- package/lib/module/adapter.js.map +1 -1
- package/lib/module/utils/createSPLTokenTransaction.js +92 -0
- package/lib/module/utils/createSPLTokenTransaction.js.map +1 -0
- package/lib/module/utils/createSendTransaction.js +4 -19
- package/lib/module/utils/createSendTransaction.js.map +1 -1
- package/lib/typescript/adapter.d.ts +1 -0
- package/lib/typescript/adapter.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +8 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/utils/createSPLTokenTransaction.d.ts +4 -0
- package/lib/typescript/utils/createSPLTokenTransaction.d.ts.map +1 -0
- package/lib/typescript/utils/createSendTransaction.d.ts +2 -2
- package/lib/typescript/utils/createSendTransaction.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/adapter.ts +17 -7
- package/src/types.ts +9 -0
- package/src/utils/createSPLTokenTransaction.ts +152 -0
- package/src/utils/createSendTransaction.ts +3 -19
package/lib/commonjs/adapter.js
CHANGED
|
@@ -9,6 +9,7 @@ var _helpers = require("./helpers");
|
|
|
9
9
|
var _web = require("@solana/web3.js");
|
|
10
10
|
var _bs = _interopRequireDefault(require("bs58"));
|
|
11
11
|
var _createSendTransaction = require("./utils/createSendTransaction");
|
|
12
|
+
var _createSPLTokenTransaction = require("./utils/createSPLTokenTransaction");
|
|
12
13
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
14
|
class SolanaAdapter extends _appkitCommonReactNative.SolanaBaseAdapter {
|
|
14
15
|
static supportedNamespace = 'solana';
|
|
@@ -148,7 +149,8 @@ class SolanaAdapter extends _appkitCommonReactNative.SolanaBaseAdapter {
|
|
|
148
149
|
toAddress,
|
|
149
150
|
amount,
|
|
150
151
|
network,
|
|
151
|
-
rpcUrl
|
|
152
|
+
rpcUrl,
|
|
153
|
+
tokenMint
|
|
152
154
|
} = data;
|
|
153
155
|
if (!this.connector) {
|
|
154
156
|
throw new Error('SolanaAdapter:sendTransaction - no active connector');
|
|
@@ -181,11 +183,17 @@ class SolanaAdapter extends _appkitCommonReactNative.SolanaBaseAdapter {
|
|
|
181
183
|
|
|
182
184
|
// Create connection
|
|
183
185
|
const connection = new _web.Connection(connectionRpcUrl, 'confirmed');
|
|
184
|
-
const transaction = await (0,
|
|
186
|
+
const transaction = tokenMint ? await (0, _createSPLTokenTransaction.createSPLTokenTransaction)({
|
|
185
187
|
connection,
|
|
186
188
|
fromAddress,
|
|
187
189
|
toAddress,
|
|
188
|
-
|
|
190
|
+
amount,
|
|
191
|
+
tokenMint
|
|
192
|
+
}) : await (0, _createSendTransaction.createSendTransaction)({
|
|
193
|
+
connection,
|
|
194
|
+
fromAddress,
|
|
195
|
+
toAddress,
|
|
196
|
+
amount
|
|
189
197
|
});
|
|
190
198
|
|
|
191
199
|
// Sign the transaction
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_appkitCommonReactNative","require","_helpers","_web","_bs","_interopRequireDefault","_createSendTransaction","e","__esModule","default","SolanaAdapter","SolanaBaseAdapter","supportedNamespace","constructor","adapterType","getBalance","params","network","address","tokens","connector","Error","balanceAddress","getAccounts","find","account","includes","id","toString","amount","symbol","rpcUrl","rpcUrls","http","base58Address","split","token","caipNetworkId","balance","getSolanaTokenBalance","getSolanaNativeBalance","emit","error","signTransaction","transaction","provider","getProvider","isDeeplinkProvider","type","serializedTransaction","transactionBytes","Uint8Array","serialize","verifySignatures","base58","encode","Buffer","from","result","request","method","pubkey","signature","decoded","decode","Transaction","feePayer","addSignature","decodedTransaction","decodedBytes","VersionedTransaction","deserialize","message","sendTransaction","data","fromAddress","toAddress","connectionRpcUrl","connection","Connection","
|
|
1
|
+
{"version":3,"names":["_appkitCommonReactNative","require","_helpers","_web","_bs","_interopRequireDefault","_createSendTransaction","_createSPLTokenTransaction","e","__esModule","default","SolanaAdapter","SolanaBaseAdapter","supportedNamespace","constructor","adapterType","getBalance","params","network","address","tokens","connector","Error","balanceAddress","getAccounts","find","account","includes","id","toString","amount","symbol","rpcUrl","rpcUrls","http","base58Address","split","token","caipNetworkId","balance","getSolanaTokenBalance","getSolanaNativeBalance","emit","error","signTransaction","transaction","provider","getProvider","isDeeplinkProvider","type","serializedTransaction","transactionBytes","Uint8Array","serialize","verifySignatures","base58","encode","Buffer","from","result","request","method","pubkey","signature","decoded","decode","Transaction","feePayer","addSignature","decodedTransaction","decodedBytes","VersionedTransaction","deserialize","message","sendTransaction","data","fromAddress","toAddress","tokenMint","connectionRpcUrl","connection","Connection","createSPLTokenTransaction","createSendTransaction","signedTransaction","sendRawTransaction","skipPreflight","preflightCommitment","signMessage","chainId","chain","getSupportedNamespace","undefined","encodedMessage","TextEncoder","switchNetwork","switchError","namespaces","getNamespaces","accounts","disconnect","exports"],"sourceRoot":"../../src","sources":["adapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createSPLTokenTransaction = createSPLTokenTransaction;
|
|
7
|
+
var _splToken = require("@solana/spl-token");
|
|
8
|
+
var _web = require("@solana/web3.js");
|
|
9
|
+
const SPL_COMPUTE_BUDGET_CONSTANTS = {
|
|
10
|
+
UNIT_PRICE_MICRO_LAMPORTS: 1000000,
|
|
11
|
+
UNIT_LIMIT_WITH_ATA_CREATION: 400000
|
|
12
|
+
};
|
|
13
|
+
async function getMintOwnerProgramId(connection, mint) {
|
|
14
|
+
const info = await connection.getAccountInfo(mint);
|
|
15
|
+
if (!info) {
|
|
16
|
+
throw new Error('Mint account not found');
|
|
17
|
+
}
|
|
18
|
+
if (info.owner.equals(_splToken.TOKEN_PROGRAM_ID)) {
|
|
19
|
+
return _splToken.TOKEN_PROGRAM_ID;
|
|
20
|
+
}
|
|
21
|
+
if (info.owner.equals(_splToken.TOKEN_2022_PROGRAM_ID)) {
|
|
22
|
+
return _splToken.TOKEN_2022_PROGRAM_ID;
|
|
23
|
+
}
|
|
24
|
+
throw new Error('Unknown mint owner program');
|
|
25
|
+
}
|
|
26
|
+
async function createSPLTokenTransaction({
|
|
27
|
+
fromAddress,
|
|
28
|
+
toAddress,
|
|
29
|
+
amount,
|
|
30
|
+
tokenMint,
|
|
31
|
+
connection
|
|
32
|
+
}) {
|
|
33
|
+
if (!fromAddress) {
|
|
34
|
+
throw new Error('No public key found');
|
|
35
|
+
}
|
|
36
|
+
if (amount <= 0) {
|
|
37
|
+
throw new Error('Amount must be greater than 0');
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const fromPubkey = new _web.PublicKey(fromAddress);
|
|
41
|
+
const toPubkey = new _web.PublicKey(toAddress);
|
|
42
|
+
const mintPubkey = new _web.PublicKey(tokenMint);
|
|
43
|
+
const programId = await getMintOwnerProgramId(connection, mintPubkey);
|
|
44
|
+
const mintInfo = await (0, _splToken.getMint)(connection, mintPubkey, undefined, programId);
|
|
45
|
+
const decimals = mintInfo.decimals;
|
|
46
|
+
if (decimals < 0) {
|
|
47
|
+
throw new Error('Invalid token decimals');
|
|
48
|
+
}
|
|
49
|
+
const tokenAmount = Math.floor(amount * 10 ** decimals);
|
|
50
|
+
const fromTokenAccount = (0, _splToken.getAssociatedTokenAddressSync)(mintPubkey, fromPubkey, false, programId);
|
|
51
|
+
const toTokenAccount = (0, _splToken.getAssociatedTokenAddressSync)(mintPubkey, toPubkey, false, programId);
|
|
52
|
+
try {
|
|
53
|
+
const fromAccount = await (0, _splToken.getAccount)(connection, fromTokenAccount, undefined, programId);
|
|
54
|
+
if (fromAccount.amount < BigInt(tokenAmount)) {
|
|
55
|
+
throw new Error('Insufficient token balance');
|
|
56
|
+
}
|
|
57
|
+
} catch (error) {
|
|
58
|
+
if (error instanceof _splToken.TokenAccountNotFoundError) {
|
|
59
|
+
throw new Error('Sender does not have a token account for this mint');
|
|
60
|
+
}
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
let shouldCreateATA = false;
|
|
64
|
+
try {
|
|
65
|
+
await (0, _splToken.getAccount)(connection, toTokenAccount, undefined, programId);
|
|
66
|
+
} catch (error) {
|
|
67
|
+
if (error instanceof _splToken.TokenAccountNotFoundError) {
|
|
68
|
+
shouldCreateATA = true;
|
|
69
|
+
} else {
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const instructions = [];
|
|
74
|
+
if (shouldCreateATA) {
|
|
75
|
+
instructions.push(_web.ComputeBudgetProgram.setComputeUnitPrice({
|
|
76
|
+
microLamports: SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_PRICE_MICRO_LAMPORTS
|
|
77
|
+
}), _web.ComputeBudgetProgram.setComputeUnitLimit({
|
|
78
|
+
units: SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT_WITH_ATA_CREATION
|
|
79
|
+
}));
|
|
80
|
+
instructions.push((0, _splToken.createAssociatedTokenAccountInstruction)(fromPubkey, toTokenAccount, toPubkey, mintPubkey, programId));
|
|
81
|
+
}
|
|
82
|
+
instructions.push((0, _splToken.createTransferCheckedInstruction)(fromTokenAccount, mintPubkey, toTokenAccount, fromPubkey, tokenAmount, decimals, [], programId));
|
|
83
|
+
const {
|
|
84
|
+
blockhash,
|
|
85
|
+
lastValidBlockHeight
|
|
86
|
+
} = await connection.getLatestBlockhash();
|
|
87
|
+
return new _web.Transaction({
|
|
88
|
+
feePayer: fromPubkey,
|
|
89
|
+
blockhash,
|
|
90
|
+
lastValidBlockHeight
|
|
91
|
+
}).add(...instructions);
|
|
92
|
+
} catch (error) {
|
|
93
|
+
throw new Error(`Failed to create SPL token transaction: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=createSPLTokenTransaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_splToken","require","_web","SPL_COMPUTE_BUDGET_CONSTANTS","UNIT_PRICE_MICRO_LAMPORTS","UNIT_LIMIT_WITH_ATA_CREATION","getMintOwnerProgramId","connection","mint","info","getAccountInfo","Error","owner","equals","TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","createSPLTokenTransaction","fromAddress","toAddress","amount","tokenMint","fromPubkey","PublicKey","toPubkey","mintPubkey","programId","mintInfo","getMint","undefined","decimals","tokenAmount","Math","floor","fromTokenAccount","getAssociatedTokenAddressSync","toTokenAccount","fromAccount","getAccount","BigInt","error","TokenAccountNotFoundError","shouldCreateATA","instructions","push","ComputeBudgetProgram","setComputeUnitPrice","microLamports","setComputeUnitLimit","units","createAssociatedTokenAccountInstruction","createTransferCheckedInstruction","blockhash","lastValidBlockHeight","getLatestBlockhash","Transaction","feePayer","add","message"],"sourceRoot":"../../../src","sources":["utils/createSPLTokenTransaction.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,33 +5,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.createSendTransaction = createSendTransaction;
|
|
7
7
|
var _web = require("@solana/web3.js");
|
|
8
|
-
// import type { Provider } from '@reown/appkit-utils/solana'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* These constants defines the cost of running the program, allowing to calculate the maximum
|
|
12
|
-
* amount of SOL that can be sent in case of cleaning the account and remove the rent exemption error.
|
|
13
|
-
*/
|
|
14
|
-
const COMPUTE_BUDGET_CONSTANTS = {
|
|
15
|
-
UNIT_PRICE_MICRO_LAMPORTS: 20000000,
|
|
16
|
-
UNIT_LIMIT: 500
|
|
17
|
-
};
|
|
18
8
|
async function createSendTransaction({
|
|
19
9
|
fromAddress,
|
|
20
10
|
toAddress,
|
|
21
|
-
|
|
11
|
+
amount,
|
|
22
12
|
connection
|
|
23
13
|
}) {
|
|
24
14
|
const fromPubkey = new _web.PublicKey(fromAddress);
|
|
25
15
|
const toPubkey = new _web.PublicKey(toAddress);
|
|
26
|
-
const lamports = Math.floor(
|
|
16
|
+
const lamports = Math.floor(amount * _web.LAMPORTS_PER_SOL);
|
|
27
17
|
const {
|
|
28
18
|
blockhash
|
|
29
19
|
} = await connection.getLatestBlockhash();
|
|
30
|
-
const instructions = [_web.
|
|
31
|
-
microLamports: COMPUTE_BUDGET_CONSTANTS.UNIT_PRICE_MICRO_LAMPORTS
|
|
32
|
-
}), _web.ComputeBudgetProgram.setComputeUnitLimit({
|
|
33
|
-
units: COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT
|
|
34
|
-
}), _web.SystemProgram.transfer({
|
|
20
|
+
const instructions = [_web.SystemProgram.transfer({
|
|
35
21
|
fromPubkey,
|
|
36
22
|
toPubkey,
|
|
37
23
|
lamports
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_web","require","
|
|
1
|
+
{"version":3,"names":["_web","require","createSendTransaction","fromAddress","toAddress","amount","connection","fromPubkey","PublicKey","toPubkey","lamports","Math","floor","LAMPORTS_PER_SOL","blockhash","getLatestBlockhash","instructions","SystemProgram","transfer","transaction","Transaction","add","feePayer","recentBlockhash"],"sourceRoot":"../../../src","sources":["utils/createSendTransaction.ts"],"mappings":";;;;;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AAeO,eAAeC,qBAAqBA,CAAC;EAC1CC,WAAW;EACXC,SAAS;EACTC,MAAM;EACNC;AACmB,CAAC,EAAwB;EAC5C,MAAMC,UAAU,GAAG,IAAIC,cAAS,CAACL,WAAW,CAAC;EAC7C,MAAMM,QAAQ,GAAG,IAAID,cAAS,CAACJ,SAAS,CAAC;EACzC,MAAMM,QAAQ,GAAGC,IAAI,CAACC,KAAK,CAACP,MAAM,GAAGQ,qBAAgB,CAAC;EAEtD,MAAM;IAAEC;EAAU,CAAC,GAAG,MAAMR,UAAU,CAACS,kBAAkB,CAAC,CAAC;EAE3D,MAAMC,YAAY,GAAG,CACnBC,kBAAa,CAACC,QAAQ,CAAC;IACrBX,UAAU;IACVE,QAAQ;IACRC;EACF,CAAC,CAAC,CACH;EAED,MAAMS,WAAW,GAAG,IAAIC,gBAAW,CAAC,CAAC,CAACC,GAAG,CAAC,GAAGL,YAAY,CAAC;EAC1DG,WAAW,CAACG,QAAQ,GAAGf,UAAU;EACjCY,WAAW,CAACI,eAAe,GAAGT,SAAS;EAEvC,OAAOK,WAAW;AACpB","ignoreList":[]}
|
package/lib/module/adapter.js
CHANGED
|
@@ -5,6 +5,7 @@ import { getSolanaNativeBalance, getSolanaTokenBalance } from './helpers';
|
|
|
5
5
|
import { Connection, Transaction, VersionedTransaction } from '@solana/web3.js';
|
|
6
6
|
import base58 from 'bs58';
|
|
7
7
|
import { createSendTransaction } from './utils/createSendTransaction';
|
|
8
|
+
import { createSPLTokenTransaction } from './utils/createSPLTokenTransaction';
|
|
8
9
|
export class SolanaAdapter extends SolanaBaseAdapter {
|
|
9
10
|
static supportedNamespace = 'solana';
|
|
10
11
|
constructor() {
|
|
@@ -143,7 +144,8 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
143
144
|
toAddress,
|
|
144
145
|
amount,
|
|
145
146
|
network,
|
|
146
|
-
rpcUrl
|
|
147
|
+
rpcUrl,
|
|
148
|
+
tokenMint
|
|
147
149
|
} = data;
|
|
148
150
|
if (!this.connector) {
|
|
149
151
|
throw new Error('SolanaAdapter:sendTransaction - no active connector');
|
|
@@ -176,11 +178,17 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
176
178
|
|
|
177
179
|
// Create connection
|
|
178
180
|
const connection = new Connection(connectionRpcUrl, 'confirmed');
|
|
179
|
-
const transaction = await
|
|
181
|
+
const transaction = tokenMint ? await createSPLTokenTransaction({
|
|
180
182
|
connection,
|
|
181
183
|
fromAddress,
|
|
182
184
|
toAddress,
|
|
183
|
-
|
|
185
|
+
amount,
|
|
186
|
+
tokenMint
|
|
187
|
+
}) : await createSendTransaction({
|
|
188
|
+
connection,
|
|
189
|
+
fromAddress,
|
|
190
|
+
toAddress,
|
|
191
|
+
amount
|
|
184
192
|
});
|
|
185
193
|
|
|
186
194
|
// Sign the transaction
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SolanaBaseAdapter","getSolanaNativeBalance","getSolanaTokenBalance","Connection","Transaction","VersionedTransaction","base58","createSendTransaction","SolanaAdapter","supportedNamespace","constructor","adapterType","getBalance","params","network","address","tokens","connector","Error","balanceAddress","getAccounts","find","account","includes","id","toString","amount","symbol","rpcUrl","rpcUrls","default","http","base58Address","split","token","caipNetworkId","balance","emit","error","signTransaction","transaction","provider","getProvider","isDeeplinkProvider","type","serializedTransaction","transactionBytes","Uint8Array","serialize","verifySignatures","encode","Buffer","from","result","request","method","pubkey","signature","decoded","decode","feePayer","addSignature","decodedTransaction","decodedBytes","deserialize","message","sendTransaction","data","fromAddress","toAddress","
|
|
1
|
+
{"version":3,"names":["SolanaBaseAdapter","getSolanaNativeBalance","getSolanaTokenBalance","Connection","Transaction","VersionedTransaction","base58","createSendTransaction","createSPLTokenTransaction","SolanaAdapter","supportedNamespace","constructor","adapterType","getBalance","params","network","address","tokens","connector","Error","balanceAddress","getAccounts","find","account","includes","id","toString","amount","symbol","rpcUrl","rpcUrls","default","http","base58Address","split","token","caipNetworkId","balance","emit","error","signTransaction","transaction","provider","getProvider","isDeeplinkProvider","type","serializedTransaction","transactionBytes","Uint8Array","serialize","verifySignatures","encode","Buffer","from","result","request","method","pubkey","signature","decoded","decode","feePayer","addSignature","decodedTransaction","decodedBytes","deserialize","message","sendTransaction","data","fromAddress","toAddress","tokenMint","connectionRpcUrl","connection","signedTransaction","sendRawTransaction","skipPreflight","preflightCommitment","signMessage","chainId","chain","getSupportedNamespace","undefined","encodedMessage","TextEncoder","switchNetwork","switchError","namespaces","getNamespaces","accounts","disconnect"],"sourceRoot":"../../src","sources":["adapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, TokenAccountNotFoundError, createAssociatedTokenAccountInstruction, createTransferCheckedInstruction, getAccount, getAssociatedTokenAddressSync, getMint } from '@solana/spl-token';
|
|
4
|
+
import { ComputeBudgetProgram, PublicKey, Transaction } from '@solana/web3.js';
|
|
5
|
+
const SPL_COMPUTE_BUDGET_CONSTANTS = {
|
|
6
|
+
UNIT_PRICE_MICRO_LAMPORTS: 1000000,
|
|
7
|
+
UNIT_LIMIT_WITH_ATA_CREATION: 400000
|
|
8
|
+
};
|
|
9
|
+
async function getMintOwnerProgramId(connection, mint) {
|
|
10
|
+
const info = await connection.getAccountInfo(mint);
|
|
11
|
+
if (!info) {
|
|
12
|
+
throw new Error('Mint account not found');
|
|
13
|
+
}
|
|
14
|
+
if (info.owner.equals(TOKEN_PROGRAM_ID)) {
|
|
15
|
+
return TOKEN_PROGRAM_ID;
|
|
16
|
+
}
|
|
17
|
+
if (info.owner.equals(TOKEN_2022_PROGRAM_ID)) {
|
|
18
|
+
return TOKEN_2022_PROGRAM_ID;
|
|
19
|
+
}
|
|
20
|
+
throw new Error('Unknown mint owner program');
|
|
21
|
+
}
|
|
22
|
+
export async function createSPLTokenTransaction({
|
|
23
|
+
fromAddress,
|
|
24
|
+
toAddress,
|
|
25
|
+
amount,
|
|
26
|
+
tokenMint,
|
|
27
|
+
connection
|
|
28
|
+
}) {
|
|
29
|
+
if (!fromAddress) {
|
|
30
|
+
throw new Error('No public key found');
|
|
31
|
+
}
|
|
32
|
+
if (amount <= 0) {
|
|
33
|
+
throw new Error('Amount must be greater than 0');
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const fromPubkey = new PublicKey(fromAddress);
|
|
37
|
+
const toPubkey = new PublicKey(toAddress);
|
|
38
|
+
const mintPubkey = new PublicKey(tokenMint);
|
|
39
|
+
const programId = await getMintOwnerProgramId(connection, mintPubkey);
|
|
40
|
+
const mintInfo = await getMint(connection, mintPubkey, undefined, programId);
|
|
41
|
+
const decimals = mintInfo.decimals;
|
|
42
|
+
if (decimals < 0) {
|
|
43
|
+
throw new Error('Invalid token decimals');
|
|
44
|
+
}
|
|
45
|
+
const tokenAmount = Math.floor(amount * 10 ** decimals);
|
|
46
|
+
const fromTokenAccount = getAssociatedTokenAddressSync(mintPubkey, fromPubkey, false, programId);
|
|
47
|
+
const toTokenAccount = getAssociatedTokenAddressSync(mintPubkey, toPubkey, false, programId);
|
|
48
|
+
try {
|
|
49
|
+
const fromAccount = await getAccount(connection, fromTokenAccount, undefined, programId);
|
|
50
|
+
if (fromAccount.amount < BigInt(tokenAmount)) {
|
|
51
|
+
throw new Error('Insufficient token balance');
|
|
52
|
+
}
|
|
53
|
+
} catch (error) {
|
|
54
|
+
if (error instanceof TokenAccountNotFoundError) {
|
|
55
|
+
throw new Error('Sender does not have a token account for this mint');
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
let shouldCreateATA = false;
|
|
60
|
+
try {
|
|
61
|
+
await getAccount(connection, toTokenAccount, undefined, programId);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (error instanceof TokenAccountNotFoundError) {
|
|
64
|
+
shouldCreateATA = true;
|
|
65
|
+
} else {
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const instructions = [];
|
|
70
|
+
if (shouldCreateATA) {
|
|
71
|
+
instructions.push(ComputeBudgetProgram.setComputeUnitPrice({
|
|
72
|
+
microLamports: SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_PRICE_MICRO_LAMPORTS
|
|
73
|
+
}), ComputeBudgetProgram.setComputeUnitLimit({
|
|
74
|
+
units: SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT_WITH_ATA_CREATION
|
|
75
|
+
}));
|
|
76
|
+
instructions.push(createAssociatedTokenAccountInstruction(fromPubkey, toTokenAccount, toPubkey, mintPubkey, programId));
|
|
77
|
+
}
|
|
78
|
+
instructions.push(createTransferCheckedInstruction(fromTokenAccount, mintPubkey, toTokenAccount, fromPubkey, tokenAmount, decimals, [], programId));
|
|
79
|
+
const {
|
|
80
|
+
blockhash,
|
|
81
|
+
lastValidBlockHeight
|
|
82
|
+
} = await connection.getLatestBlockhash();
|
|
83
|
+
return new Transaction({
|
|
84
|
+
feePayer: fromPubkey,
|
|
85
|
+
blockhash,
|
|
86
|
+
lastValidBlockHeight
|
|
87
|
+
}).add(...instructions);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
throw new Error(`Failed to create SPL token transaction: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=createSPLTokenTransaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","TokenAccountNotFoundError","createAssociatedTokenAccountInstruction","createTransferCheckedInstruction","getAccount","getAssociatedTokenAddressSync","getMint","ComputeBudgetProgram","PublicKey","Transaction","SPL_COMPUTE_BUDGET_CONSTANTS","UNIT_PRICE_MICRO_LAMPORTS","UNIT_LIMIT_WITH_ATA_CREATION","getMintOwnerProgramId","connection","mint","info","getAccountInfo","Error","owner","equals","createSPLTokenTransaction","fromAddress","toAddress","amount","tokenMint","fromPubkey","toPubkey","mintPubkey","programId","mintInfo","undefined","decimals","tokenAmount","Math","floor","fromTokenAccount","toTokenAccount","fromAccount","BigInt","error","shouldCreateATA","instructions","push","setComputeUnitPrice","microLamports","setComputeUnitLimit","units","blockhash","lastValidBlockHeight","getLatestBlockhash","feePayer","add","message"],"sourceRoot":"../../../src","sources":["utils/createSPLTokenTransaction.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,34 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
// import type { Provider } from '@reown/appkit-utils/solana'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* These constants defines the cost of running the program, allowing to calculate the maximum
|
|
9
|
-
* amount of SOL that can be sent in case of cleaning the account and remove the rent exemption error.
|
|
10
|
-
*/
|
|
11
|
-
const COMPUTE_BUDGET_CONSTANTS = {
|
|
12
|
-
UNIT_PRICE_MICRO_LAMPORTS: 20000000,
|
|
13
|
-
UNIT_LIMIT: 500
|
|
14
|
-
};
|
|
3
|
+
import { LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction } from '@solana/web3.js';
|
|
15
4
|
export async function createSendTransaction({
|
|
16
5
|
fromAddress,
|
|
17
6
|
toAddress,
|
|
18
|
-
|
|
7
|
+
amount,
|
|
19
8
|
connection
|
|
20
9
|
}) {
|
|
21
10
|
const fromPubkey = new PublicKey(fromAddress);
|
|
22
11
|
const toPubkey = new PublicKey(toAddress);
|
|
23
|
-
const lamports = Math.floor(
|
|
12
|
+
const lamports = Math.floor(amount * LAMPORTS_PER_SOL);
|
|
24
13
|
const {
|
|
25
14
|
blockhash
|
|
26
15
|
} = await connection.getLatestBlockhash();
|
|
27
|
-
const instructions = [
|
|
28
|
-
microLamports: COMPUTE_BUDGET_CONSTANTS.UNIT_PRICE_MICRO_LAMPORTS
|
|
29
|
-
}), ComputeBudgetProgram.setComputeUnitLimit({
|
|
30
|
-
units: COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT
|
|
31
|
-
}), SystemProgram.transfer({
|
|
16
|
+
const instructions = [SystemProgram.transfer({
|
|
32
17
|
fromPubkey,
|
|
33
18
|
toPubkey,
|
|
34
19
|
lamports
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["LAMPORTS_PER_SOL","PublicKey","SystemProgram","Transaction","createSendTransaction","fromAddress","toAddress","amount","connection","fromPubkey","toPubkey","lamports","Math","floor","blockhash","getLatestBlockhash","instructions","transfer","transaction","add","feePayer","recentBlockhash"],"sourceRoot":"../../../src","sources":["utils/createSendTransaction.ts"],"mappings":";;AAAA,SAEEA,gBAAgB,EAChBC,SAAS,EACTC,aAAa,EACbC,WAAW,QACN,iBAAiB;AASxB,OAAO,eAAeC,qBAAqBA,CAAC;EAC1CC,WAAW;EACXC,SAAS;EACTC,MAAM;EACNC;AACmB,CAAC,EAAwB;EAC5C,MAAMC,UAAU,GAAG,IAAIR,SAAS,CAACI,WAAW,CAAC;EAC7C,MAAMK,QAAQ,GAAG,IAAIT,SAAS,CAACK,SAAS,CAAC;EACzC,MAAMK,QAAQ,GAAGC,IAAI,CAACC,KAAK,CAACN,MAAM,GAAGP,gBAAgB,CAAC;EAEtD,MAAM;IAAEc;EAAU,CAAC,GAAG,MAAMN,UAAU,CAACO,kBAAkB,CAAC,CAAC;EAE3D,MAAMC,YAAY,GAAG,CACnBd,aAAa,CAACe,QAAQ,CAAC;IACrBR,UAAU;IACVC,QAAQ;IACRC;EACF,CAAC,CAAC,CACH;EAED,MAAMO,WAAW,GAAG,IAAIf,WAAW,CAAC,CAAC,CAACgB,GAAG,CAAC,GAAGH,YAAY,CAAC;EAC1DE,WAAW,CAACE,QAAQ,GAAGX,UAAU;EACjCS,WAAW,CAACG,eAAe,GAAGP,SAAS;EAEvC,OAAOI,WAAW;AACpB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAc,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAc,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAKhF,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAc,SAAQ,iBAAiB;IAClD,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA4B;;IASvD,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8CjE,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,oBAAoB,EAChE,WAAW,EAAE,CAAC,EACd,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,CAAC,CAAC;IA0FP,eAAe,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA8E3D,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiCzF,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1D,WAAW,IAAI,WAAW,EAAE,GAAG,SAAS;IAOxC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,qBAAqB,IAAI,cAAc;CAGxC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CaipNetworkId, Namespaces, Storage, WalletInfo } from '@reown/appkit-common-react-native';
|
|
2
2
|
import type nacl from 'tweetnacl';
|
|
3
|
+
import type { Connection } from '@solana/web3.js';
|
|
3
4
|
export interface TokenInfo {
|
|
4
5
|
address: string;
|
|
5
6
|
symbol: string;
|
|
@@ -7,6 +8,13 @@ export interface TokenInfo {
|
|
|
7
8
|
decimals: number;
|
|
8
9
|
logoURI?: string;
|
|
9
10
|
}
|
|
11
|
+
export type SPLTokenTransactionArgs = {
|
|
12
|
+
connection: Connection;
|
|
13
|
+
fromAddress: string;
|
|
14
|
+
toAddress: string;
|
|
15
|
+
amount: number;
|
|
16
|
+
tokenMint: string;
|
|
17
|
+
};
|
|
10
18
|
export type Cluster = 'mainnet-beta' | 'testnet' | 'devnet';
|
|
11
19
|
export type DeeplinkConnectResult = DeeplinkSession;
|
|
12
20
|
export interface DeeplinkSession {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,OAAO,EACP,UAAU,EACX,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Transaction } from '@solana/web3.js';
|
|
2
|
+
import type { SPLTokenTransactionArgs } from '../types';
|
|
3
|
+
export declare function createSPLTokenTransaction({ fromAddress, toAddress, amount, tokenMint, connection }: SPLTokenTransactionArgs): Promise<Transaction>;
|
|
4
|
+
//# sourceMappingURL=createSPLTokenTransaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSPLTokenTransaction.d.ts","sourceRoot":"","sources":["../../../src/utils/createSPLTokenTransaction.ts"],"names":[],"mappings":"AAUA,OAAO,EAIL,WAAW,EAEZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAyBxD,wBAAsB,yBAAyB,CAAC,EAC9C,WAAW,EACX,SAAS,EACT,MAAM,EACN,SAAS,EACT,UAAU,EACX,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC,CAuGhD"}
|
|
@@ -3,8 +3,8 @@ type SendTransactionArgs = {
|
|
|
3
3
|
connection: Connection;
|
|
4
4
|
fromAddress: string;
|
|
5
5
|
toAddress: string;
|
|
6
|
-
|
|
6
|
+
amount: number;
|
|
7
7
|
};
|
|
8
|
-
export declare function createSendTransaction({ fromAddress, toAddress,
|
|
8
|
+
export declare function createSendTransaction({ fromAddress, toAddress, amount, connection }: SendTransactionArgs): Promise<Transaction>;
|
|
9
9
|
export {};
|
|
10
10
|
//# sourceMappingURL=createSendTransaction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSendTransaction.d.ts","sourceRoot":"","sources":["../../../src/utils/createSendTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"createSendTransaction.d.ts","sourceRoot":"","sources":["../../../src/utils/createSendTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EAIf,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAEzB,KAAK,mBAAmB,GAAG;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,EAC1C,WAAW,EACX,SAAS,EACT,MAAM,EACN,UAAU,EACX,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAoB5C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reown/appkit-solana-react-native",
|
|
3
|
-
"version": "0.0.0-feat-siwx-
|
|
3
|
+
"version": "0.0.0-feat-siwx-20250924195327",
|
|
4
4
|
"main": "lib/commonjs/index.js",
|
|
5
5
|
"types": "lib/typescript/index.d.ts",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
"provenance": true
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@reown/appkit-common-react-native": "0.0.0-feat-siwx-
|
|
43
|
+
"@reown/appkit-common-react-native": "0.0.0-feat-siwx-20250924195327",
|
|
44
|
+
"@solana/spl-token": "0.4.13",
|
|
44
45
|
"@solana/web3.js": "1.98.2",
|
|
45
46
|
"bs58": "6.0.0",
|
|
46
47
|
"tweetnacl": "1.0.3"
|
package/src/adapter.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { getSolanaNativeBalance, getSolanaTokenBalance } from './helpers';
|
|
|
10
10
|
import { Connection, Transaction, VersionedTransaction } from '@solana/web3.js';
|
|
11
11
|
import base58 from 'bs58';
|
|
12
12
|
import { createSendTransaction } from './utils/createSendTransaction';
|
|
13
|
+
import { createSPLTokenTransaction } from './utils/createSPLTokenTransaction';
|
|
13
14
|
|
|
14
15
|
export interface SolanaTransactionData {
|
|
15
16
|
fromAddress: string;
|
|
@@ -17,6 +18,7 @@ export interface SolanaTransactionData {
|
|
|
17
18
|
amount: number;
|
|
18
19
|
network?: AppKitNetwork;
|
|
19
20
|
rpcUrl?: string;
|
|
21
|
+
tokenMint?: string;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
export class SolanaAdapter extends SolanaBaseAdapter {
|
|
@@ -169,7 +171,7 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
169
171
|
}
|
|
170
172
|
|
|
171
173
|
async sendTransaction(data: SolanaTransactionData): Promise<string | null> {
|
|
172
|
-
const { fromAddress, toAddress, amount, network, rpcUrl } = data;
|
|
174
|
+
const { fromAddress, toAddress, amount, network, rpcUrl, tokenMint } = data;
|
|
173
175
|
|
|
174
176
|
if (!this.connector) {
|
|
175
177
|
throw new Error('SolanaAdapter:sendTransaction - no active connector');
|
|
@@ -209,12 +211,20 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
209
211
|
// Create connection
|
|
210
212
|
const connection = new Connection(connectionRpcUrl, 'confirmed');
|
|
211
213
|
|
|
212
|
-
const transaction =
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
214
|
+
const transaction = tokenMint
|
|
215
|
+
? await createSPLTokenTransaction({
|
|
216
|
+
connection,
|
|
217
|
+
fromAddress,
|
|
218
|
+
toAddress,
|
|
219
|
+
amount,
|
|
220
|
+
tokenMint
|
|
221
|
+
})
|
|
222
|
+
: await createSendTransaction({
|
|
223
|
+
connection,
|
|
224
|
+
fromAddress,
|
|
225
|
+
toAddress,
|
|
226
|
+
amount
|
|
227
|
+
});
|
|
218
228
|
|
|
219
229
|
// Sign the transaction
|
|
220
230
|
const signedTransaction = await this.signTransaction(transaction, network);
|
package/src/types.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
WalletInfo
|
|
6
6
|
} from '@reown/appkit-common-react-native';
|
|
7
7
|
import type nacl from 'tweetnacl';
|
|
8
|
+
import type { Connection } from '@solana/web3.js';
|
|
8
9
|
|
|
9
10
|
// --- From helpers ---
|
|
10
11
|
|
|
@@ -16,6 +17,14 @@ export interface TokenInfo {
|
|
|
16
17
|
logoURI?: string;
|
|
17
18
|
}
|
|
18
19
|
|
|
20
|
+
export type SPLTokenTransactionArgs = {
|
|
21
|
+
connection: Connection;
|
|
22
|
+
fromAddress: string;
|
|
23
|
+
toAddress: string;
|
|
24
|
+
amount: number;
|
|
25
|
+
tokenMint: string;
|
|
26
|
+
};
|
|
27
|
+
|
|
19
28
|
// --- From PhantomProvider ---
|
|
20
29
|
|
|
21
30
|
export type Cluster = 'mainnet-beta' | 'testnet' | 'devnet';
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TOKEN_2022_PROGRAM_ID,
|
|
3
|
+
TOKEN_PROGRAM_ID,
|
|
4
|
+
TokenAccountNotFoundError,
|
|
5
|
+
createAssociatedTokenAccountInstruction,
|
|
6
|
+
createTransferCheckedInstruction,
|
|
7
|
+
getAccount,
|
|
8
|
+
getAssociatedTokenAddressSync,
|
|
9
|
+
getMint
|
|
10
|
+
} from '@solana/spl-token';
|
|
11
|
+
import {
|
|
12
|
+
ComputeBudgetProgram,
|
|
13
|
+
Connection,
|
|
14
|
+
PublicKey,
|
|
15
|
+
Transaction,
|
|
16
|
+
type TransactionInstruction
|
|
17
|
+
} from '@solana/web3.js';
|
|
18
|
+
import type { SPLTokenTransactionArgs } from '../types';
|
|
19
|
+
|
|
20
|
+
const SPL_COMPUTE_BUDGET_CONSTANTS = {
|
|
21
|
+
UNIT_PRICE_MICRO_LAMPORTS: 1000000,
|
|
22
|
+
UNIT_LIMIT_WITH_ATA_CREATION: 400000
|
|
23
|
+
} as const;
|
|
24
|
+
|
|
25
|
+
async function getMintOwnerProgramId(connection: Connection, mint: PublicKey) {
|
|
26
|
+
const info = await connection.getAccountInfo(mint);
|
|
27
|
+
|
|
28
|
+
if (!info) {
|
|
29
|
+
throw new Error('Mint account not found');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (info.owner.equals(TOKEN_PROGRAM_ID)) {
|
|
33
|
+
return TOKEN_PROGRAM_ID;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (info.owner.equals(TOKEN_2022_PROGRAM_ID)) {
|
|
37
|
+
return TOKEN_2022_PROGRAM_ID;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
throw new Error('Unknown mint owner program');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function createSPLTokenTransaction({
|
|
44
|
+
fromAddress,
|
|
45
|
+
toAddress,
|
|
46
|
+
amount,
|
|
47
|
+
tokenMint,
|
|
48
|
+
connection
|
|
49
|
+
}: SPLTokenTransactionArgs): Promise<Transaction> {
|
|
50
|
+
if (!fromAddress) {
|
|
51
|
+
throw new Error('No public key found');
|
|
52
|
+
}
|
|
53
|
+
if (amount <= 0) {
|
|
54
|
+
throw new Error('Amount must be greater than 0');
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const fromPubkey = new PublicKey(fromAddress);
|
|
58
|
+
const toPubkey = new PublicKey(toAddress);
|
|
59
|
+
const mintPubkey = new PublicKey(tokenMint);
|
|
60
|
+
|
|
61
|
+
const programId = await getMintOwnerProgramId(connection, mintPubkey);
|
|
62
|
+
|
|
63
|
+
const mintInfo = await getMint(connection, mintPubkey, undefined, programId);
|
|
64
|
+
const decimals = mintInfo.decimals;
|
|
65
|
+
if (decimals < 0) {
|
|
66
|
+
throw new Error('Invalid token decimals');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const tokenAmount = Math.floor(amount * 10 ** decimals);
|
|
70
|
+
|
|
71
|
+
const fromTokenAccount = getAssociatedTokenAddressSync(
|
|
72
|
+
mintPubkey,
|
|
73
|
+
fromPubkey,
|
|
74
|
+
false,
|
|
75
|
+
programId
|
|
76
|
+
);
|
|
77
|
+
const toTokenAccount = getAssociatedTokenAddressSync(mintPubkey, toPubkey, false, programId);
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
const fromAccount = await getAccount(connection, fromTokenAccount, undefined, programId);
|
|
81
|
+
if (fromAccount.amount < BigInt(tokenAmount)) {
|
|
82
|
+
throw new Error('Insufficient token balance');
|
|
83
|
+
}
|
|
84
|
+
} catch (error) {
|
|
85
|
+
if (error instanceof TokenAccountNotFoundError) {
|
|
86
|
+
throw new Error('Sender does not have a token account for this mint');
|
|
87
|
+
}
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
let shouldCreateATA = false;
|
|
92
|
+
try {
|
|
93
|
+
await getAccount(connection, toTokenAccount, undefined, programId);
|
|
94
|
+
} catch (error) {
|
|
95
|
+
if (error instanceof TokenAccountNotFoundError) {
|
|
96
|
+
shouldCreateATA = true;
|
|
97
|
+
} else {
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const instructions: TransactionInstruction[] = [];
|
|
103
|
+
|
|
104
|
+
if (shouldCreateATA) {
|
|
105
|
+
instructions.push(
|
|
106
|
+
ComputeBudgetProgram.setComputeUnitPrice({
|
|
107
|
+
microLamports: SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_PRICE_MICRO_LAMPORTS
|
|
108
|
+
}),
|
|
109
|
+
ComputeBudgetProgram.setComputeUnitLimit({
|
|
110
|
+
units: SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT_WITH_ATA_CREATION
|
|
111
|
+
})
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
instructions.push(
|
|
115
|
+
createAssociatedTokenAccountInstruction(
|
|
116
|
+
fromPubkey,
|
|
117
|
+
toTokenAccount,
|
|
118
|
+
toPubkey,
|
|
119
|
+
mintPubkey,
|
|
120
|
+
programId
|
|
121
|
+
)
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
instructions.push(
|
|
126
|
+
createTransferCheckedInstruction(
|
|
127
|
+
fromTokenAccount,
|
|
128
|
+
mintPubkey,
|
|
129
|
+
toTokenAccount,
|
|
130
|
+
fromPubkey,
|
|
131
|
+
tokenAmount,
|
|
132
|
+
decimals,
|
|
133
|
+
[],
|
|
134
|
+
programId
|
|
135
|
+
)
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash();
|
|
139
|
+
|
|
140
|
+
return new Transaction({
|
|
141
|
+
feePayer: fromPubkey,
|
|
142
|
+
blockhash,
|
|
143
|
+
lastValidBlockHeight
|
|
144
|
+
}).add(...instructions);
|
|
145
|
+
} catch (error) {
|
|
146
|
+
throw new Error(
|
|
147
|
+
`Failed to create SPL token transaction: ${
|
|
148
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
149
|
+
}`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
ComputeBudgetProgram,
|
|
3
2
|
type Connection,
|
|
4
3
|
LAMPORTS_PER_SOL,
|
|
5
4
|
PublicKey,
|
|
@@ -7,41 +6,26 @@ import {
|
|
|
7
6
|
Transaction
|
|
8
7
|
} from '@solana/web3.js';
|
|
9
8
|
|
|
10
|
-
// import type { Provider } from '@reown/appkit-utils/solana'
|
|
11
|
-
|
|
12
9
|
type SendTransactionArgs = {
|
|
13
10
|
connection: Connection;
|
|
14
11
|
fromAddress: string;
|
|
15
12
|
toAddress: string;
|
|
16
|
-
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* These constants defines the cost of running the program, allowing to calculate the maximum
|
|
21
|
-
* amount of SOL that can be sent in case of cleaning the account and remove the rent exemption error.
|
|
22
|
-
*/
|
|
23
|
-
const COMPUTE_BUDGET_CONSTANTS = {
|
|
24
|
-
UNIT_PRICE_MICRO_LAMPORTS: 20000000,
|
|
25
|
-
UNIT_LIMIT: 500
|
|
13
|
+
amount: number;
|
|
26
14
|
};
|
|
27
15
|
|
|
28
16
|
export async function createSendTransaction({
|
|
29
17
|
fromAddress,
|
|
30
18
|
toAddress,
|
|
31
|
-
|
|
19
|
+
amount,
|
|
32
20
|
connection
|
|
33
21
|
}: SendTransactionArgs): Promise<Transaction> {
|
|
34
22
|
const fromPubkey = new PublicKey(fromAddress);
|
|
35
23
|
const toPubkey = new PublicKey(toAddress);
|
|
36
|
-
const lamports = Math.floor(
|
|
24
|
+
const lamports = Math.floor(amount * LAMPORTS_PER_SOL);
|
|
37
25
|
|
|
38
26
|
const { blockhash } = await connection.getLatestBlockhash();
|
|
39
27
|
|
|
40
28
|
const instructions = [
|
|
41
|
-
ComputeBudgetProgram.setComputeUnitPrice({
|
|
42
|
-
microLamports: COMPUTE_BUDGET_CONSTANTS.UNIT_PRICE_MICRO_LAMPORTS
|
|
43
|
-
}),
|
|
44
|
-
ComputeBudgetProgram.setComputeUnitLimit({ units: COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT }),
|
|
45
29
|
SystemProgram.transfer({
|
|
46
30
|
fromPubkey,
|
|
47
31
|
toPubkey,
|