Coder Social home page Coder Social logo

ledger-wallet-api's Introduction

High level API to the Ledger Wallet Chrome app

This is the high level JS API to the Ledger Wallet Chrome application. With this API, you can communicate directly with the Chrome app and use embedded features such as requesting an address to receive bitcoins, or send a Bitcoin transaction.

Each call to the API will trigger an UI response to the Chrome app, where the user will be able to validate the request.

Demonstration

A very simple demonstration of the API calls is available here
https://www.ledgerwallet.com/api/demo.html

Usage

First, you need to insert the ledger.js file in your page:

<head>
  <script src="ledger.js"></script>
</head>

Initialization of the Ledger object is as follow:

function callback(event) {
  console.log(event.response);
};
Ledger.init({ callback: callback });

This will create an invisible iframe on the ledgerwallet.com domain, acting as a proxy between your web page and the Ledger Chrome app. Each time you request an API call, a message will be sent to the Chrome app and the response will be sent to the callback function.

All calls are asynchronous, and you are not garanteed to get a callback (for instance, if the user kills the Chrome app). If you are using a button to trigger a call, it is recommended to disable the action button for a few seconds using for instance setTimeout(enableButtonFunction, 4000).

API calls

  1. isAppAvailable()
  2. launchApp()
  3. hasSession()
  4. getAccounts()
  5. getOperations(account_id)
  6. getNewAddresses(account_id, count)
  7. sendPayment(address, amount, data)
  8. getXPubKey(path)
  9. signP2SH(inputs, scripts, outputs_number, outputs_script, paths)
  10. bitid(uri, silent)

===

Ledger.isAppAvailable()

Check if the Ledger Chrome app is installed.

function callback(event) {
  if (!event) {
    console.log("Chrome app not available");
  } else {
    response = event.response;
    if (response.command == "ping") {
      console.log("Chrome app is available.");
    }
  }
};
Ledger.init({ callback: callback });
Ledger.isAppAvailable();

If the Ledger Chrome app is not available, the returned event will be undefined. If it is available it will return the following event.response:

{  
   "command":"ping",
   "result":true
}

All following API calls will return undefined if the Ledger Chrome app is not installed. In the next examples, it is taken for granted that the Chrome app is installed, and therefore we are not checking the existence of event.response.

===

Ledger.launchApp()

Launch the Ledger Chrome application.

function callback(event) {
  response = event.response;
  if (response.command == "launch") {
    console.log("Chrome app has been launched.");
  }
};
Ledger.init({ callback: callback });
Ledger.launchApp();

It will always return the following response after having launched the app:

{  
   "command":"launch",
   "result":true
}

You usually don't have to use this call, as it will be used by other calls automatically.

===

Ledger.hasSession()

Check if the wallet is initialized and ready (Nano has been inserted, correct PIN entered, and wallet synchronized).

function callback(event) {
  response = event.response;
  if (response.command == "has_session") {
    if (response.result) {
      console.log("Wallet is ready");
    } else {
      console.log("Wallet is NOT ready");
    }
  }
};
Ledger.init({ callback: callback });
Ledger.hasSession();

If session is ready:

{  
   "command":"has_session",
   "result":true
}

If session is not ready:

{  
   "command":"has_session",
   "result":false
}

You normally don't need to use this call. All following API calls require the wallet to be ready. They will therefore automatically check that app has been launched and wait for the session to be ready by pooling the hasSession() call.

===

Ledger.getAccounts()

Request export of your list of accounts (one account is a HD wallet account, including packs of public addresses).

function callback(event) {
  response = event.response;
  if (response.command == "get_accounts") {
    console.log(response);
  }
};
Ledger.init({ callback: callback });
Ledger.getAccounts();

If user cancels the request:

{
   "command":"get_accounts",
   "success":false,
   "message":"Request cancelled by the user"
}

If user grants the request:

{
   "command":"get_accounts",
   "success":true,
   "accounts":[
      {
         "index":0,
         "name":"My account",
         "hidden":false,
         "color":"#FF5254",
         "wallet_id":1,
         "total_balance":0,
         "root_path":"44'/0'/0'"
      }
   ]
}

Use the value of index for account_id in getOperations.

All balances are in satoshis.

===

