{"id":13562682,"url":"https://github.com/cbarraford/cosmos-multisig","last_synced_at":"2026-03-03T21:02:54.930Z","repository":{"id":57541840,"uuid":"193461743","full_name":"cbarraford/cosmos-multisig","owner":"cbarraford","description":"Multi-signature Wallet for the Cosmos Blockchain","archived":false,"fork":false,"pushed_at":"2023-05-06T03:20:35.000Z","size":229,"stargazers_count":21,"open_issues_count":1,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-05T09:34:45.839Z","etag":null,"topics":["cosmos","cosmos-hub","cosmos-sdk","multisig","multisig-address","multisig-wallets","multisign","multisignature","multisigsignedtransactions"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cbarraford.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-06-24T08:05:49.000Z","updated_at":"2024-01-17T14:30:54.000Z","dependencies_parsed_at":"2022-08-30T17:12:33.919Z","dependency_job_id":"21186198-66bd-4652-b406-8cfe356cf13e","html_url":"https://github.com/cbarraford/cosmos-multisig","commit_stats":{"total_commits":52,"total_committers":1,"mean_commits":52.0,"dds":0.0,"last_synced_commit":"4f551e94fb91801c921bbfc061e943952b5f59e7"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cbarraford/cosmos-multisig","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cbarraford%2Fcosmos-multisig","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cbarraford%2Fcosmos-multisig/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cbarraford%2Fcosmos-multisig/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cbarraford%2Fcosmos-multisig/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cbarraford","download_url":"https://codeload.github.com/cbarraford/cosmos-multisig/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cbarraford%2Fcosmos-multisig/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30060680,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T18:21:05.932Z","status":"ssl_error","status_checked_at":"2026-03-03T18:20:59.341Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cosmos","cosmos-hub","cosmos-sdk","multisig","multisig-address","multisig-wallets","multisign","multisignature","multisigsignedtransactions"],"created_at":"2024-08-01T13:01:11.146Z","updated_at":"2026-03-03T21:02:54.908Z","avatar_url":"https://github.com/cbarraford.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"Cosmos Multi-Signature Wallet\n=============================\nA custom Cosmos SDK blockchain that supports multi-signature wallets.\n\n# Overview\nWhile multsig transfer of coins utilizes the built in multisig feautres of\ncosmos, this blockchain expands that to create an infrastructure to have a\nnice UI around multisig transactions.\n\nThe complete workflow of a multisig transaction as follows...\n 1. Create a multisig wallet, specifying the name, minimum number of\n    signatures for a transaction to take place, and the pub keys associated\nwith the wallet.\n 2. Transfer funds to this wallet\n 3. Create a transaction request to send funds from the multisig wallet to\n    another address\n 4. Multiple owners of the multisig wallet sign the transaction.\n 5. Once enough signatures have been made, send the funds.\n 6. Update the transaction request with the `txhash` of the transfer of funds.\n\n### CLI\nThe cli tool has a series of queries and transaction that you can use. In\ntheory, you could iteract with this blockchain fully using the cli, but REST\nwas the intended purpose.\n\n#### Create a wallet\nThis command is used to create a multisig wallet. Pubkeys should be comma\nseparated (no spaces).\n```\nmsgicli tx multisig create-wallet [name] [min-signatures-required] [pub-keys], [addresses] [flags]\n```\n\n#### Get a wallet\nGet wallet info by wallet address\n```\nmsgicli query multisig get-wallet [address] [flags]\n```\n\n#### Query wallets\nSearch for a list of wallets by public key\n```\nmsgicli query multisig query-wallets [pub_key] [flags]\n```\n\n#### Create a transaction\nThis command creates a transaction request to move funds out of a multisig\nwallet.\n```\nmsgicli tx multisig create-transaction [from] [to] [coins] [signers] [flags]\n```\n\n#### Get transaction\nRetrieve transaction request information by uuid\n```\nmsgicli query multisig get-transaction [uuid] [flags]\n```\n\n#### Query transactions\nGet a list of transaction requests by wallet address.\n```\nmsgicli query multisig query-transactions [wallet_address] [flags]\n```\n\n#### Add signature to transaction\nThis command adds a signature to a transaction request.\nTODO: remove need to supply `pubkey_base64`. This info is available via the\naccount info (`/auth/accounts/\u003caddress\u003e`). \n```\nmsgicli tx multisig save-transaction-signature [uuid] [pubkey] [pubkey_base64] [signature] [signers] [flags]\n```\n\n#### Add TxHash to transaction\nOnce the transaction is completed and funds sent, save the `txhash` in the\ntransaction request to mark it as completed.\n```\nmsgicli tx multisig complete-transaction [uuid] [transaction_id] [signers] [flags]\n```\n\n### API\nThere are corresponding API endpoints for each of the CLI commands above.\n\n#### `POST /multisig/wallet`\nCreate a wallet\n\n```\n{\n    \"name\": \"demo 1\",\n    \"base_req\": {\"chain_id\":\"msigchain\", \"from\": \"msigXXXXXX\"},\n    \"min_sig_tx\": 2,\n    \"pub_keys\": [...],\n    \"signers\": [...]\n}\n```\n\n#### `GET /multisig/wallet/\u003caddress\u003e`\nGet a wallet\n\n#### `GET /multisig/wallets/\u003cpubkey\u003e`\nList wallets that contain specified public key\n\n#### `POST /multisig/transaction`\nCreate a transaction request\n\n```\n{\n    \"base_req\": {\"chain_id\":\"msigchain\", \"from\": \"msigXXXXXX\"},\n    \"from\": \"msigXXXX\",\n    \"to\": \"msigXXXX\",\n    \"amount\": 3,\n    \"denom\": \"msigtoken\",\n    \"signers\": [...]\n}\n```\n\n#### `GET /multisig/transaction/\u003cuuid\u003e`\nGet a transaction request by uuid\n\n#### `GET /multisig/transactions/\u003caddress\u003e`\nList transaction by wallet address\n\n#### `POST /multisig/transaction/sign`\nAdd signature for a transaction request\n\n```\n{\n    \"base_req\": {\"chain_id\":\"msigchain\", \"from\": \"msigXXXXXX\"},\n    \"uuid\": \"02206ab8-ef05-4ecc-8e81-4430405e929a\",\n    \"signature\": \"1KRP93NJ85SxygGucoS7MqV39INDG/TYZzRP9NVzS4k/J7zn5kus1r3SoIXkyHgYEZmnaIyr26liL7uez45Uiw\",\n    \"pub_key\": \"msigp1addwnpepq0wx75hs3jpepjlvvee4r8gmuuxnmjzk6k5jkjps7n9rr3y4v0quqqy456c\",\n    \"pub_key_base64\": \"A/HRtDdV5mtPOMFhDDRRqb0s60q8rVJ+3AqSWd3PkOWx\",\n    \"signers\": [...]\n}\n```\n\n#### `POST /multisig/sign/multi`\nWith given signatures, generate a multi-signature. \n\"Signatures\" must be a list of tx signatures for pub keys of the wallet. Order\nis important here, and must align with the pub key order of the wallet.\n\"Slots\" is a string of zeros and ones representing which pubkeys of the wallet\nare included in the list of signatures, and which are not. Zeros are not\ninclude, ones are included.\nThe resulting json response will include the multisig signature.\n\n```\n{\n    \"Signatures\": [...],\n    \"Slots\": \"011\",\n}\n```\n\n#### `POST /multisig/transaction/complete`\nComplete a transaction supplying the `txhash` of the transfer of funds.\n\n```\n{\n    \"base_req\": {\"chain_id\":\"msigchain\", \"from\": \"msigXXXXXX\"},\n    \"uuid\": \"02206ab8-ef05-4ecc-8e81-4430405e929a\",\n    \"TxID\": \"939HDJ300...\",\n    \"signers\": [...],\n}\n```\n\n#### `POST /multisig/broadcast`\nBroadcast a message (same as to `/txs` in the cosmos SDK).\n\n# Developer\n\n## Types\n\n### `MultiSigWallet`\n`MultiSigWallet` is a type to store multisignature wallet information. This\ntype includes...\n * `Name` - the custom name of the wallet. This makes it easier for users to\n   identify each wallet and its purpose.\n * `MinSigTx` - the minimum number of regular user signatures required before\n   a transaction can be sent.\n * `Address` - The receiving address to send coins into this wallet.\n * `PubKeys` - A list of public keys associated with this wallet that has the\n   ability to sign transactions. Order of public keys is important.\n\n** Notes ** Wallets cannot be deleted, nor can they be overwritten or change\nonce created.\n\n### `Transaction`\n`Transaction` is a type to store a transaction request information to move\nfunds out of a multisig wallet. \n * `UUID` - a unique identifier (follow uuid standards) \n * `From` - an multisig wallet address to send the funds from\n * `To` - a wallet address to send the funds to\n * `Coins` - an array of coins to be sent from the multisig wallet. Currently\n   only one coins (one denom) can be sent at this time.\n * `Signatures` - the signed signatures of this transaction from the public\n   keys associated with the multisig wallet\n * `TxID` - the transaction hash from the blockchain referencing this\n   transaction on the blockchain. This is written as a last step to signify\nthe transaction is complete.\n * `CreatedAt` - The block height when this transaction request was first\n   created. This helps the UI sort the transaction list, but also acts a means\nto cleanup old transaction requests from history (ie deleting transaction\nrequests after X blocks have passed).\n\n## Setup\nEnsure you have a recent version of go (ie `1.121) and enabled go modules\n```\nexport GO111MODULE=on\n```\nAnd have `GOBIN` in your `PATH`\n```\nexport GOBIN=$GOPATH/bin\n```\n\n### Install\nInstall via this `make` command.\n\n```bash\nmake install\n```\n\nOnce you've installed `msigcli` and `msigd`, check that they are there.\n\n```bash\nmsigcli help\nmsigd help\n```\n\n### Configuration\n\nNext configure your chain.\n```bash\n# Initialize configuration files and genesis file\n# moniker is the name of your node\nmsigd init \u003cmoniker\u003e --chain-id msigchain\n\n\n# Copy the Address output here and save it for later use\n# [optional] add \"--ledger\" at the end to use a Ledger Nano S\nmsigcli keys add jack\n\n# Copy the Address output here and save it for later use\nmsigcli keys add alice\n\n# Add both accounts, with coins to the genesis file\nmsigd add-genesis-account $(msigcli keys show jack -a) 1000msig,100000000stake\nmsigd add-genesis-account $(msigcli keys show alice -a) 1000msig,100000000stake\n\n# Configure your CLI to eliminate need for chain-id flag\nmsigcli config chain-id msigchain\nmsigcli config output json\nmsigcli config indent true\nmsigcli config trust-node true\n\nmsigd gentx --name jack\n```\n\n### Start\nThere are three services you may want to start.\n\n#### Daemon\nThis runs the backend\n```bash\nmsigd start\n```\n\n#### API Service\nStarts an HTTP service to service requests to the backend.\n```bash\nmsigcli rest-server\n```\n\n#### CORS Proxy\nFor making requests in a browser to the API backend, you'll need to start a\nproxy in front of the API service to give proper CORS headers. \nFor development purposes, a service is provided in `/scripts/cors`\n\n```bash\ncd scripts/cors\nnpm start\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcbarraford%2Fcosmos-multisig","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcbarraford%2Fcosmos-multisig","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcbarraford%2Fcosmos-multisig/lists"}