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

Prepare release w/ support for stable Protocol 20 and RPC. #167

Merged
merged 12 commits into from
Dec 6, 2023
4 changes: 2 additions & 2 deletions .github/workflows/gh_pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ jobs:
ref: master
path: js-stellar-base

- name: Install Node 16
- name: Install Node 18
uses: actions/setup-node@v2
with:
node-version: 16
node-version: '18.x'

- name: Install Dependencies
run: yarn install
Expand Down
9 changes: 7 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
# Changelog

- Forked from [stellar/js-stellar-sdk](https://github.com/stellar/js-stellar-sdk).
**This repository has been deprecated** in favor of the [`stellar-sdk`](https://github.com/stellar/js-stellar-sdk) package. Please read the [migration guide](https://gist.github.com/Shaptic/5ce4f16d9cce7118f391fbde398c2f30) for how to upgrade to that package. Future changes will only be made there.

A breaking change should be clearly marked in this log.

## v1.0.0

### Breaking Changes
* See the new deprecation warning at the top of this document and in the [README](./README.md).
* XDR has been upgraded to the latest `stellar-base` release, supporting the current stable XDR for Protocol 20 ([#167](https://github.com/stellar/js-soroban-client/pull/167)).


## Unreleased
Expand Down
14 changes: 10 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,21 @@
<a href="https://coveralls.io/github/stellar/js-soroban-client?branch=master"><img alt="Coverage Status" src="https://coveralls.io/repos/stellar/js-soroban-client/badge.svg?branch=master&service=github" /></a>
</p>

js-soroban-client is a Javascript library for communicating with a
[Soroban RPC server](https://github.com/stellar/go/tree/master/exp/services/soroban-rpc).
It is used for building Stellar apps either on Node.js or in the browser.
# Deprecation Notice

It provides:
**This repository has been deprecated** in favor of the [`stellar-sdk`](https://github.com/stellar/js-stellar-sdk) package. Please read the [migration guide](https://gist.github.com/Shaptic/5ce4f16d9cce7118f391fbde398c2f30) for how to upgrade to that package. Future changes will only be made there.

----------

js-soroban-client is a JavaScript library for communicating with a
[Soroban RPC server](https://soroban.stellar.org/api) and building Stellar apps. It provides:
- a networking layer API for soroban-rpc methods.
- facilities for building and signing transactions, for communicating with a
soroban-rpc instance, and for submitting transactions or querying network
state.

<details>

### soroban-client vs stellar-base

soroban-client is a high-level library that serves as client-side API for Horizon.
Expand Down Expand Up @@ -214,3 +218,5 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md) for the detailed release process. Once
js-soroban-client is licensed under an Apache-2.0 license. See the
[LICENSE](https://github.com/stellar/js-soroban-client/blob/master/LICENSE) file
for details.

</details>
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "soroban-client",
"version": "1.0.0-beta.4",
"version": "1.0.0",
"description": "A library for working with Stellar's Soroban RPC servers.",
"author": "Stellar Development Foundation <[email protected]>",
"homepage": "https://github.com/stellar/js-soroban-client",
Expand Down Expand Up @@ -84,7 +84,7 @@
"@babel/preset-env": "^7.23.2",
"@babel/preset-typescript": "^7.23.2",
"@babel/register": "^7.22.15",
"@definitelytyped/dtslint": "^0.0.189",
"@definitelytyped/dtslint": "^0.0.197",
"@istanbuljs/nyc-config-babel": "3.0.0",
"@stellar/tsconfig": "^1.0.2",
"@types/chai": "^4.3.9",
Expand Down Expand Up @@ -119,7 +119,7 @@
"karma-mocha": "^2.0.0",
"karma-sinon-chai": "^2.0.2",
"karma-webpack": "^5.0.0",
"lint-staged": "^14.0.1",
"lint-staged": "^15.1.0",
"minami": "^1.1.1",
"mocha": "^10.2.0",
"node-polyfill-webpack-plugin": "^2.0.1",
Expand All @@ -139,7 +139,7 @@
"axios": "^1.6.0",
"bignumber.js": "^9.1.1",
"buffer": "^6.0.3",
"stellar-base": "v10.0.0-beta.4",
"stellar-base": "git+https://github.com/stellar/js-stellar-base#af1b94a",
"urijs": "^1.19.1"
}
}
6 changes: 4 additions & 2 deletions src/parsers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export function parseRawEvents(
contractId: new Contract(evt.contractId)
}),
topic: evt.topic.map((topic) => xdr.ScVal.fromXDR(topic, 'base64')),
value: xdr.ScVal.fromXDR(evt.value.xdr, 'base64')
value: xdr.ScVal.fromXDR(evt.value, 'base64')
};
})
};
Expand All @@ -55,7 +55,9 @@ export function parseRawLedgerEntries(
lastModifiedLedgerSeq: rawEntry.lastModifiedLedgerSeq,
key: xdr.LedgerKey.fromXDR(rawEntry.key, 'base64'),
val: xdr.LedgerEntryData.fromXDR(rawEntry.xdr, 'base64'),
expirationLedgerSeq: rawEntry.expirationLedgerSeq
...(rawEntry.liveUntilLedgerSeq !== undefined && {
liveUntilLedgerSeq: rawEntry.liveUntilLedgerSeq
})
};
})
};
Expand Down
98 changes: 10 additions & 88 deletions src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ import {
FeeBumpTransaction,
Keypair,
Transaction,
xdr,
hash
xdr
} from 'stellar-base';

