Skip to content

Instantly share code, notes, and snippets.

@latheesan-k
Created March 15, 2025 01:57
Show Gist options
  • Save latheesan-k/7d206ab8cc03e0d412570457c40fc49a to your computer and use it in GitHub Desktop.
Save latheesan-k/7d206ab8cc03e0d412570457c40fc49a to your computer and use it in GitHub Desktop.
Cardano CIP-30 Wallet Manager for Godot
class_name CardanoWallet
extends Node
# Signals
signal wallet_enabled(wallet_name: String, success: bool, error: Variant)
signal api_result(method_name: String, result: Variant, error: Variant)
# Variables
var current_wallet: String = ""
# Lists all available wallets by inspecting window.cardano
func get_available_wallets() -> Array:
var wallets = JavaScriptBridge.eval("Object.keys(window.cardano || {})")
if wallets is Array:
return wallets
return []
# Enables a selected wallet and stores its API in window.connectedWallet
func enable_wallet(wallet_name: String) -> void:
var callback = JavaScriptBridge.create_callback(self, "_on_wallet_enabled")
JavaScriptBridge.eval("""
var callback = arguments[0];
var walletName = arguments[1];
window.cardano[walletName].enable().then(function(api) {
window.connectedWallet = api;
callback([walletName, true]);
}).catch(function(error) {
callback([walletName, false, error]);
});
""", callback, [wallet_name])
# Callback for wallet enable result
func _on_wallet_enabled(args: Array) -> void:
var wallet_name = args[0]
var success = args[1]
if success:
current_wallet = wallet_name
emit_signal("wallet_enabled", wallet_name, true, null)
else:
var error = args[2]
emit_signal("wallet_enabled", wallet_name, false, error)
# Generic method to call any CIP-30 API method
func _call_api_method(method_name: String, args: Array = []) -> void:
var js_args_json = JSON.stringify(args)
var callback = JavaScriptBridge.create_callback(self, "_on_api_method_result")
JavaScriptBridge.eval("""
var callback = arguments[0];
var methodName = arguments[1];
var args = JSON.parse(arguments[2]);
window.connectedWallet[methodName](...args).then(function(result) {
callback([methodName, result]);
}).catch(function(error) {
callback([methodName, null, error]);
});
""", callback, [method_name, js_args_json])
# Callback for API method results
func _on_api_method_result(args: Array) -> void:
var method_name = args[0]
if args[1] != null:
emit_signal("api_result", method_name, args[1], null)
else:
emit_signal("api_result", method_name, null, args[2])
# CIP-30 API Methods
func get_network_id() -> void:
_call_api_method("getNetworkId", [])
func get_balance() -> void:
_call_api_method("getBalance", [])
func get_utxos(amount: String = "", paginate: Dictionary = {}) -> void:
var args = []
if amount != "":
args.append(amount)
if not paginate.is_empty():
args.append(paginate)
_call_api_method("getUtxos", args)
func get_used_addresses(paginate: Dictionary = {}) -> void:
_call_api_method("getUsedAddresses", [paginate])
func get_unused_addresses() -> void:
_call_api_method("getUnusedAddresses", [])
func get_change_address() -> void:
_call_api_method("getChangeAddress", [])
func get_reward_addresses() -> void:
_call_api_method("getRewardAddresses", [])
func sign_tx(tx: String, partial_sign: bool) -> void:
_call_api_method("signTx", [tx, partial_sign])
func sign_data(address: String, payload: String) -> void:
_call_api_method("signData", [address, payload])
func submit_tx(tx: String) -> void:
_call_api_method("submitTx", [tx])
func get_collateral(params: Dictionary = {}) -> void:
_call_api_method("getCollateral", [params])
@latheesan-k
Copy link
Author

latheesan-k commented Mar 15, 2025

Usage Example

# Create an instance of CardanoWallet
var cardano_wallet = CardanoWallet.new()

func _ready() -> void:
    add_child(cardano_wallet)
    # Connect signals
    cardano_wallet.connect("wallet_enabled", self._on_wallet_enabled)
    cardano_wallet.connect("api_result", self._on_api_result)
    # List available wallets
    var wallets = cardano_wallet.get_available_wallets()
    if wallets.size() > 0:
        print("Available wallets:", wallets)
        # Enable the first wallet (e.g., "nami")
        cardano_wallet.enable_wallet(wallets[0])
    else:
        print("No wallets detected.")

func _on_wallet_enabled(wallet_name: String, success: bool, error: Variant) -> void:
    if success:
        print("Wallet enabled:", wallet_name)
        # Now you can call API methods
        cardano_wallet.get_network_id()
        cardano_wallet.get_balance()
    else:
        print("Failed to enable wallet:", error)

func _on_api_result(method_name: String, result: Variant, error: Variant) -> void:
    if error:
        print("Error in", method_name, ":", error)
        return
    match method_name:
        "getNetworkId":
            print("Network ID:", result)
        "getBalance":
            print("Balance:", result)
        # Add cases for other methods as needed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment