Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for CAP 0027 (MuxedAccounts) #325

Merged
merged 3 commits into from
Apr 15, 2020
Merged

Add support for CAP 0027 (MuxedAccounts) #325

merged 3 commits into from
Apr 15, 2020

Conversation

abuiles
Copy link
Contributor

@abuiles abuiles commented Apr 14, 2020

What

Add support for CAP0027.

Why

Protocol 13 introduces multiplexed accounts, replacing some fields with the union xdr.MuxedAccount where xdr.PublicKey was previously used.

This pull requests:

  • Extends Keypair with a new method .xdrMuxedAccount which creates a new MuxedAccount using the ed25519 discriminant.
  • Updates all the operations which changed their attribute from PublicKey to MuxedAccount.

Fixes #324

Breaking changes

This update doesn't include breaking changes for users of this library. However, if you are relying on XDRs, you'll get now a MuxedAccount where a PublicKey was returned.

As long as you are not checking for the instance type, your code should continue to work since both MuxedAccount and PublicKey have the discriminant ed25519 which returns the same data type.

What is not implemented in this pull request

  • SEP0023 support - I'll handle that in a different PR.
  • Passing an envelope to new Transaction(envelope) which contains MuxedAccounts with the med25519 discriminant, won't work. For now, we expect an envelope to contain muxed accounts with the ed25519 discriminant. I'll update this code to be able to read the med25519 discriminant in the same PR where I'll add SEP0023 support.

@abuiles abuiles changed the title CAP 0027 Add support for CAP 0027 (MuxedAccounts) Apr 14, 2020
@abuiles abuiles marked this pull request as ready for review April 15, 2020 00:04
describe('Keypair.contructor', function() {
it("fails when passes secret key does not match public key", function() {
let secret = "SD7X7LEHBNMUIKQGKPARG5TDJNBHKC346OUARHGZL5ITC6IJPXHILY36";
it('fails when passes secret key does not match public key', function() {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh, this is replaced automatically by some linter on this repo -- ignore this changes


describe('Keypair.xdrMuxedAccount', function() {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is the new tests

abuiles added a commit that referenced this pull request Apr 27, 2020
This version brings protocol 13 support with backwards compatibility support for protocol 12.

### Add
- Add `TransactionBuilder.buildFeeBumpTransaction` which makes it easy to create `FeeBumpTransaction` ([#321](#321)).
- Adds a feature flag which allow consumers of this library to create V1 (protocol 13) transactions using the `TransactionBuilder` ([#321](#321)).
- Add support for [CAP0027](https://github.com/stellar/stellar-protocol/blob/master/core/cap-0027.md): First-class multiplexed accounts ([#325](#325)).
- Add `Keypair.xdrMuxedAccount` which creates a new `xdr.MuxedAccount`([#325](#325)).
- Add `FeeBumpTransaction` which makes it easy to work with fee bump transactions ([#328](#328)).
- Add `TransactionBuilder.fromXDR` which receives an xdr envelope and return a `Transaction` or `FeeBumpTransaction` ([#328](#328)).

### Update
- Update XDR definitions with protocol 13 ([#317](#317)).
- Extend `Transaction` to work with `TransactionV1Envelope` and `TransactionV0Envelope` ([#317](#317)).
- Add backward compatibility support for [CAP0018](https://github.com/stellar/stellar-protocol/blob/f01c9354aaab1e8ca97a25cf888829749cadf36a/core/cap-0018.md) ([#317](#317)).
- Update operations builder to support multiplexed accounts ([#337](#337)).

  This allows you to specify an `M` account as the destination or source:
  ```
  var destination = 'MAAAAAAAAAAAAAB7BQ2L7E5NBWMXDUCMZSIPOBKRDSBYVLMXGSSKF6YNPIB7Y77ITLVL6';
  var amount = '1000.0000000';
  var asset = new StellarBase.Asset(
    'USDUSD',
    'GDGU5OAPHNPU5UCLE5RDJHG7PXZFQYWKCFOEXSXNMR6KRQRI5T6XXCD7'
  );
  var source =
    'MAAAAAAAAAAAAAB7BQ2L7E5NBWMXDUCMZSIPOBKRDSBYVLMXGSSKF6YNPIB7Y77ITLVL6';
  StellarBase.Operation.payment({
    destination,
    asset,
    amount,
    source
  });
  ```

  **To use multiplexed accounts you need an instance of Stellar running on Protocol 13 or higher**

### Breaking changes

- `Transaction.toEnvelope()` returns a protocol 13 `xdr.TransactionEnvelope` which is an `xdr.Union` ([#317](#317)).
  If you have code that looks like this `transaction.toEnvelope().tx` you have two options:
    - You can grab the value wrapped by the union, calling `value()` like `transaction.toEnvelope().value().tx`.
    - You can check which is the discriminant by using `switch()` and then call `v0()`, `v1()`, or `feeBump()`.
- The return value from `Transaction.fee` changed from `number` to `string`. This brings support for `Int64` values ([#321](#321)).
- The const `BASE_FEE` changed from `number` to `string` ([#321](#321)).
- The option `fee` passed to  `new TransactionBuilder({fee: ..})` changed from `number` to `string` ([#321](#321)).
- The following fields, which were previously an `xdr.AccountID` are now a  `xdr.MuxedAccount` ([#325](#325)):
  - `PaymentOp.destination`
  - `PathPaymentStrictReceiveOp.destination`
  - `PathPaymentStrictSendOp.destination`
  - `Operation.sourceAccount`
  - `Operation.destination` (for `ACCOUNT_MERGE`)
  - `Transaction.sourceAccount`
  - `FeeBumpTransaction.feeSource`

  You can get the string representation by calling `StrKey.encodeMuxedAccount` which will return a `G..` or `M..` account.
- Remove the following deprecated functions ([#331](#331)):
  - `Operation.manageOffer`
  - `Operation.createPassiveOffer`
  - `Operation.pathPayment`
  - `Keypair.fromBase58Seed`
- Remove the `Network` class ([#331](#331)).
- Remove `vendor/base58.js` ([#331](#331)).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants