@reown/appkit-solana-react-native 0.0.0-feat-siwx-20250923204044 → 0.0.0-feat-siwx-20250924182536
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 +41 -8
- package/lib/commonjs/adapter.js.map +1 -1
- package/lib/commonjs/utils/createSPLTokenTransaction.js +98 -0
- package/lib/commonjs/utils/createSPLTokenTransaction.js.map +1 -0
- package/lib/commonjs/utils/createSendTransaction.js +3 -3
- package/lib/commonjs/utils/createSendTransaction.js.map +1 -1
- package/lib/module/adapter.js +41 -8
- package/lib/module/adapter.js.map +1 -1
- package/lib/module/utils/createSPLTokenTransaction.js +94 -0
- package/lib/module/utils/createSPLTokenTransaction.js.map +1 -0
- package/lib/module/utils/createSendTransaction.js +3 -3
- 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 +47 -12
- package/src/types.ts +9 -0
- package/src/utils/createSPLTokenTransaction.ts +155 -0
- package/src/utils/createSendTransaction.ts +4 -4
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';
|
|
@@ -80,10 +81,23 @@ class SolanaAdapter extends _appkitCommonReactNative.SolanaBaseAdapter {
|
|
|
80
81
|
throw new Error('SolanaAdapter:signTransaction - provider is undefined');
|
|
81
82
|
}
|
|
82
83
|
try {
|
|
83
|
-
//
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
// Check if this is a deeplink provider (Phantom/Solflare)
|
|
85
|
+
const isDeeplinkProvider = this.connector.type === 'phantom' || this.connector.type === 'solflare';
|
|
86
|
+
|
|
87
|
+
// Serialize transaction based on provider type
|
|
88
|
+
let serializedTransaction;
|
|
89
|
+
if (isDeeplinkProvider) {
|
|
90
|
+
// Deeplink providers (Phantom/Solflare) expect base58
|
|
91
|
+
const transactionBytes = new Uint8Array(transaction.serialize({
|
|
92
|
+
verifySignatures: false
|
|
93
|
+
}));
|
|
94
|
+
serializedTransaction = _bs.default.encode(transactionBytes);
|
|
95
|
+
} else {
|
|
96
|
+
// WalletConnect providers expect base64 (following WalletConnect standard)
|
|
97
|
+
serializedTransaction = Buffer.from(new Uint8Array(transaction.serialize({
|
|
98
|
+
verifySignatures: false
|
|
99
|
+
}))).toString('base64');
|
|
100
|
+
}
|
|
87
101
|
const result = await provider.request({
|
|
88
102
|
method: 'solana_signTransaction',
|
|
89
103
|
params: {
|
|
@@ -103,7 +117,19 @@ class SolanaAdapter extends _appkitCommonReactNative.SolanaBaseAdapter {
|
|
|
103
117
|
}
|
|
104
118
|
if ('transaction' in result && result.transaction) {
|
|
105
119
|
// New response format - deserialize the signed transaction
|
|
106
|
-
|
|
120
|
+
let decodedTransaction;
|
|
121
|
+
if (isDeeplinkProvider) {
|
|
122
|
+
// Deeplink providers return base58 encoded transactions
|
|
123
|
+
try {
|
|
124
|
+
const decodedBytes = _bs.default.decode(result.transaction);
|
|
125
|
+
decodedTransaction = Buffer.from(decodedBytes);
|
|
126
|
+
} catch (error) {
|
|
127
|
+
throw new Error('Failed to decode base58 transaction from deeplink provider');
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
// WalletConnect providers return base64 encoded transactions
|
|
131
|
+
decodedTransaction = Buffer.from(result.transaction, 'base64');
|
|
132
|
+
}
|
|
107
133
|
if (transaction instanceof _web.VersionedTransaction) {
|
|
108
134
|
return _web.VersionedTransaction.deserialize(new Uint8Array(decodedTransaction));
|
|
109
135
|
}
|
|
@@ -123,7 +149,8 @@ class SolanaAdapter extends _appkitCommonReactNative.SolanaBaseAdapter {
|
|
|
123
149
|
toAddress,
|
|
124
150
|
amount,
|
|
125
151
|
network,
|
|
126
|
-
rpcUrl
|
|
152
|
+
rpcUrl,
|
|
153
|
+
tokenMint
|
|
127
154
|
} = data;
|
|
128
155
|
if (!this.connector) {
|
|
129
156
|
throw new Error('SolanaAdapter:sendTransaction - no active connector');
|
|
@@ -156,11 +183,17 @@ class SolanaAdapter extends _appkitCommonReactNative.SolanaBaseAdapter {
|
|
|
156
183
|
|
|
157
184
|
// Create connection
|
|
158
185
|
const connection = new _web.Connection(connectionRpcUrl, 'confirmed');
|
|
159
|
-
const transaction = await (0,
|
|
186
|
+
const transaction = tokenMint ? await (0, _createSPLTokenTransaction.createSPLTokenTransaction)({
|
|
187
|
+
connection,
|
|
188
|
+
fromAddress,
|
|
189
|
+
toAddress,
|
|
190
|
+
amount,
|
|
191
|
+
tokenMint
|
|
192
|
+
}) : await (0, _createSendTransaction.createSendTransaction)({
|
|
160
193
|
connection,
|
|
161
194
|
fromAddress,
|
|
162
195
|
toAddress,
|
|
163
|
-
|
|
196
|
+
amount
|
|
164
197
|
});
|
|
165
198
|
|
|
166
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","
|
|
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,98 @@
|
|
|
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_TRANSFER_ONLY: 300000,
|
|
12
|
+
UNIT_LIMIT_WITH_ATA_CREATION: 400000
|
|
13
|
+
};
|
|
14
|
+
async function getMintOwnerProgramId(connection, mint) {
|
|
15
|
+
const info = await connection.getAccountInfo(mint);
|
|
16
|
+
if (!info) {
|
|
17
|
+
throw new Error('Mint account not found');
|
|
18
|
+
}
|
|
19
|
+
if (info.owner.equals(_splToken.TOKEN_PROGRAM_ID)) {
|
|
20
|
+
return _splToken.TOKEN_PROGRAM_ID;
|
|
21
|
+
}
|
|
22
|
+
if (info.owner.equals(_splToken.TOKEN_2022_PROGRAM_ID)) {
|
|
23
|
+
return _splToken.TOKEN_2022_PROGRAM_ID;
|
|
24
|
+
}
|
|
25
|
+
throw new Error('Unknown mint owner program');
|
|
26
|
+
}
|
|
27
|
+
async function createSPLTokenTransaction({
|
|
28
|
+
fromAddress,
|
|
29
|
+
toAddress,
|
|
30
|
+
amount,
|
|
31
|
+
tokenMint,
|
|
32
|
+
connection
|
|
33
|
+
}) {
|
|
34
|
+
if (!fromAddress) {
|
|
35
|
+
throw new Error('No public key found');
|
|
36
|
+
}
|
|
37
|
+
if (amount <= 0) {
|
|
38
|
+
throw new Error('Amount must be greater than 0');
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const fromPubkey = new _web.PublicKey(fromAddress);
|
|
42
|
+
const toPubkey = new _web.PublicKey(toAddress);
|
|
43
|
+
const mintPubkey = new _web.PublicKey(tokenMint);
|
|
44
|
+
const programId = await getMintOwnerProgramId(connection, mintPubkey);
|
|
45
|
+
const mintInfo = await (0, _splToken.getMint)(connection, mintPubkey, undefined, programId);
|
|
46
|
+
const decimals = mintInfo.decimals;
|
|
47
|
+
if (decimals < 0) {
|
|
48
|
+
throw new Error('Invalid token decimals');
|
|
49
|
+
}
|
|
50
|
+
const tokenAmount = Math.floor(amount * 10 ** decimals);
|
|
51
|
+
const fromTokenAccount = (0, _splToken.getAssociatedTokenAddressSync)(mintPubkey, fromPubkey, false, programId);
|
|
52
|
+
const toTokenAccount = (0, _splToken.getAssociatedTokenAddressSync)(mintPubkey, toPubkey, false, programId);
|
|
53
|
+
try {
|
|
54
|
+
const fromAccount = await (0, _splToken.getAccount)(connection, fromTokenAccount, undefined, programId);
|
|
55
|
+
if (fromAccount.amount < BigInt(tokenAmount)) {
|
|
56
|
+
throw new Error('Insufficient token balance');
|
|
57
|
+
}
|
|
58
|
+
} catch (error) {
|
|
59
|
+
if (error instanceof _splToken.TokenAccountNotFoundError) {
|
|
60
|
+
throw new Error('Sender does not have a token account for this mint');
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
let shouldCreateATA = false;
|
|
65
|
+
try {
|
|
66
|
+
await (0, _splToken.getAccount)(connection, toTokenAccount, undefined, programId);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (error instanceof _splToken.TokenAccountNotFoundError) {
|
|
69
|
+
shouldCreateATA = true;
|
|
70
|
+
} else {
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const instructions = [];
|
|
75
|
+
const computeUnitLimit = shouldCreateATA ? SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT_WITH_ATA_CREATION : SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT_TRANSFER_ONLY;
|
|
76
|
+
instructions.push(_web.ComputeBudgetProgram.setComputeUnitPrice({
|
|
77
|
+
microLamports: SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_PRICE_MICRO_LAMPORTS
|
|
78
|
+
}), _web.ComputeBudgetProgram.setComputeUnitLimit({
|
|
79
|
+
units: computeUnitLimit
|
|
80
|
+
}));
|
|
81
|
+
if (shouldCreateATA) {
|
|
82
|
+
instructions.push((0, _splToken.createAssociatedTokenAccountInstruction)(fromPubkey, toTokenAccount, toPubkey, mintPubkey, programId));
|
|
83
|
+
}
|
|
84
|
+
instructions.push((0, _splToken.createTransferCheckedInstruction)(fromTokenAccount, mintPubkey, toTokenAccount, fromPubkey, tokenAmount, decimals, [], programId));
|
|
85
|
+
const {
|
|
86
|
+
blockhash,
|
|
87
|
+
lastValidBlockHeight
|
|
88
|
+
} = await connection.getLatestBlockhash();
|
|
89
|
+
return new _web.Transaction({
|
|
90
|
+
feePayer: fromPubkey,
|
|
91
|
+
blockhash,
|
|
92
|
+
lastValidBlockHeight
|
|
93
|
+
}).add(...instructions);
|
|
94
|
+
} catch (error) {
|
|
95
|
+
throw new Error(`Failed to create SPL token transaction: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=createSPLTokenTransaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_splToken","require","_web","SPL_COMPUTE_BUDGET_CONSTANTS","UNIT_PRICE_MICRO_LAMPORTS","UNIT_LIMIT_TRANSFER_ONLY","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","computeUnitLimit","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":[]}
|
|
@@ -12,18 +12,18 @@ var _web = require("@solana/web3.js");
|
|
|
12
12
|
* amount of SOL that can be sent in case of cleaning the account and remove the rent exemption error.
|
|
13
13
|
*/
|
|
14
14
|
const COMPUTE_BUDGET_CONSTANTS = {
|
|
15
|
-
UNIT_PRICE_MICRO_LAMPORTS:
|
|
15
|
+
UNIT_PRICE_MICRO_LAMPORTS: 1000000,
|
|
16
16
|
UNIT_LIMIT: 500
|
|
17
17
|
};
|
|
18
18
|
async function createSendTransaction({
|
|
19
19
|
fromAddress,
|
|
20
20
|
toAddress,
|
|
21
|
-
|
|
21
|
+
amount,
|
|
22
22
|
connection
|
|
23
23
|
}) {
|
|
24
24
|
const fromPubkey = new _web.PublicKey(fromAddress);
|
|
25
25
|
const toPubkey = new _web.PublicKey(toAddress);
|
|
26
|
-
const lamports = Math.floor(
|
|
26
|
+
const lamports = Math.floor(amount * _web.LAMPORTS_PER_SOL);
|
|
27
27
|
const {
|
|
28
28
|
blockhash
|
|
29
29
|
} = await connection.getLatestBlockhash();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_web","require","COMPUTE_BUDGET_CONSTANTS","UNIT_PRICE_MICRO_LAMPORTS","UNIT_LIMIT","createSendTransaction","fromAddress","toAddress","
|
|
1
|
+
{"version":3,"names":["_web","require","COMPUTE_BUDGET_CONSTANTS","UNIT_PRICE_MICRO_LAMPORTS","UNIT_LIMIT","createSendTransaction","fromAddress","toAddress","amount","connection","fromPubkey","PublicKey","toPubkey","lamports","Math","floor","LAMPORTS_PER_SOL","blockhash","getLatestBlockhash","instructions","ComputeBudgetProgram","setComputeUnitPrice","microLamports","setComputeUnitLimit","units","SystemProgram","transfer","transaction","Transaction","add","feePayer","recentBlockhash"],"sourceRoot":"../../../src","sources":["utils/createSendTransaction.ts"],"mappings":";;;;;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AASA;;AASA;AACA;AACA;AACA;AACA,MAAMC,wBAAwB,GAAG;EAC/BC,yBAAyB,EAAE,OAAO;EAClCC,UAAU,EAAE;AACd,CAAC;AAEM,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,yBAAoB,CAACC,mBAAmB,CAAC;IACvCC,aAAa,EAAEpB,wBAAwB,CAACC;EAC1C,CAAC,CAAC,EACFiB,yBAAoB,CAACG,mBAAmB,CAAC;IAAEC,KAAK,EAAEtB,wBAAwB,CAACE;EAAW,CAAC,CAAC,EACxFqB,kBAAa,CAACC,QAAQ,CAAC;IACrBhB,UAAU;IACVE,QAAQ;IACRC;EACF,CAAC,CAAC,CACH;EAED,MAAMc,WAAW,GAAG,IAAIC,gBAAW,CAAC,CAAC,CAACC,GAAG,CAAC,GAAGV,YAAY,CAAC;EAC1DQ,WAAW,CAACG,QAAQ,GAAGpB,UAAU;EACjCiB,WAAW,CAACI,eAAe,GAAGd,SAAS;EAEvC,OAAOU,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() {
|
|
@@ -75,10 +76,23 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
75
76
|
throw new Error('SolanaAdapter:signTransaction - provider is undefined');
|
|
76
77
|
}
|
|
77
78
|
try {
|
|
78
|
-
//
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
// Check if this is a deeplink provider (Phantom/Solflare)
|
|
80
|
+
const isDeeplinkProvider = this.connector.type === 'phantom' || this.connector.type === 'solflare';
|
|
81
|
+
|
|
82
|
+
// Serialize transaction based on provider type
|
|
83
|
+
let serializedTransaction;
|
|
84
|
+
if (isDeeplinkProvider) {
|
|
85
|
+
// Deeplink providers (Phantom/Solflare) expect base58
|
|
86
|
+
const transactionBytes = new Uint8Array(transaction.serialize({
|
|
87
|
+
verifySignatures: false
|
|
88
|
+
}));
|
|
89
|
+
serializedTransaction = base58.encode(transactionBytes);
|
|
90
|
+
} else {
|
|
91
|
+
// WalletConnect providers expect base64 (following WalletConnect standard)
|
|
92
|
+
serializedTransaction = Buffer.from(new Uint8Array(transaction.serialize({
|
|
93
|
+
verifySignatures: false
|
|
94
|
+
}))).toString('base64');
|
|
95
|
+
}
|
|
82
96
|
const result = await provider.request({
|
|
83
97
|
method: 'solana_signTransaction',
|
|
84
98
|
params: {
|
|
@@ -98,7 +112,19 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
98
112
|
}
|
|
99
113
|
if ('transaction' in result && result.transaction) {
|
|
100
114
|
// New response format - deserialize the signed transaction
|
|
101
|
-
|
|
115
|
+
let decodedTransaction;
|
|
116
|
+
if (isDeeplinkProvider) {
|
|
117
|
+
// Deeplink providers return base58 encoded transactions
|
|
118
|
+
try {
|
|
119
|
+
const decodedBytes = base58.decode(result.transaction);
|
|
120
|
+
decodedTransaction = Buffer.from(decodedBytes);
|
|
121
|
+
} catch (error) {
|
|
122
|
+
throw new Error('Failed to decode base58 transaction from deeplink provider');
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
// WalletConnect providers return base64 encoded transactions
|
|
126
|
+
decodedTransaction = Buffer.from(result.transaction, 'base64');
|
|
127
|
+
}
|
|
102
128
|
if (transaction instanceof VersionedTransaction) {
|
|
103
129
|
return VersionedTransaction.deserialize(new Uint8Array(decodedTransaction));
|
|
104
130
|
}
|
|
@@ -118,7 +144,8 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
118
144
|
toAddress,
|
|
119
145
|
amount,
|
|
120
146
|
network,
|
|
121
|
-
rpcUrl
|
|
147
|
+
rpcUrl,
|
|
148
|
+
tokenMint
|
|
122
149
|
} = data;
|
|
123
150
|
if (!this.connector) {
|
|
124
151
|
throw new Error('SolanaAdapter:sendTransaction - no active connector');
|
|
@@ -151,11 +178,17 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
151
178
|
|
|
152
179
|
// Create connection
|
|
153
180
|
const connection = new Connection(connectionRpcUrl, 'confirmed');
|
|
154
|
-
const transaction = await
|
|
181
|
+
const transaction = tokenMint ? await createSPLTokenTransaction({
|
|
182
|
+
connection,
|
|
183
|
+
fromAddress,
|
|
184
|
+
toAddress,
|
|
185
|
+
amount,
|
|
186
|
+
tokenMint
|
|
187
|
+
}) : await createSendTransaction({
|
|
155
188
|
connection,
|
|
156
189
|
fromAddress,
|
|
157
190
|
toAddress,
|
|
158
|
-
|
|
191
|
+
amount
|
|
159
192
|
});
|
|
160
193
|
|
|
161
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","
|
|
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,94 @@
|
|
|
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_TRANSFER_ONLY: 300000,
|
|
8
|
+
UNIT_LIMIT_WITH_ATA_CREATION: 400000
|
|
9
|
+
};
|
|
10
|
+
async function getMintOwnerProgramId(connection, mint) {
|
|
11
|
+
const info = await connection.getAccountInfo(mint);
|
|
12
|
+
if (!info) {
|
|
13
|
+
throw new Error('Mint account not found');
|
|
14
|
+
}
|
|
15
|
+
if (info.owner.equals(TOKEN_PROGRAM_ID)) {
|
|
16
|
+
return TOKEN_PROGRAM_ID;
|
|
17
|
+
}
|
|
18
|
+
if (info.owner.equals(TOKEN_2022_PROGRAM_ID)) {
|
|
19
|
+
return TOKEN_2022_PROGRAM_ID;
|
|
20
|
+
}
|
|
21
|
+
throw new Error('Unknown mint owner program');
|
|
22
|
+
}
|
|
23
|
+
export async function createSPLTokenTransaction({
|
|
24
|
+
fromAddress,
|
|
25
|
+
toAddress,
|
|
26
|
+
amount,
|
|
27
|
+
tokenMint,
|
|
28
|
+
connection
|
|
29
|
+
}) {
|
|
30
|
+
if (!fromAddress) {
|
|
31
|
+
throw new Error('No public key found');
|
|
32
|
+
}
|
|
33
|
+
if (amount <= 0) {
|
|
34
|
+
throw new Error('Amount must be greater than 0');
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const fromPubkey = new PublicKey(fromAddress);
|
|
38
|
+
const toPubkey = new PublicKey(toAddress);
|
|
39
|
+
const mintPubkey = new PublicKey(tokenMint);
|
|
40
|
+
const programId = await getMintOwnerProgramId(connection, mintPubkey);
|
|
41
|
+
const mintInfo = await getMint(connection, mintPubkey, undefined, programId);
|
|
42
|
+
const decimals = mintInfo.decimals;
|
|
43
|
+
if (decimals < 0) {
|
|
44
|
+
throw new Error('Invalid token decimals');
|
|
45
|
+
}
|
|
46
|
+
const tokenAmount = Math.floor(amount * 10 ** decimals);
|
|
47
|
+
const fromTokenAccount = getAssociatedTokenAddressSync(mintPubkey, fromPubkey, false, programId);
|
|
48
|
+
const toTokenAccount = getAssociatedTokenAddressSync(mintPubkey, toPubkey, false, programId);
|
|
49
|
+
try {
|
|
50
|
+
const fromAccount = await getAccount(connection, fromTokenAccount, undefined, programId);
|
|
51
|
+
if (fromAccount.amount < BigInt(tokenAmount)) {
|
|
52
|
+
throw new Error('Insufficient token balance');
|
|
53
|
+
}
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (error instanceof TokenAccountNotFoundError) {
|
|
56
|
+
throw new Error('Sender does not have a token account for this mint');
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
let shouldCreateATA = false;
|
|
61
|
+
try {
|
|
62
|
+
await getAccount(connection, toTokenAccount, undefined, programId);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (error instanceof TokenAccountNotFoundError) {
|
|
65
|
+
shouldCreateATA = true;
|
|
66
|
+
} else {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const instructions = [];
|
|
71
|
+
const computeUnitLimit = shouldCreateATA ? SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT_WITH_ATA_CREATION : SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT_TRANSFER_ONLY;
|
|
72
|
+
instructions.push(ComputeBudgetProgram.setComputeUnitPrice({
|
|
73
|
+
microLamports: SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_PRICE_MICRO_LAMPORTS
|
|
74
|
+
}), ComputeBudgetProgram.setComputeUnitLimit({
|
|
75
|
+
units: computeUnitLimit
|
|
76
|
+
}));
|
|
77
|
+
if (shouldCreateATA) {
|
|
78
|
+
instructions.push(createAssociatedTokenAccountInstruction(fromPubkey, toTokenAccount, toPubkey, mintPubkey, programId));
|
|
79
|
+
}
|
|
80
|
+
instructions.push(createTransferCheckedInstruction(fromTokenAccount, mintPubkey, toTokenAccount, fromPubkey, tokenAmount, decimals, [], programId));
|
|
81
|
+
const {
|
|
82
|
+
blockhash,
|
|
83
|
+
lastValidBlockHeight
|
|
84
|
+
} = await connection.getLatestBlockhash();
|
|
85
|
+
return new Transaction({
|
|
86
|
+
feePayer: fromPubkey,
|
|
87
|
+
blockhash,
|
|
88
|
+
lastValidBlockHeight
|
|
89
|
+
}).add(...instructions);
|
|
90
|
+
} catch (error) {
|
|
91
|
+
throw new Error(`Failed to create SPL token transaction: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# 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_TRANSFER_ONLY","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","computeUnitLimit","push","setComputeUnitPrice","microLamports","setComputeUnitLimit","units","blockhash","lastValidBlockHeight","getLatestBlockhash","feePayer","add","message"],"sourceRoot":"../../../src","sources":["utils/createSPLTokenTransaction.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,18 +9,18 @@ import { ComputeBudgetProgram, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Trans
|
|
|
9
9
|
* amount of SOL that can be sent in case of cleaning the account and remove the rent exemption error.
|
|
10
10
|
*/
|
|
11
11
|
const COMPUTE_BUDGET_CONSTANTS = {
|
|
12
|
-
UNIT_PRICE_MICRO_LAMPORTS:
|
|
12
|
+
UNIT_PRICE_MICRO_LAMPORTS: 1000000,
|
|
13
13
|
UNIT_LIMIT: 500
|
|
14
14
|
};
|
|
15
15
|
export async function createSendTransaction({
|
|
16
16
|
fromAddress,
|
|
17
17
|
toAddress,
|
|
18
|
-
|
|
18
|
+
amount,
|
|
19
19
|
connection
|
|
20
20
|
}) {
|
|
21
21
|
const fromPubkey = new PublicKey(fromAddress);
|
|
22
22
|
const toPubkey = new PublicKey(toAddress);
|
|
23
|
-
const lamports = Math.floor(
|
|
23
|
+
const lamports = Math.floor(amount * LAMPORTS_PER_SOL);
|
|
24
24
|
const {
|
|
25
25
|
blockhash
|
|
26
26
|
} = await connection.getLatestBlockhash();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ComputeBudgetProgram","LAMPORTS_PER_SOL","PublicKey","SystemProgram","Transaction","COMPUTE_BUDGET_CONSTANTS","UNIT_PRICE_MICRO_LAMPORTS","UNIT_LIMIT","createSendTransaction","fromAddress","toAddress","
|
|
1
|
+
{"version":3,"names":["ComputeBudgetProgram","LAMPORTS_PER_SOL","PublicKey","SystemProgram","Transaction","COMPUTE_BUDGET_CONSTANTS","UNIT_PRICE_MICRO_LAMPORTS","UNIT_LIMIT","createSendTransaction","fromAddress","toAddress","amount","connection","fromPubkey","toPubkey","lamports","Math","floor","blockhash","getLatestBlockhash","instructions","setComputeUnitPrice","microLamports","setComputeUnitLimit","units","transfer","transaction","add","feePayer","recentBlockhash"],"sourceRoot":"../../../src","sources":["utils/createSendTransaction.ts"],"mappings":";;AAAA,SACEA,oBAAoB,EAEpBC,gBAAgB,EAChBC,SAAS,EACTC,aAAa,EACbC,WAAW,QACN,iBAAiB;;AAExB;;AASA;AACA;AACA;AACA;AACA,MAAMC,wBAAwB,GAAG;EAC/BC,yBAAyB,EAAE,OAAO;EAClCC,UAAU,EAAE;AACd,CAAC;AAED,OAAO,eAAeC,qBAAqBA,CAAC;EAC1CC,WAAW;EACXC,SAAS;EACTC,MAAM;EACNC;AACmB,CAAC,EAAwB;EAC5C,MAAMC,UAAU,GAAG,IAAIX,SAAS,CAACO,WAAW,CAAC;EAC7C,MAAMK,QAAQ,GAAG,IAAIZ,SAAS,CAACQ,SAAS,CAAC;EACzC,MAAMK,QAAQ,GAAGC,IAAI,CAACC,KAAK,CAACN,MAAM,GAAGV,gBAAgB,CAAC;EAEtD,MAAM;IAAEiB;EAAU,CAAC,GAAG,MAAMN,UAAU,CAACO,kBAAkB,CAAC,CAAC;EAE3D,MAAMC,YAAY,GAAG,CACnBpB,oBAAoB,CAACqB,mBAAmB,CAAC;IACvCC,aAAa,EAAEjB,wBAAwB,CAACC;EAC1C,CAAC,CAAC,EACFN,oBAAoB,CAACuB,mBAAmB,CAAC;IAAEC,KAAK,EAAEnB,wBAAwB,CAACE;EAAW,CAAC,CAAC,EACxFJ,aAAa,CAACsB,QAAQ,CAAC;IACrBZ,UAAU;IACVC,QAAQ;IACRC;EACF,CAAC,CAAC,CACH;EAED,MAAMW,WAAW,GAAG,IAAItB,WAAW,CAAC,CAAC,CAACuB,GAAG,CAAC,GAAGP,YAAY,CAAC;EAC1DM,WAAW,CAACE,QAAQ,GAAGf,UAAU;EACjCa,WAAW,CAACG,eAAe,GAAGX,SAAS;EAEvC,OAAOQ,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":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,OAAO,EACP,UAAU,EACX,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAIF,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE5D,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B,EAAE,MAAM,CAAC;IACtC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC1B;AACD,MAAM,WAAW,gCAAgC;IAC/C,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qBAAqB,EAAE,IAAI,CAAC,UAAU,CAAC;IACvC,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAGD,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,wBAAwB,GACxB,qBAAqB,GACrB,aAAa,CAAC;AAElB,MAAM,WAAW,6BAA6B;IAC5C,0BAA0B,EAAE,MAAM,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iCAAiC;IAChD,0BAA0B,EAAE,MAAM,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,0BAA0B,EAAE,MAAM,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B,EAAE,MAAM,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,0BAA0B,EAAE,MAAM,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,oBAAoB,EAAE,aAAa,CAAC;CACrC;AAED,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;AAC9E,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC"}
|
|
@@ -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;AA0BxD,wBAAsB,yBAAyB,CAAC,EAC9C,WAAW,EACX,SAAS,EACT,MAAM,EACN,SAAS,EACT,UAAU,EACX,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC,CAyGhD"}
|
|
@@ -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,EAEL,KAAK,UAAU,EAIf,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAIzB,KAAK,mBAAmB,GAAG;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"createSendTransaction.d.ts","sourceRoot":"","sources":["../../../src/utils/createSendTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EAIf,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAIzB,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;AAWF,wBAAsB,qBAAqB,CAAC,EAC1C,WAAW,EACX,SAAS,EACT,MAAM,EACN,UAAU,EACX,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAwB5C"}
|
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-20250924182536",
|
|
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-20250924182536",
|
|
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 {
|
|
@@ -93,10 +95,22 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
93
95
|
}
|
|
94
96
|
|
|
95
97
|
try {
|
|
96
|
-
//
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
// Check if this is a deeplink provider (Phantom/Solflare)
|
|
99
|
+
const isDeeplinkProvider =
|
|
100
|
+
this.connector.type === 'phantom' || this.connector.type === 'solflare';
|
|
101
|
+
|
|
102
|
+
// Serialize transaction based on provider type
|
|
103
|
+
let serializedTransaction: string;
|
|
104
|
+
if (isDeeplinkProvider) {
|
|
105
|
+
// Deeplink providers (Phantom/Solflare) expect base58
|
|
106
|
+
const transactionBytes = new Uint8Array(transaction.serialize({ verifySignatures: false }));
|
|
107
|
+
serializedTransaction = base58.encode(transactionBytes);
|
|
108
|
+
} else {
|
|
109
|
+
// WalletConnect providers expect base64 (following WalletConnect standard)
|
|
110
|
+
serializedTransaction = Buffer.from(
|
|
111
|
+
new Uint8Array(transaction.serialize({ verifySignatures: false }))
|
|
112
|
+
).toString('base64');
|
|
113
|
+
}
|
|
100
114
|
|
|
101
115
|
const result = (await provider.request(
|
|
102
116
|
{
|
|
@@ -125,7 +139,20 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
125
139
|
|
|
126
140
|
if ('transaction' in result && result.transaction) {
|
|
127
141
|
// New response format - deserialize the signed transaction
|
|
128
|
-
|
|
142
|
+
let decodedTransaction: Buffer;
|
|
143
|
+
|
|
144
|
+
if (isDeeplinkProvider) {
|
|
145
|
+
// Deeplink providers return base58 encoded transactions
|
|
146
|
+
try {
|
|
147
|
+
const decodedBytes = base58.decode(result.transaction);
|
|
148
|
+
decodedTransaction = Buffer.from(decodedBytes);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
throw new Error('Failed to decode base58 transaction from deeplink provider');
|
|
151
|
+
}
|
|
152
|
+
} else {
|
|
153
|
+
// WalletConnect providers return base64 encoded transactions
|
|
154
|
+
decodedTransaction = Buffer.from(result.transaction, 'base64');
|
|
155
|
+
}
|
|
129
156
|
|
|
130
157
|
if (transaction instanceof VersionedTransaction) {
|
|
131
158
|
return VersionedTransaction.deserialize(new Uint8Array(decodedTransaction)) as T;
|
|
@@ -144,7 +171,7 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
144
171
|
}
|
|
145
172
|
|
|
146
173
|
async sendTransaction(data: SolanaTransactionData): Promise<string | null> {
|
|
147
|
-
const { fromAddress, toAddress, amount, network, rpcUrl } = data;
|
|
174
|
+
const { fromAddress, toAddress, amount, network, rpcUrl, tokenMint } = data;
|
|
148
175
|
|
|
149
176
|
if (!this.connector) {
|
|
150
177
|
throw new Error('SolanaAdapter:sendTransaction - no active connector');
|
|
@@ -184,12 +211,20 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
184
211
|
// Create connection
|
|
185
212
|
const connection = new Connection(connectionRpcUrl, 'confirmed');
|
|
186
213
|
|
|
187
|
-
const transaction =
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
+
});
|
|
193
228
|
|
|
194
229
|
// Sign the transaction
|
|
195
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,155 @@
|
|
|
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_TRANSFER_ONLY: 300000,
|
|
23
|
+
UNIT_LIMIT_WITH_ATA_CREATION: 400000
|
|
24
|
+
} as const;
|
|
25
|
+
|
|
26
|
+
async function getMintOwnerProgramId(connection: Connection, mint: PublicKey) {
|
|
27
|
+
const info = await connection.getAccountInfo(mint);
|
|
28
|
+
|
|
29
|
+
if (!info) {
|
|
30
|
+
throw new Error('Mint account not found');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (info.owner.equals(TOKEN_PROGRAM_ID)) {
|
|
34
|
+
return TOKEN_PROGRAM_ID;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (info.owner.equals(TOKEN_2022_PROGRAM_ID)) {
|
|
38
|
+
return TOKEN_2022_PROGRAM_ID;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
throw new Error('Unknown mint owner program');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function createSPLTokenTransaction({
|
|
45
|
+
fromAddress,
|
|
46
|
+
toAddress,
|
|
47
|
+
amount,
|
|
48
|
+
tokenMint,
|
|
49
|
+
connection
|
|
50
|
+
}: SPLTokenTransactionArgs): Promise<Transaction> {
|
|
51
|
+
if (!fromAddress) {
|
|
52
|
+
throw new Error('No public key found');
|
|
53
|
+
}
|
|
54
|
+
if (amount <= 0) {
|
|
55
|
+
throw new Error('Amount must be greater than 0');
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const fromPubkey = new PublicKey(fromAddress);
|
|
59
|
+
const toPubkey = new PublicKey(toAddress);
|
|
60
|
+
const mintPubkey = new PublicKey(tokenMint);
|
|
61
|
+
|
|
62
|
+
const programId = await getMintOwnerProgramId(connection, mintPubkey);
|
|
63
|
+
|
|
64
|
+
const mintInfo = await getMint(connection, mintPubkey, undefined, programId);
|
|
65
|
+
const decimals = mintInfo.decimals;
|
|
66
|
+
if (decimals < 0) {
|
|
67
|
+
throw new Error('Invalid token decimals');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const tokenAmount = Math.floor(amount * 10 ** decimals);
|
|
71
|
+
|
|
72
|
+
const fromTokenAccount = getAssociatedTokenAddressSync(
|
|
73
|
+
mintPubkey,
|
|
74
|
+
fromPubkey,
|
|
75
|
+
false,
|
|
76
|
+
programId
|
|
77
|
+
);
|
|
78
|
+
const toTokenAccount = getAssociatedTokenAddressSync(mintPubkey, toPubkey, false, programId);
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
const fromAccount = await getAccount(connection, fromTokenAccount, undefined, programId);
|
|
82
|
+
if (fromAccount.amount < BigInt(tokenAmount)) {
|
|
83
|
+
throw new Error('Insufficient token balance');
|
|
84
|
+
}
|
|
85
|
+
} catch (error) {
|
|
86
|
+
if (error instanceof TokenAccountNotFoundError) {
|
|
87
|
+
throw new Error('Sender does not have a token account for this mint');
|
|
88
|
+
}
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
let shouldCreateATA = false;
|
|
93
|
+
try {
|
|
94
|
+
await getAccount(connection, toTokenAccount, undefined, programId);
|
|
95
|
+
} catch (error) {
|
|
96
|
+
if (error instanceof TokenAccountNotFoundError) {
|
|
97
|
+
shouldCreateATA = true;
|
|
98
|
+
} else {
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const instructions: TransactionInstruction[] = [];
|
|
104
|
+
|
|
105
|
+
const computeUnitLimit = shouldCreateATA
|
|
106
|
+
? SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT_WITH_ATA_CREATION
|
|
107
|
+
: SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_LIMIT_TRANSFER_ONLY;
|
|
108
|
+
|
|
109
|
+
instructions.push(
|
|
110
|
+
ComputeBudgetProgram.setComputeUnitPrice({
|
|
111
|
+
microLamports: SPL_COMPUTE_BUDGET_CONSTANTS.UNIT_PRICE_MICRO_LAMPORTS
|
|
112
|
+
}),
|
|
113
|
+
ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnitLimit })
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
if (shouldCreateATA) {
|
|
117
|
+
instructions.push(
|
|
118
|
+
createAssociatedTokenAccountInstruction(
|
|
119
|
+
fromPubkey,
|
|
120
|
+
toTokenAccount,
|
|
121
|
+
toPubkey,
|
|
122
|
+
mintPubkey,
|
|
123
|
+
programId
|
|
124
|
+
)
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
instructions.push(
|
|
129
|
+
createTransferCheckedInstruction(
|
|
130
|
+
fromTokenAccount,
|
|
131
|
+
mintPubkey,
|
|
132
|
+
toTokenAccount,
|
|
133
|
+
fromPubkey,
|
|
134
|
+
tokenAmount,
|
|
135
|
+
decimals,
|
|
136
|
+
[],
|
|
137
|
+
programId
|
|
138
|
+
)
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash();
|
|
142
|
+
|
|
143
|
+
return new Transaction({
|
|
144
|
+
feePayer: fromPubkey,
|
|
145
|
+
blockhash,
|
|
146
|
+
lastValidBlockHeight
|
|
147
|
+
}).add(...instructions);
|
|
148
|
+
} catch (error) {
|
|
149
|
+
throw new Error(
|
|
150
|
+
`Failed to create SPL token transaction: ${
|
|
151
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
152
|
+
}`
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -13,7 +13,7 @@ type SendTransactionArgs = {
|
|
|
13
13
|
connection: Connection;
|
|
14
14
|
fromAddress: string;
|
|
15
15
|
toAddress: string;
|
|
16
|
-
|
|
16
|
+
amount: number;
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
/**
|
|
@@ -21,19 +21,19 @@ type SendTransactionArgs = {
|
|
|
21
21
|
* amount of SOL that can be sent in case of cleaning the account and remove the rent exemption error.
|
|
22
22
|
*/
|
|
23
23
|
const COMPUTE_BUDGET_CONSTANTS = {
|
|
24
|
-
UNIT_PRICE_MICRO_LAMPORTS:
|
|
24
|
+
UNIT_PRICE_MICRO_LAMPORTS: 1000000,
|
|
25
25
|
UNIT_LIMIT: 500
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
export async function createSendTransaction({
|
|
29
29
|
fromAddress,
|
|
30
30
|
toAddress,
|
|
31
|
-
|
|
31
|
+
amount,
|
|
32
32
|
connection
|
|
33
33
|
}: SendTransactionArgs): Promise<Transaction> {
|
|
34
34
|
const fromPubkey = new PublicKey(fromAddress);
|
|
35
35
|
const toPubkey = new PublicKey(toAddress);
|
|
36
|
-
const lamports = Math.floor(
|
|
36
|
+
const lamports = Math.floor(amount * LAMPORTS_PER_SOL);
|
|
37
37
|
|
|
38
38
|
const { blockhash } = await connection.getLatestBlockhash();
|
|
39
39
|
|