Ledger.getOperations(account_id)

Request export of all operations (incoming and outgoing transactions) for account account_id.

function callback(event) {
  response = event.response;
  if (response.command == "get_operations") {
    console.log(response);
  }
};
Ledger.init({ callback: callback });
Ledger.getOperations(1);

If user cancels the request:

{
   "command":"get_operations",
   "success":false,
   "message":"Request cancelled by the user"
}

If user grants the request:

{  
   "command":"get_operations",
   "success":true,
   "operations":[  
      {  
         "hash":"f5263795501685d5f10ec08a37f3caceb4e215d8632f5cfd325faaa271675cde",
         "fees":50000,
         "time":1429643779892,
         "type":"reception",
         "value":150000,
         "confirmations":333,
         "senders":[  
            "3882TpSheaxuHESqNyMW8L3BA33qirEPYt",
            "3PQhX99dAH2rowwMYfPP1KWKRbdCn55cjJ"
         ],
         "recipients":[  
            "15Tc1vFcBQJD5vCs5sZM3s5cAZewLs8sM5"
         ],
         "id":81,
         "account_id":1
      },
      { }
   ]
}

===

Ledger.getNewAddresses(account_id, count)

Request export of count new addresses for account account_id.

function callback(event) {
  response = event.response;
  if (response.command == "get_new_addresses") {
    console.log(response);
  }
};
Ledger.init({ callback: callback });
Ledger.getOperations(1,5);

If user cancels the request:

{
   "command":"get_new_addresses",
   "success":false,
   "message":"Request cancelled by the user"
}

If user grants the request:

{  
  "command":"get_new_addresses",
  "success":true,
  "addresses":{  
    "44'/0'/0'/0/36":"1633oRHv5jPwtZW2bASbS4geWKQd5ENR6F",
    "44'/0'/0'/0/37":"1rvTbWuwEuwDCWbMCgqyKTWUK69jqNXwkv",
    "44'/0'/0'/0/38":"1ewd4XZ8tbNSwGZ6e8fxNKdvFEwaQxVULn",
    "44'/0'/0'/0/39":"1cTyUnyCFfXwShaVMZmL6uMpArEUrKnanj",
    "44'/0'/0'/0/40":"185UpphCFnxowehNarFZnxp9FGFsLJsz6D"
  },
  "account_id":1
}

===

Ledger.sendPayment(address, amount, data)

Request the Chrome app to send a payment of amount BTC to address. If data is set, an additional OP_RETURN output will be added with the data (must be hexadecimal format max 80 bytes).

function callback(event) {
  response = event.response;
  if (response.command == "send_payment") {
    console.log(response);
  }
};
Ledger.init({ callback: callback });
Ledger.sendPayment('19QM7ToSsi7N9zsZRdRTLcGZVspXQjQUY5',0.001);

If user cancels the request:

{  
   "command":"send_payment",
   "success":false,
   "message":"Payment cancelled"
}

If user confirms the payment:

{
   "command":"send_payment",
   "success":true,
   "transaction":{
      "amount":100000,
      "fee":10000,
      "hash":"d4b9377db50380aef6c7ba43316ed4c4573c9969cff726a2460febc789c635dc",
      "raw":"01000000025bca73777be5366d8a92226be8da32a4657ff80a80ac5dc33d42bf43e2d63929000000006a473044022004d695816488a4ebd733a45f24fc56bda675c61be65dc4b854f182baa4693e4802206e99b1bd3b40cd06fc7bae67a8c6fcd13f0eb92f3ce02b48e39aca9dbe7e5411012102109fe1ef60221ca9296a43bd3c9306b103c1588c5e413aab39e43e73bb9ce4c5ffffffffd373960e9a2569bf62451eaabc7ddb1bc16fa4088da2a7eb4dd4f626b3f40230000000006a47304402204f6e0e5935226aa235d6a21fe7ea4933447d57668c33d44837e66f4994fe871102201e09c162ffa03af5aa292bc630ab892a60cd07f330032fdb2b1e0bc45f2969c601210234277b06506b5aa8433cf5fa2df36cc252a9b5292a1c3e58a0ce737641ba13eeffffffff02a0860100000000001976a9145c2b5c8ee43ecc2f2b1141ec6924f53fdb0d009d88ac101e3402000000001976a91414baa4000d841e6e4a19a57efa2eeebdff3ce9b788ac00000000"
   }
}

