Skip to main content

Solana

This article describes the process of completing a Solana transaction through the SDK.

Support List

Support most SOL-series cryptocurrencies and their tokens.

  • Solana

GsWalletSolSDK

The GsWalletSolSDK class mainly implements the following functions:

  • Construct SOL transactions.
  • Parse signature information.
class GsWalletSolSDK {

static UR generateSignRequest({
String? uuid,
required String signData,
required SignType signType,
required String path,
required String xfp,
String? outputAddress,
String? contractAddress,
String? origin,
int? fee,
})

static Map<String, dynamic> parseSignature(UR ur);

}

generateSignRequest

static UR generateSignRequest({
String? uuid,
required String signData,
required SignType signType,
required String path,
required String xfp,
String? outputAddress,
String? contractAddress,
String? origin,
int? fee,
})

Input parameters

  • uuid: String optional Representing the unique ID of a transaction

  • signData: String required Unsigned-transaction data, it's serialized hex for a SOL transaction

  • signType: SignType required Unsigned-message type

  • path: String required BIP32 derivation path for from-address of the transaction

  • xfp: String required MasterFingerprint, used as a unique wallet ID

  • outputAddress: String optional Receiving address, it is required if it is a token transaction

  • contractAddress: String optional Contract address, it is required if it is a token transaction

  • origin: String optional Notes for transaction, usually source of the request

  • fee: int optional Transaction fee, minimum unit.

parseSignature

static Map<String, dynamic> parseSignature(UR ur);

Returns

  • uuid: Uint8List transaction ID.

  • signature: String signature of transaction.

  • origin: String usually "GsWallet".

Example

Construct transaction

import 'package:gs_ur_dart/gs_ur_dart.dart';

UR ur = GsWalletSolSDK.generateSignRequest(
uuid: "65781260-8d2c-11ef-806b-cf7f7ddae54a",
signData:
"01000203d9aa0cde2dd59caa4e04fe703439abba02d81391adb78dd1e67130e93684951200000000000000000000000000000000000000000000000000000000000000000306466fe5211732ffecadba72c39be7bc8ce5bbc5f7126b2c439b3a40000000d88b1bb92a7e915051f7287e53d1c6a2bd97a7a6c169a6ee00a912f793936e0c03010200000c02000000158d0b020000000002000502400d030002000903801a060000000000",
signType: SignType.transaction,
path: "m/44'/501'/0'/0'",
xfp: "27c3831f",
outputAddress: null,
contractAddress: null,
origin: null,
fee: 100000);

final UREncoder urEncoder = UREncoder(ur);
String _currentQR = urEncoder.nextPart();
emit(_AnimatedQRDataState(_currentQR));
timer = Timer.periodic(const Duration(milliseconds: 250), (_) {
_currentQR = urEncoder.nextPart();
emit(_AnimatedQRDataState(_currentQR));
});

Parse signature

import 'package:gs_ur_dart/gs_ur_dart.dart';

typedef SuccessCallback = void Function(UR);
final SuccessCallback onSuccess;

final QRViewController controller;

controller.scannedDataStream.listen((event) {
URDecoder urDecoder = URDecoder();
urDecoder.receivePart(event.code);
double progress = urDecoder.getProgress();
if (urDecoder.isComplete()) {
final UR result = urDecoder.resultUR();
if (!succeed) {
onSuccess(result);
succeed = true;
}
}
});

onSuccess(UR ur){
final solSigned = GsWalletSolSDK.parseSignature(ur);
}

// solSigned: {
// "uuid": [101,120,18,96,141,44,17,239,128,107,207,127,125,218,229,74],
// "signature":"1cd95cbd3df72efe043ff50da43f03e6fed76a133a62f1b897de9ecc0ecd50e5d9a35ebf0340eb4368ee681b2387db3c053d69e09927e642ef8aa70b3502320b",
// "origin":"GSWALLET",
// };