Created
March 15, 2025 01:57
-
-
Save latheesan-k/7d206ab8cc03e0d412570457c40fc49a to your computer and use it in GitHub Desktop.
Cardano CIP-30 Wallet Manager for Godot
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage Example