{"id":50499223,"url":"https://github.com/phantasma-io/phantasma-sdk-go","last_synced_at":"2026-06-02T10:01:42.544Z","repository":{"id":237344285,"uuid":"770341450","full_name":"phantasma-io/phantasma-sdk-go","owner":"phantasma-io","description":"A Go SDK for the Phantasma blockchain","archived":false,"fork":false,"pushed_at":"2026-05-28T16:35:02.000Z","size":1031,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-28T18:17:21.096Z","etag":null,"topics":["blockchain","crypto","cryptocurrency","go","layer1","phantasma","phantasmachain","phantasmaio","sdk","smartnft","smartnfts"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phantasma-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-03-11T11:38:57.000Z","updated_at":"2026-05-28T16:34:32.000Z","dependencies_parsed_at":"2024-07-20T00:29:01.757Z","dependency_job_id":"4a64e08a-9d9e-4b23-946a-0c149425fdc5","html_url":"https://github.com/phantasma-io/phantasma-sdk-go","commit_stats":null,"previous_names":["phantasma-io/phantasma-go","phantasma-io/phantasma-sdk-go"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/phantasma-io/phantasma-sdk-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phantasma-io%2Fphantasma-sdk-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phantasma-io%2Fphantasma-sdk-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phantasma-io%2Fphantasma-sdk-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phantasma-io%2Fphantasma-sdk-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phantasma-io","download_url":"https://codeload.github.com/phantasma-io/phantasma-sdk-go/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phantasma-io%2Fphantasma-sdk-go/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33816488,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","crypto","cryptocurrency","go","layer1","phantasma","phantasmachain","phantasmaio","sdk","smartnft","smartnfts"],"created_at":"2026-06-02T10:01:41.499Z","updated_at":"2026-06-02T10:01:42.520Z","avatar_url":"https://github.com/phantasma-io.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg src=\"./.github/phantasma-sdk-go.jpg\" width=\"300px\" alt=\"logo\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eGo\u003c/b\u003e SDK for the \u003ca href=\"https://phantasma.io\"\u003ePhantasma\u003c/a\u003e blockchain.\n\u003c/p\u003e\n\n\u003chr /\u003e\n\n![License](https://img.shields.io/github/license/phantasma-io/phantasma-sdk-go.svg?style=popout)\n\n# Overview\n\nThis project aims to be an easy to use SDK for the Phantasma blockchain.\n\n# Documentation\n\n## Installation\n\nRequires Go 1.25 or newer. The module is developed with the Go 1.26 toolchain.\n\n`phantasma-sdk-go` is distributed as a library that includes all SDK functionality.\n\n```\ngo get -u github.com/phantasma-io/phantasma-sdk-go\n```\n\n## Getting started\nTo start interacting with Phantasma blockchain you need to choose the network and create an RPC client. All typed RPC methods take `context.Context` as their first argument so callers can set deadlines and cancellation.\n\n```go\nctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)\ndefer cancel()\n\nclient := rpc.NewRPCTestnet()\n// client := rpc.NewRPCMainnet()\n```\n\nTo create a new key pair structure from private key in WIF format use following code:\n```go\nkeyPair, err := cryptography.FromWIF(\"put WIF here\")\nif err != nil {\n    log.Fatalf(\"creating key pair: %v\", err)\n}\n```\n\nTo get detailed description of tokens deployed on the chain and read token characteristics you can use following code:\n\n```go\nchainTokens, err := client.GetTokens(ctx, false)\nif err != nil {\n    log.Fatal(err)\n}\n\nfor _, token := range chainTokens {\n    if token.Symbol == \"SOUL\" \u0026\u0026 token.IsFungible() {\n        fmt.Println(\"Token SOUL is fungible\")\n        break\n    }\n}\n```\n\nCode samples in the following sections of this documentation use `client` and `keyPair` structures which should be initialized in advance.\n\n## Carbon transactions and token builders\n\nThe SDK includes `pkg/carbon` for Phantasma Phoenix Carbon transaction serialization and token-module calls. This package mirrors the C#/TS/C++ SDK model:\n\n- fixed-width Carbon types: `Bytes16`, `Bytes32`, `Bytes64`, `SmallString`, `IntX`;\n- `TxMsg`, `SignedTxMsg`, witnesses, call sections, and trade payloads;\n- VM schema structures used by token metadata;\n- token-module argument/result blobs for create token, create series, mint, transfer, burn and metadata update calls;\n- high-level helpers for token metadata, NFT ROM/RAM, standard NFT schemas, transaction signing, and NFT address/instance-id conversion.\n\nExample: build and sign a Carbon NFT mint transaction:\n\n```go\nsigner, err := cryptography.FromWIF(\"put WIF here\")\nif err != nil {\n    log.Fatal(err)\n}\n\nreceiver, err := carbon.Bytes32FromPhantasmaAddressText(\"put receiver address here\")\nif err != nil {\n    log.Fatal(err)\n}\n\nschemas := carbon.PrepareStandardTokenSchemas(false)\nrom, err := carbon.BuildNFTRom(schemas.ROM, big.NewInt(1), []carbon.MetadataField{\n    {Name: \"name\", Value: \"Example NFT\"},\n    {Name: \"description\", Value: \"Minted with phantasma-sdk-go Carbon helpers\"},\n    {Name: \"imageURL\", Value: \"https://example.com/nft.png\"},\n    {Name: \"infoURL\", Value: \"https://example.com/nft\"},\n    {Name: \"royalties\", Value: int32(0)},\n})\nif err != nil {\n    log.Fatal(err)\n}\n\nsignedTx, err := carbon.BuildMintNonFungibleTxAndSignHex(\n    42,                 // Carbon token id\n    1,                  // Carbon series id\n    signer,\n    receiver,\n    rom,\n    nil,                // RAM\n    carbon.DefaultMintNFTFeeOptions(),\n    100_000_000,\n    time.Now().UTC().Add(20*time.Minute).UnixMilli(),\n)\nif err != nil {\n    log.Fatal(err)\n}\n\ntxHash, err := client.SendCarbonTransaction(ctx, signedTx)\nif err != nil {\n    log.Fatal(err)\n}\nfmt.Println(\"Carbon tx hash:\", txHash)\n```\n\nSee `docs/carbon.md` for the package-level API map.\nCarbon `Build...` helpers return validation errors for user input; `MustBuild...` variants are available only when panic-on-invalid-input is intentional.\n\n## Carbon RPC wrappers\n\nThe RPC client now exposes the Carbon endpoints used by the current C#/TS SDKs. Important additions include:\n\n- chain/block lookup: `GetChains`, `GetChain`, `GetNexus`, `GetBlockByHash`, `GetLatestBlock`, `GetTransactionByBlockHashAndIndex`;\n- contract/organization lookup: `GetContracts`, `GetContractByName`, `GetContractByAddress`, `GetOrganization`, `GetOrganizations`, `GetOrganizationMembers`, `GetOrganizationMember`;\n- Carbon token views: `GetTokensByOwner`, `GetTokenWithID`, `GetTokenSeries`, `GetTokenSeriesByID`, `GetTokenNFTs`, `GetAccountFungibleTokens`, `GetAccountNFTs`, `GetAccountOwnedTokens`, `GetAccountOwnedTokenSeries`;\n- archive and auction helpers: `GetArchive`, `ReadArchive`, `WriteArchive`, `GetAuctionsCount`, `GetAuctions`, `GetAuction`;\n- transaction broadcast: `SendCarbonTransaction`, `SignAndSendCarbonTransaction`.\n\nCursor-paginated endpoints return `response.CursorPaginatedResult[T]`.\nCarbon token id filters use `uint64`, Carbon series id filters use `uint32`, and `0` means no Carbon id filter. `GetTokenNFTsWithSeriesID` accepts the Phantasma Series ID string filter exposed by current RPC nodes.\nUse `client.Call(ctx, method, params...)` for low-level calls that need request cancellation or deadlines.\n\n## Public package surface\n\nPrefer the high-level packages for application code:\n\n- `pkg/rpc` and `pkg/rpc/response` for node calls and typed RPC results;\n- `pkg/carbon` for Carbon transactions, serialization, token builders, and signing;\n- `pkg/vm/script_builder` for classic VM scripts;\n- `pkg/cryptography` for keys, addresses, signatures, and WIF handling;\n- `pkg/blockchain` for classic VM transaction objects.\n\nLower-level packages such as `pkg/io`, `pkg/jsonrpc`, `pkg/domain`, and `pkg/vm` remain available for advanced serialization and migration work, but application code should avoid depending on their internals unless it needs that wire-level control.\n\n## Script Builder\n\nBuilding a script is the main entry point for transaction and contract interactions. The script must match the target contract or interop ABI.\n\nThe `CallContract` and `CallInterop` methods are the primary entry points for creating scripts.\n\n```\nfunc (s ScriptBuilder) CallContract(contractName, method string, args ...interface{}) ScriptBuilder\n```\n\n```\nfunc (s ScriptBuilder) CallInterop(method string, args ...interface{}) ScriptBuilder\n```\n\nThe available `CallInterop` functions are listed below.\n\nFor `CallContract`, inspect the ABIs of the smart contracts currently deployed on Phantasma mainnet: [Explorer contract list](https://explorer.phantasma.info/en/nexus?tab=contracts). To see all methods of a contract, for example `stake`, check the contract methods view: [stake contract methods](https://explorer.phantasma.info/en/contract?id=stake\u0026tab=methods).\n\nThe Go builder now resolves labels per instance, emits integer values as VM `Number` payloads, supports array arguments, and matches the C#/TS/C++ shared script vectors.\nAddress arguments are intentionally typed as `cryptography.Address` in high-level helpers. Raw `string` arguments passed to `CallContract` or `CallInterop` are emitted as VM strings; use `cryptography.MustAddressFromString(text)` or the `*Text` helpers when the ABI expects a Phantasma address.\n\n### Examples\n\nFollowing code generates script to transfer `tokenAmount` amount of token `tokenSymbol` from wallet `from` to wallet `to`\n```\nfrom := cryptography.MustAddressFromString(\"put sender address here\") // Phantasma address, starting with capital 'P'\nto := cryptography.MustAddressFromString(\"put recipient address here\") // Phantasma address, starting with capital 'P'\ntokenAmount := big.NewInt(1000000000) // Token amount in the form of big integer\ntokenSymbol := \"SOUL\"\n\nsb := scriptbuilder.BeginScript()\nscript := sb.CallContract(\"gas\", \"AllowGas\", from, cryptography.NullAddress(), big.NewInt(100000), big.NewInt(21000)).\n    CallInterop(\"Runtime.TransferTokens\", from, to, tokenSymbol, tokenAmount).\n    CallContract(\"gas\", \"SpendGas\", from).\n    EndScript()\n```\n\nAnd here we generate script to make a call which does not require transaction, for this we use `CallContract` method:\n\n```\naddress := cryptography.MustAddressFromString(\"put caller address here\") // Phantasma address, starting with capital 'P'\ntokenAmount := big.NewInt(1000000000) // Token amount in the form of big integer\n\nsb := scriptbuilder.BeginScript().\n    CallContract(\"gas\", \"AllowGas\", address, cryptography.NullAddress(), big.NewInt(100000), big.NewInt(21000)).\n    CallContract(\"stake\", \"Stake\", address, tokenAmount).\n    CallContract(\"gas\", \"SpendGas\", address)\nscript := sb.EndScript()\n```\n\n## Script Builder Extensions\n\nFor some widely used contract calls SDK has special extension methods which make code more compact. The typed-address helpers are `AllowGas`, `SpendGas`, `MintTokens`, `Stake`, `Unstake`, `TransferTokens`, `TransferBalance`, `TransferNFT`, `CrossTransferToken`, `CrossTransferNFT`, and `CallNFT`.\n\nString-address convenience helpers are `AllowGasText`, `SpendGasText`, `MintTokensText`, `StakeText`, `UnstakeText`, `TransferTokensText`, `TransferBalanceText`, `TransferNFTText`, `CrossTransferTokenText`, and `CrossTransferNFTText`.\n\nThe ordinary `*Text` helpers parse Phantasma address text before emitting VM address bytes. Cross-chain text helpers parse the Phantasma destination-chain/sender addresses and keep the destination account as a VM string for non-Phantasma destination formats.\n\n### Examples\n\nWe can rewrite examples from previous section using `AllowGas()` and `SpendGas()` extensions:\n\n```\nsb := scriptbuilder.BeginScript()\nscript := sb.AllowGas(from, cryptography.NullAddress(), big.NewInt(100000), big.NewInt(21000)).\n    CallInterop(\"Runtime.TransferTokens\", from, to, tokenSymbol, tokenAmount).\n    SpendGas(from).\n    EndScript()\n```\n```\nsb := scriptbuilder.BeginScript().\n    AllowGas(address, cryptography.NullAddress(), big.NewInt(100000), big.NewInt(21000)).\n    CallContract(\"stake\", \"Stake\", address, tokenAmount).\n    SpendGas(address)\nscript := sb.EndScript()\n```\n\nWe can also rewrite main contract calls in these examples:\n\n```\nsb := scriptbuilder.BeginScript()\nscript := sb.AllowGas(from, cryptography.NullAddress(), big.NewInt(100000), big.NewInt(21000)).\n    TransferTokens(tokenSymbol, from, to, tokenAmount).\n    SpendGas(from).\n    EndScript()\n```\n```\nsb := scriptbuilder.BeginScript().\n    AllowGas(address, cryptography.NullAddress(), big.NewInt(100000), big.NewInt(21000)).\n    Stake(address, tokenAmount).\n    SpendGas(address)\nscript := sb.EndScript()\n```\n\n## InvokeRawScript and decoding the result\n\nScripts that do not require a transaction can be sent to the chain directly using `InvokeRawScript()`.\n\nHere's a read-only example that gets SOUL token decimals from the chain:\n\n```go\n// Build script\nsb := scriptbuilder.BeginScript().\n    CallInterop(\"Runtime.GetTokenDecimals\", \"SOUL\")\nscript := sb.EndScript()\n\n// Before sending script to the chain we need to encode it into Base16 encoding (HEX)\nencodedScript := fmt.Sprintf(\"%x\", script)\n\n// Make the call itself\nresult, err := client.InvokeRawScript(ctx, \"main\", encodedScript)\n\nif err != nil {\n    log.Fatalf(\"script invocation failed: %v\", err)\n}\n\nvalue, err := result.DecodeResultWithError()\nif err != nil {\n    log.Fatalf(\"script result decoding failed: %v\", err)\n}\nfmt.Println(\"SOUL decimals:\", value.AsNumber().String())\n```\n\n## Building and sending transaction\n\n### Building transaction\nTo build a transaction you will first need to build a script.\n\nNote, building a transaction is for transactional scripts only. Non transactional scripts should use the RPC function `InvokeRawScript()`.\n\n```\n// Build script\nsb := scriptbuilder.BeginScript()\nscript := sb.AllowGas(keyPair.Address(), cryptography.NullAddress(), big.NewInt(100000), big.NewInt(21000)).\n    TransferTokens(tokenSymbol, keyPair.Address(), to, tokenAmount).\n    SpendGas(keyPair.Address()).\n    EndScript()\n\n// Build transaction\nexpire := time.Now().UTC().Add(time.Second * time.Duration(30)).Unix()\ntx := blockchain.NewTransaction(netSelected, \"main\", script, uint32(expire), domain.SDKPayload)\n\n// Sign transaction\nif err := tx.Sign(keyPair); err != nil {\n    log.Fatal(err)\n}\n\n// Before sending script to the chain we need to encode it into Base16 encoding (HEX)\ntxHex := hex.EncodeToString(tx.Bytes())\n```\n\n### Sending transaction\n\nBroadcasting requires a funded key and sends a transaction to the selected network. Keep broadcast examples separate from read-only examples and only run them intentionally.\n\n```\ntxHash, err := client.SendRawTransaction(ctx, txHex)\nif err != nil {\n    log.Fatalf(\"broadcasting tx failed: %v\", err)\n} else {\n    if util.ErrorDetect(txHash) {\n        log.Fatalf(\"broadcasting tx failed: %s\", txHash)\n    } else {\n        fmt.Println(\"Tx successfully broadcasted! Tx hash: \" + txHash)\n    }\n}\n```\n\n### Waiting for transaction execution result\n\nWe need to wait for transaction to be minted on the chain to get its status:\n\n```\nfor {\n    txResult, _ := client.GetTransaction(ctx, txHash)\n\n    if txResult.StateIsSuccess() {\n        fmt.Println(\"Transaction was successfully minted, tx hash: \" + fmt.Sprint(txResult.Hash))\n        break // Funds were transferred successfully\n    }\n    if txResult.StateIsFault() {\n        fmt.Println(\"Transaction failed, tx hash: \" + fmt.Sprint(txResult.Hash))\n        break // Funds were not transferred, transaction failed\n    }\n\n    time.Sleep(200 * time.Millisecond)\n}\n```\n\n## Staking SOUL token\n\nFollowing code shows how to stake SOUL token:\n\n```\n// Build script\nsb := scriptbuilder.BeginScript().\n    AllowGas(address, cryptography.NullAddress(), big.NewInt(100000), big.NewInt(21000)).\n    Stake(address, tokenAmount).\n    SpendGas(address)\nscript := sb.EndScript()\n\n// Build transaction\nexpire := time.Now().UTC().Add(time.Second * time.Duration(30)).Unix()\ntx := chain.NewTransaction(netSelected, \"main\", script, uint32(expire), domain.SDKPayload)\n\n// Sign transaction\nif err := tx.Sign(keyPair); err != nil {\n    log.Fatal(err)\n}\n\n// Before sending script to the chain we need to encode it into Base16 encoding (HEX)\ntxHex := hex.EncodeToString(tx.Bytes())\n\ntxHash, err := client.SendRawTransaction(ctx, txHex)\nif err != nil {\n    log.Fatalf(\"broadcasting tx failed: %v\", err)\n} else {\n    if util.ErrorDetect(txHash) {\n        log.Fatalf(\"broadcasting tx failed: %s\", txHash)\n    } else {\n        fmt.Println(\"Tx successfully broadcasted! Tx hash: \" + txHash)\n    }\n}\n\nfor {\n    txResult, _ := client.GetTransaction(ctx, txHash)\n\n    if txResult.StateIsSuccess() {\n        fmt.Println(\"Transaction was successfully minted, tx hash: \" + fmt.Sprint(txResult.Hash))\n        break // Funds were transferred successfully\n    }\n    if txResult.StateIsFault() {\n        fmt.Println(\"Transaction failed, tx hash: \" + fmt.Sprint(txResult.Hash))\n        break // Funds were not transferred, transaction failed\n    }\n\n    time.Sleep(200 * time.Millisecond)\n}\n```\n\n## Scanning the blockchain for incoming transactions\n\nIn the following code we monitor the blockchain by checking all the new blocks minted on the blockchain and waiting for `TokenReceive` event for given address. This event for address means that address has received some tokens.\n\n```\nfunc onTransactionReceived(address, symbol, amount string) {\n    fmt.Printf(\"Address %s received %s %s\\n\", address, amount, symbol)\n}\n\nfunc waitForIncomingTransfers(address string) {\n    // Get current block height\n    height, _ := client.GetBlockHeight(ctx, \"main\")\n\n    for {\n        // Get block's data by its height\n        block, err := client.GetBlockByHeight(ctx, \"main\", height.String())\n        if err != nil {\n            log.Fatalf(\"GetBlockByHeight failed: %v\", err)\n        }\n\n        // Iterate throough all transactions in the block\n        for _, tx := range block.Txs {\n            // Skip failed trasactions\n            if !tx.StateIsSuccess() {\n                continue\n            }\n\n            // Iterate throough all events in the transaction\n            for _, e := range tx.Events {\n\n                if e.Kind == event.TokenReceive.String() \u0026\u0026 e.Address == address {\n                    // We found TokenReceive event for given address\n\n                    // Decode event data into event.TokenEventData structure\n                    decoded, _ := hex.DecodeString(e.Data)\n                    data := io.Deserialize[*event.TokenEventData](decoded, \u0026event.TokenEventData{})\n\n                    // Apply decimals to the token amount\n                    t, ok := getChainToken(data.Symbol)\n                    if !ok {\n                        log.Fatalf(\"token %s not found\", data.Symbol)\n                    }\n                    tokenAmount := util.ConvertDecimals(data.Value, int(t.Decimals))\n\n                    // Call our callback function\n                    onTransactionReceived(e.Address, data.Symbol, tokenAmount)\n                }\n            }\n        }\n\n        // Wait for next block to appear on the blockchain\n        for {\n            newHeight, _ := client.GetBlockHeight(ctx, \"main\")\n            if newHeight.Cmp(height) == 1 {\n                // New block was minted (at least 1 new block)\n                height = height.Add(height, big.NewInt(1))\n                break\n            }\n\n            // Wait 200 milliseconds before making next RPC call\n            time.Sleep(200 * time.Millisecond)\n        }\n    }\n}\n```\n\n## Examples\n\nThis repository has `examples` folder with some code which can be easily reused. Examples are grouped into a single console application.\n\nTo run this application switch to `examples` folder and run:\n\n```\ngo run .\n```\n\nor\n\n```\nsh run.sh\n```\n\nApplication entry point is `main()` function in `main.go` source file. Once launched it will display the following menu:\n\n![image](https://github.com/user-attachments/assets/42c7f5a5-41ea-4dfa-9a05-45028c563be6)\n\nWallet submenu:\n\n![image](https://github.com/user-attachments/assets/c6484554-3be8-415d-a8a0-1d885d0f9a37)\n\nChain stats submenu:\n\n![image](https://github.com/user-attachments/assets/7a1c0fec-9b92-4a8a-8e16-cd54f42b066f)\n\n\n# Contributing\n\nFeel free to contribute to this project after reading the\n[contributing guidelines](CONTRIBUTING.md).\n\nBefore starting to work on a certain topic, create an new issue first,\ndescribing the feature/topic you are going to implement.\n\n# Contact\n\n- Get in contact with us on the [Phantasma Discord](https://discord.gg/JzSnmFZCcD)\n\n# License\n\n- Open-source [MIT](LICENSE.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphantasma-io%2Fphantasma-sdk-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphantasma-io%2Fphantasma-sdk-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphantasma-io%2Fphantasma-sdk-go/lists"}