import AxiosClient from './axios';
Expand Down Expand Up @@ -171,7 +170,7 @@ export class Server {
* const key = xdr.ScVal.scvSymbol("counter");
* server.getContractData(contractId, key, Durability.Temporary).then(data => {
* console.log("value:", data.val);
* console.log("expirationLedgerSeq:", data.expirationLedgerSeq);
* console.log("liveUntilLedgerSeq:", data.liveUntilLedgerSeq);
* console.log("lastModified:", data.lastModifiedLedgerSeq);
* console.log("latestLedger:", data.latestLedger);
* });
Expand Down Expand Up @@ -261,7 +260,7 @@ export class Server {
* const ledgerData = response.entries[0];
* console.log("key:", ledgerData.key);
* console.log("value:", ledgerData.val);
* console.log("expirationLedgerSeq:", ledgerData.expirationLedgerSeq);
* console.log("liveUntilLedgerSeq:", ledgerData.liveUntilLedgerSeq);
* console.log("lastModified:", ledgerData.lastModifiedLedgerSeq);
* console.log("latestLedger:", response.latestLedger);
* });
Expand All @@ -273,15 +272,11 @@ export class Server {
}

public async _getLedgerEntries(...keys: xdr.LedgerKey[]) {
return jsonrpc
.post<SorobanRpc.RawGetLedgerEntriesResponse>(
this.serverURL.toString(),
'getLedgerEntries',
expandRequestIncludeExpirationLedgers(keys).map((k) =>
k.toXDR('base64')
)
)
.then((response) => mergeResponseExpirationLedgers(response, keys));
return jsonrpc.post<SorobanRpc.RawGetLedgerEntriesResponse>(
this.serverURL.toString(),
'getLedgerEntries',
keys.map((k) => k.toXDR('base64'))
);
}

/**
Expand Down Expand Up @@ -455,7 +450,7 @@ export class Server {
*
* @param {Transaction | FeeBumpTransaction} transaction the transaction to
* simulate, which should include exactly one operation (one of
* {@link xdr.InvokeHostFunctionOp}, {@link xdr.BumpFootprintExpirationOp},
* {@link xdr.InvokeHostFunctionOp}, {@link xdr.ExtendFootprintTTLOp},
* or {@link xdr.RestoreFootprintOp}). Any provided footprint or auth
* information will be ignored.
*
Expand Down Expand Up @@ -526,7 +521,7 @@ export class Server {
*
* @param {Transaction | FeeBumpTransaction} transaction the transaction to
* prepare. It should include exactly one operation, which must be one of
* {@link xdr.InvokeHostFunctionOp}, {@link xdr.BumpFootprintExpirationOp},
* {@link xdr.InvokeHostFunctionOp}, {@link xdr.ExtendFootprintTTLOp},
* or {@link xdr.RestoreFootprintOp}.
*
* Any provided footprint will be overwritten. However, if your operation
Expand Down Expand Up @@ -752,76 +747,3 @@ function findCreatedAccountSequenceInTransactionMeta(

throw new Error('No account created in transaction');
}

// TODO - remove once rpc updated to
// append expiration entry per data LK requested onto server-side response
// https://github.com/stellar/soroban-tools/issues/1010
function mergeResponseExpirationLedgers(
ledgerEntriesResponse: SorobanRpc.RawGetLedgerEntriesResponse,
requestedKeys: xdr.LedgerKey[]
): SorobanRpc.RawGetLedgerEntriesResponse {
const requestedKeyXdrs = new Set<String>(
requestedKeys.map((requestedKey) => requestedKey.toXDR('base64'))
);
const expirationKeyToRawEntryResult = new Map<
String,
SorobanRpc.RawLedgerEntryResult
>();
(ledgerEntriesResponse.entries ?? []).forEach((rawEntryResult) => {
if (!rawEntryResult.key || !rawEntryResult.xdr) {
throw new TypeError(
`invalid ledger entry: ${JSON.stringify(rawEntryResult)}`
);
}
const parsedKey = xdr.LedgerKey.fromXDR(rawEntryResult.key, 'base64');
const isExpirationMeta =
parsedKey.switch().value === xdr.LedgerEntryType.expiration().value &&
!requestedKeyXdrs.has(rawEntryResult.key);
const keyHash = isExpirationMeta
? parsedKey.expiration().keyHash().toString()
: hash(parsedKey.toXDR()).toString();

const rawEntry =
expirationKeyToRawEntryResult.get(keyHash) ?? rawEntryResult;

if (isExpirationMeta) {
const expirationLedgerSeq = xdr.LedgerEntryData.fromXDR(
rawEntryResult.xdr,
'base64'
)
.expiration()
.expirationLedgerSeq();
expirationKeyToRawEntryResult.set(keyHash, {
...rawEntry,
expirationLedgerSeq
});
} else {
expirationKeyToRawEntryResult.set(keyHash, {
...rawEntry,
...rawEntryResult
});
}
});

ledgerEntriesResponse.entries = [...expirationKeyToRawEntryResult.values()];
return ledgerEntriesResponse;
}

// TODO - remove once rpc updated to
// include expiration entry on responses for any data LK's requested
// https://github.com/stellar/soroban-tools/issues/1010
function expandRequestIncludeExpirationLedgers(
keys: xdr.LedgerKey[]
): xdr.LedgerKey[] {
return keys.concat(
keys
.filter(
(key) => key.switch().value !== xdr.LedgerEntryType.expiration().value
)
.map((key) =>
xdr.LedgerKey.expiration(
new xdr.LedgerKeyExpiration({ keyHash: hash(key.toXDR()) })
)
)
);
}
Loading