There is no need to push the raw transaction to the Bitcoin network as it has already been done by the Chrome app.

===

Ledger.getXPubKey(path)

Request the extended public key for path.

function callback(event) {
  response = event.response;
  if (response.command == "get_xpubkey") {
    console.log(response);
  }
};
Ledger.init({ callback: callback });
Ledger.getXPubKey("44'/0'/0'");

If user cancels the request:

{  
   "command":"get_xpubkey",
   "success":false,
   "message":"Export request cancelled"
}

If user confirms the export request:

{  
   "command":"get_xpubkey",
   "success":true,
   "xpubkey":"xpub6D52jcEfKA4cGeGcVC9pwG37Ju8pUMQrhptw82QVHRSAGBELE5uCee7Qq8RJUqQVyxfJfwbJKYyqyFhc2Xg8cJyN11kRvnAaWcACXP6K0zv"
}

===

Ledger.signP2SH(inputs, scripts, outputs_number, outputs_script, paths)

Request the Ledger Nano to sign a multisignature transaction.

  • inputs is an array of previous tx hash (human readable), input index (on 4 bytes, big endian encoded)
  • scripts is an array containing the redeem scripts
  • outputs_number is the number of outputs
  • outputs_script is the serialized output scripts
  • paths is an array containing the paths to the keys associated to each inputs

The example below show the expected format of the arguments.

function callback(event) {
  response = event.response;
  if (response.command == "sign_p2sh") {
    console.log(response);
  }
};
Ledger.init({ callback: callback });
var inputs = [
  [ "71f97fa2a21486ecd99674a8ae068d92acd2e9db49c199473be39984e6cbe0f6", "00000000" ],
  [ "171e6a969ff196a2cfaaba4780c292e33fc297672a065cc5c5c684727cf9e3ba", "00000001" ]
];
var scripts = [ 
  "52210289b4a3ad52a919abd2bdd6920d8a6879b1e788c38aa76f0440a6f32a9f1996d02103a3393b1439d1693b063482c04bd40142db97bdf139eedd1b51ffb7070a37eac321030b9a409a1e476b0d5d17b804fcdb81cf30f9b99c6f3ae1178206e08bc500639853ae",
  "522102afe2165371442437b86089a17e8d1c26d127e3723b19f568e9c11e326946111521032d139518b16c112d5f1a52157f1468c0b7a570c41673debee8cd2e53eb084df12103b13fe78b0320ceb77795c87ed72069f12edf64169d15f8f9827f0bb4fdbe760f53ae"
];    
var paths = [
  "44'/0'/0'/0/0/0/1",
  "44'/0'/0'/0/0/0/2",
];
var outputs_number = 2
var outputs_script = "40420f00000000001976a91496986c2703c6b311c884bf916d28621bc61e8b7a88acdc0c03000000000017a914ddf0a9f3e0c9822feef702d36dee6c0bd2bf7c6d87"
Ledger.signP2SH(inputs, scripts, outputs_number, outputs_script, paths);

If user cancels the signature request:

{  
   "command":"p2sh",
   "success":false,
   "message":"Signature request declined"
}

If user confirms the signature request:

{  
   "command":"sign_p2sh",
   "success":true,
   "signatures":[  
      "3044022012affaf1b44b4bd365a6ab45f0911ea0825cd621a3adef135f5877af013628ae0220745c106a9823e0b3fdcede7129605420213491b32b40abf2b9934a33614d296301",
      "304502210087f7c10e1f3390558e25dd2ed6c6d4cf6e0f86b2cdd065136b5ed4e3c3c36a3202200ce27357a2b36f7b3b102eeb4eb5b4937c5a84ecc4337f25c46e3704667a930a01"
   ]
}

Nothing is broadcasted on the Bitcoin network.

As it is a P2SH signature, the Ledger Nano won't ask for a second factor confirmation.

===

Ledger.bitid(uri, silent)

Request a BitID login to uri. If silent is true then the Chrome app will not post the signature to the host (you'll have to do it yourself in your JS app).

function callback(event) {
  response = event.response;
  if (response.command == "bitid") {
    console.log(response);
  }
};
Ledger.init({ callback: callback });
Ledger.bitid('bitid://bitid.bitcoin.blue/callback?x=5f38d0fb45b25015&u=1');

If user cancels the authentication request:

{  
   "command":"bitid",
   "success":false,
   "message":"Authentication cancelled"
}

If user confirms the authentication request:

{  
   "command":"bitid",
   "success":true,
   "address":"1M7gUz4NRLBty5WUuNQPNNG5GE2x5t6Wbp",
   "signature":"H5/DFfbXP6tX9bNn/74l/HGC7jhInL5cKCFtLLUQ4nt6C1dB6hepuAlHSI5tG2TsLG6p6ox1qk1EUiMnFikDrEg=",
   "uri":"bitid://bitid.bitcoin.blue/callback?x=5f38d0fb45b25015&u=1"
}

Roadmap

If you would like to see other API calls for your specific needs, please open an issue with a description of what you would like and we'll discuss adding this functionality on our roadmap.

ledger-wallet-api's People

Contributors

ericlarch avatar lastcanal avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ledger-wallet-api's Issues

another bitcoin fork each day.....does this leave existing keys insecure?

so in a few days there will be a new fork - bitcoin diamond following off the heels of bitcoin gold
https://coinsutra.com/bitcoin-gold-ledger-wallet/

there's apps galore - but small question is - should we blow away existing keys and move crypto out of wallets for safe keeping?

here's a following sceneario
user is told to claim coins

  • user signs into nano
  • there's an official app

https://businessdigit.com/the-bitcoin-gold-wallet-scam-sees-the-fraudsters-steal-3-2-million

"It is worth reminding everyone that it will never really be safe to enter your private key or mnemonic phrase for a pre-existing wallet on an online website. When you want to sweep out new coins from a pre-fork wallet address, the best practices are the same as for the other ranges: first send your old coins to a new wallet before you start. exposing the private keys of the original wallet Following this basic rule of private key management greatly reduces your risk of theft. "

I imagine that a bad fork could steal keys / is there some protection with ledger?
I signed into nano ledger app on-> btg - but there was nothing there.

now I'm worried somehow my private keys leaked to them?
is that possible?

Missing HASH in sendPayment() Response

Seems like this API will not respond back with the transaction id/hash even though documentation has a "hash". Because of the missing hash, I have to then encode the raw payload into a TX id. Has anyone else had this issue?

Expected Response (includes hash)

{
   "command":"send_payment",
   "success":true,
   "transaction":{
      "amount":100000,
      "fee":10000,
      "hash":"d4b9377db50380aef6c7ba43316ed4c4573c9969cff726a2460febc789c635dc",
      "raw":"01000000025bca73777be5366d8a92226be8da32a4657ff80a80ac5dc33d42bf43e2d63929000000006a473044022004d695816488a4ebd733a45f24fc56bda675c61be65dc4b854f182baa4693e4802206e99b1bd3b40cd06fc7bae67a8c6fcd13f0eb92f3ce02b48e39aca9dbe7e5411012102109fe1ef60221ca9296a43bd3c9306b103c1588c5e413aab39e43e73bb9ce4c5ffffffffd373960e9a2569bf62451eaabc7ddb1bc16fa4088da2a7eb4dd4f626b3f40230000000006a47304402204f6e0e5935226aa235d6a21fe7ea4933447d57668c33d44837e66f4994fe871102201e09c162ffa03af5aa292bc630ab892a60cd07f330032fdb2b1e0bc45f2969c601210234277b06506b5aa8433cf5fa2df36cc252a9b5292a1c3e58a0ce737641ba13eeffffffff02a0860100000000001976a9145c2b5c8ee43ecc2f2b1141ec6924f53fdb0d009d88ac101e3402000000001976a91414baa4000d841e6e4a19a57efa2eeebdff3ce9b788ac00000000"
   }
}

Actual Response

{
   "command":"send_payment",
   "success":true,
   "transaction":{
      "amount":100000,
      "fee":10000,
      "raw":"01000000025bca73777be5366d8a92226be8da32a4657ff80a80ac5dc33d42bf43e2d63929000000006a473044022004d695816488a4ebd733a45f24fc56bda675c61be65dc4b854f182baa4693e4802206e99b1bd3b40cd06fc7bae67a8c6fcd13f0eb92f3ce02b48e39aca9dbe7e5411012102109fe1ef60221ca9296a43bd3c9306b103c1588c5e413aab39e43e73bb9ce4c5ffffffffd373960e9a2569bf62451eaabc7ddb1bc16fa4088da2a7eb4dd4f626b3f40230000000006a47304402204f6e0e5935226aa235d6a21fe7ea4933447d57668c33d44837e66f4994fe871102201e09c162ffa03af5aa292bc630ab892a60cd07f330032fdb2b1e0bc45f2969c601210234277b06506b5aa8433cf5fa2df36cc252a9b5292a1c3e58a0ce737641ba13eeffffffff02a0860100000000001976a9145c2b5c8ee43ecc2f2b1141ec6924f53fdb0d009d88ac101e3402000000001976a91414baa4000d841e6e4a19a57efa2eeebdff3ce9b788ac00000000"
   }
}

Ledger.getAddress(path)

Please add a function in the Ledger Chrome app that allows for the following API call:

Ledger.getAddress(path)

Request the address for a specific path.

function callback(event) {
  response = event.response;
  if (response.command == "get_address") {
    console.log(response);
  }
};
Ledger.init({ callback: callback });
Ledger.getAddress("44'/0'/0'/0/0");

If the user cancels the request:

{  
   "command":"get_address",
   "success":false,
   "message":"Export request cancelled"
}

If the user confirms the export request:

{  
   "command":"get_address",
   "success":true,

   "address":"15Tc1vFcBQJD5vCs5sZM3s5cAZewLs8sM5"
}

BCH support

Hi! Copay dev here. We are trying to sign a P2SH BCH transaction. It's already supported by the API ? We can't find the way to do it.
Any documentation about this will be really helpful. Thanks !

xpubkey - segwit

Hi!

I have problem with my ledger nano s ...
I generate xpubkey with api on my segwit accaunt, but on prestashop module it cant get any information out ...
i try also in this site: https://goochain.net/ledger
the same problem :(

So xpubkey not working on segwit accaunt >?

BR
Raitis

Sendmany json object

It would be great to be able to create transactions using send many object the same way it's done in bitcoind and blockchain.info api.

Missing values from getOperations(account_id) response

The documentation states that the getOperations(account_id) includes the hash and fees in the response.

The response from the api does not include these values.
Sample response:
{"command":"get_operations","success":true,"operations":[{"type":"sending","value":"10000000","senders":["exampleaddress"],"time":sampletime,"recipients":["exampleaddress"],"account_id":0,"transaction_id":43}]}

There currently is not a way to export transactions with fees for tracking cost basis in a tool like CoinTracking.

Ledger.signP2PKH

I'm interested in using my Ledger as a keychain for signing raw txs, but theses txs are not multisig.

Send Payment without data doesn't work

When I call
{ command: "send_payment", address: recipientAddress, amount: amount }

the ledger wallet app opens, but it has a field in the form called Data (OP_RETURN) with a value of undefined. And the send payment is unable to complete. I've tried to provide various data values to make it happy, but I can't get it to work.

This is with LiteCoin, by the way.

Hoping to get this resolved as I'd really love for the app to integrate with Ledger Wallet.

API doesn't recognize ledger on Linux

I've tried to use this API, but there's no any response from the ledger. Chrome Apps for the ledger works fine for me, I've done all steps needed for Linux to recognize the device. But API doesn't work at all. Is there a way to solve this?

Would be very usefull to have a sign transaction method and select net

Hello!

I'm a full stack developer working for https://gnosis.pm/
I'm playing around with the Ledger Nano S and find it lacks of two useful functions for ETH:

  1. Select network/Node to use for submitting the transactions or at least disable the function to publish to the network. In order to publish it with https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsendrawtransaction
  2. Sign single hash message. https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsign We use this functionality to sign transactions and messages offline and offChain

Thanks

No documentation for signMessage

I assume signMessage uses ECDSA to sign messages on the ledger and is compatible with Ethereum's native ecrecover, but a technical drill down would be good.

Support for Ledger Wallet Ethereum

Curious as the name of this repo suggests that it supports all ledger-wallets (although it becomes more obvious when using the demo that it's only for the ledger-wallet-bitcoin). Is there any plan to expand the support beyond bitcoin?

How to get Address For other supported Cryptocurrecies on Ledger

Hello,

We are a exchange software development company working on our client required who has requested to add Ledger wallet as hot wallet on his exchange.

We have been through the HD API provided and successfull able to get Bitcoin Address from the ledger device. At the moment we are stuck to get knowledge on how to find the deposit address for other available crypto currencies on ledger using the same API or any other available.

It will be really good if you could provide us with the knowledge for the same.

Support signing a coinjoin transaction

I'm trying to build a few bip79 (bustapay :: sender/receiver coinjoin) utilities, and would like to build one for ledger using the web api (so it's easy to people to use).

The first nice-to-have I'm missing would be something like the sendPayment except in which it doesn't broadcast to the network. Not super essential though, as with the xpub I can derive the unspent list and then do coin selection myself.

However, I do need a function to sign a transaction. I need both the case when I want to sign all inputs, and the case when I want to only sign a subset of them.

The trezor web-api actually makes this really easy but unfortunately the trezor firmware itself doesn't support coinjoins :( while it appears that ledger is in the reverse situation.

Can I sign a transaction like this?

Hi I represent the counterparty community and we are looking for a hardware wallet that will allow us to store your counterparty tokens, and also spend them

I am thinking if I send my counterparty tokens to a ledger address and make a note of the path of the address, I should be able to make a transaction that spends them and have the ledger sign it

here is an example transaction to be signed, seems like I can sign the inputs and outputs using
Ledger.signP2SH(inputs, scripts, outputs_number, outputs_script, paths)

before I purchase a ledger to try this, am I correct in my thinking? after all counterparty txs are just bitcoin transactions

{
"lock_time":0,
"size":381,
"inputs":[
{
"prev_out":{
"index":0,
"hash":"459eee043d30b29c4f9e9b3b55af78f5b4fe4bd818bee49a4b75becd6422ae14"
},
"script":"76a91458b6e991b45487df810f4d96d5315da739637f1788ac"
},
{
"prev_out":{
"index":0,
"hash":"621c6b92cc2c68b18fef3a90a3284d1263ea43e0cbce21d9ef6f51747bd215ec"
},
"script":"76a91458b6e991b45487df810f4d96d5315da739637f1788ac"
},
{
"prev_out":{
"index":0,
"hash":"92a271c568aea34c3e2661db9b8fc7f0d82d90065db1b6eed1c124146ef77898"
},
"script":"76a91458b6e991b45487df810f4d96d5315da739637f1788ac"
},
{
"prev_out":{
"index":0,
"hash":"99c43b144adb6d114180c11f26bc08264c806b355d96a824891ab0831c7facfd"
},
"script":"76a91458b6e991b45487df810f4d96d5315da739637f1788ac"
}
],
"version":1,
"vin_sz":4,
"hash":"6c521937d8fa889d71609ebed2e23b694cbca89778c8b8d967167e5a4c9d5b78",
"vout_sz":3,
"out":[
{
"script_string":"OP_DUP OP_HASH160 1485d9d03b41aaa9dca7d70d7f63ff4a0826100e OP_EQUALVERIFY OP_CHECKSIG",
"address":"12sWrxRY7E7Nhmuyjbz4TtGE9jRewGqEZD",
"value":5430,
"script":"76a9141485d9d03b41aaa9dca7d70d7f63ff4a0826100e88ac"
},
{
"script_string":"OP_RETURN 246698efc5d81b78ceadf3179316b5eb6cc5c2c347c0b7b42121a94e",
"value":0,
"script":"6a1c246698efc5d81b78ceadf3179316b5eb6cc5c2c347c0b7b42121a94e"
},
{
"script_string":"OP_DUP OP_HASH160 58b6e991b45487df810f4d96d5315da739637f17 OP_EQUALVERIFY OP_CHECKSIG",
"address":"1965areciqapsuL2hsia2yKkRLfAsH1smG",
"value":6290,
"script":"76a91458b6e991b45487df810f4d96d5315da739637f1788ac"
}
]
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.