├── .circleci ├── config.yml └── release │ ├── build_musl_binary.sh │ ├── get_crate_name.sh │ ├── get_docker_image_tag.sh │ ├── github_release.sh │ └── github_tag.sh ├── .dockerignore ├── .github ├── config.yml └── workflows │ ├── ci.yml │ ├── commits.yml │ └── docker.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── crates ├── ilp-cli │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── interpreter.rs │ │ ├── main.rs │ │ └── parser.rs ├── ilp-node │ ├── Cargo.toml │ ├── README.md │ ├── benches │ │ ├── multiple_payments.rs │ │ ├── redis_helpers.rs │ │ └── test_helpers.rs │ ├── build.rs │ ├── src │ │ ├── instrumentation │ │ │ ├── google_pubsub.rs │ │ │ ├── metrics.rs │ │ │ ├── mod.rs │ │ │ ├── prometheus.rs │ │ │ └── trace.rs │ │ ├── lib.rs │ │ ├── main.rs │ │ ├── node.rs │ │ └── redis_store.rs │ └── tests │ │ └── redis │ │ ├── btp.rs │ │ ├── exchange_rates.rs │ │ ├── payments_incoming.rs │ │ ├── prometheus.rs │ │ ├── redis_helpers.rs │ │ ├── redis_tests.rs │ │ ├── test_helpers.rs │ │ ├── three_nodes.rs │ │ └── time_based_settlement.rs ├── interledger-api │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── lib.rs │ │ └── routes │ │ ├── accounts.rs │ │ ├── mod.rs │ │ ├── node_settings.rs │ │ └── test_helpers.rs ├── interledger-btp │ ├── Cargo.toml │ ├── README.md │ ├── fuzz │ │ ├── .gitignore │ │ ├── Cargo.toml │ │ └── fuzz_targets │ │ │ └── fuzz_target_1.rs │ └── src │ │ ├── client.rs │ │ ├── errors.rs │ │ ├── lib.rs │ │ ├── packet.rs │ │ ├── server.rs │ │ ├── service.rs │ │ └── wrapped_ws.rs ├── interledger-ccp │ ├── Cargo.toml │ ├── README.md │ ├── fuzz │ │ ├── .gitignore │ │ ├── Cargo.toml │ │ └── fuzz_targets │ │ │ ├── fuzz_target_1.rs │ │ │ └── fuzz_target_2.rs │ └── src │ │ ├── fixtures.rs │ │ ├── lib.rs │ │ ├── packet.rs │ │ ├── routing_table.rs │ │ ├── server.rs │ │ └── test_helpers.rs ├── interledger-errors │ ├── Cargo.toml │ └── src │ │ ├── account_store_error.rs │ │ ├── address_store_error.rs │ │ ├── balance_store_error.rs │ │ ├── btp_store_error.rs │ │ ├── ccprouting_store_error.rs │ │ ├── create_account_error.rs │ │ ├── error │ │ ├── error_types.rs │ │ └── mod.rs │ │ ├── exchange_rate_store_error.rs │ │ ├── http_store_error.rs │ │ ├── lib.rs │ │ ├── node_store_error.rs │ │ └── settlement_errors.rs ├── interledger-http │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── client.rs │ │ ├── lib.rs │ │ └── server.rs ├── interledger-ildcp │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── client.rs │ │ ├── lib.rs │ │ ├── packet.rs │ │ └── server.rs ├── interledger-packet │ ├── Cargo.toml │ ├── README.md │ ├── benches │ │ └── packets.rs │ ├── fuzz │ │ ├── .gitignore │ │ ├── Cargo.toml │ │ ├── README.md │ │ └── fuzz_targets │ │ │ ├── address.rs │ │ │ └── packet.rs │ └── src │ │ ├── address.rs │ │ ├── error.rs │ │ ├── errors.rs │ │ ├── fixtures.rs │ │ ├── hex.rs │ │ ├── lib.rs │ │ ├── oer.rs │ │ └── packet.rs ├── interledger-rates │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── coincap.rs │ │ ├── cryptocompare.rs │ │ └── lib.rs ├── interledger-router │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── lib.rs │ │ └── router.rs ├── interledger-service-util │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── balance_service.rs │ │ ├── echo_service.rs │ │ ├── exchange_rates_service.rs │ │ ├── expiry_shortener_service.rs │ │ ├── lib.rs │ │ ├── max_packet_amount_service.rs │ │ ├── rate_limit_service.rs │ │ └── validator_service.rs ├── interledger-service │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── lib.rs │ │ ├── trace.rs │ │ └── username.rs ├── interledger-settlement │ ├── Cargo.toml │ └── src │ │ ├── api │ │ ├── fixtures.rs │ │ ├── message_service.rs │ │ ├── mod.rs │ │ ├── node_api.rs │ │ └── test_helpers.rs │ │ ├── core │ │ ├── backends_common │ │ │ ├── mod.rs │ │ │ └── redis │ │ │ │ ├── mod.rs │ │ │ │ └── test_helpers │ │ │ │ ├── mod.rs │ │ │ │ ├── redis_helpers.rs │ │ │ │ └── store_helpers.rs │ │ ├── engines_api.rs │ │ ├── idempotency.rs │ │ ├── mod.rs │ │ ├── settlement_client.rs │ │ └── types.rs │ │ └── lib.rs ├── interledger-spsp │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── client.rs │ │ ├── lib.rs │ │ └── server.rs ├── interledger-store │ ├── Cargo.toml │ ├── README.md │ ├── external │ │ ├── libredis_cell.dylib │ │ └── libredis_cell.so │ ├── redis-example.conf │ ├── src │ │ ├── account.rs │ │ ├── crypto.rs │ │ ├── lib.rs │ │ └── redis │ │ │ ├── lua │ │ │ ├── account_from_username.lua │ │ │ ├── load_accounts.lua │ │ │ ├── process_fulfill.lua │ │ │ ├── process_incoming_settlement.lua │ │ │ ├── process_prepare.lua │ │ │ ├── process_reject.lua │ │ │ ├── process_settle.lua │ │ │ └── refund_settlement.lua │ │ │ ├── mod.rs │ │ │ └── reconnect.rs │ └── tests │ │ └── redis │ │ ├── accounts_test.rs │ │ ├── balances_test.rs │ │ ├── btp_test.rs │ │ ├── http_test.rs │ │ ├── notifications.rs │ │ ├── rate_limiting_test.rs │ │ ├── rates_test.rs │ │ ├── redis_tests.rs │ │ ├── routing_test.rs │ │ └── settlement_test.rs ├── interledger-stream │ ├── Cargo.toml │ ├── README.md │ ├── fuzz │ │ ├── .gitignore │ │ ├── Cargo.toml │ │ └── fuzz_targets │ │ │ └── stream_packet.rs │ └── src │ │ ├── client.rs │ │ ├── congestion.rs │ │ ├── crypto.rs │ │ ├── error.rs │ │ ├── lib.rs │ │ ├── packet.rs │ │ └── server.rs └── interledger │ ├── Cargo.toml │ ├── README.md │ └── src │ └── lib.rs ├── docker ├── Dockerfile ├── docker-build.sh ├── ilp-cli.dockerfile ├── ilp-node.dockerfile ├── redis.conf ├── run-services-in-docker.sh └── run-testnet-bundle.js ├── docs ├── CONTRIBUTING.md ├── api.md ├── api.yml ├── architecture.md ├── configuration.md ├── interledger-rs.svg ├── logging.md ├── manual-config.md ├── peering.md ├── prometheus.md └── testnet.md ├── examples ├── README.md ├── eth-settlement │ ├── README.md │ └── images │ │ ├── materials │ │ └── overview.graffle │ │ └── overview.svg ├── eth-xrp-three-nodes │ ├── README.md │ └── images │ │ ├── materials │ │ └── overview.graffle │ │ └── overview.svg ├── simple │ ├── README.md │ └── images │ │ ├── materials │ │ └── overview.graffle │ │ └── overview.svg └── xrp-settlement │ ├── README.md │ └── images │ ├── materials │ └── overview.graffle │ └── overview.svg └── scripts ├── parse-md.sh ├── release.sh ├── run-md-lib.sh ├── run-md-test.sh └── run-md.sh /.circleci/release/build_musl_binary.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Build musl binary inside a Docker container and copy it to local disk. 4 | # This script requires docker command. 5 | # `crate_name` ($1) is expected to be the same as bin name. 6 | # 7 | # 1) Spin up a new container of "clux/muslrust:stable" 8 | # 2) Copy source code etc. to the container 9 | # 3) Build a musl binary of the specified crate ($1) inside the container 10 | # 4) Copy the built binary to local disk space ($2) 11 | 12 | crate_name=$1 13 | artifacts_path=$2 14 | docker_image_name="clux/muslrust:stable" 15 | 16 | if [ -z "${crate_name}" ]; then 17 | printf "%s\n" "crate_name is required." 18 | exit 1 19 | fi 20 | if [ -z "${artifacts_path}" ]; then 21 | printf "%s\n" "artifacts_path is required." 22 | exit 1 23 | fi 24 | 25 | docker run -dt --name builder "${docker_image_name}" 26 | 27 | docker cp ./Cargo.toml builder:/usr/src/Cargo.toml 28 | docker cp ./Cargo.lock builder:/usr/src/Cargo.lock 29 | docker cp ./crates builder:/usr/src/crates 30 | 31 | # "--workdir" requires API version 1.35, but the Docker daemon API version of CircleCI is 1.32 32 | docker exec builder "/bin/bash" "-c" "cd /usr/src && cargo build --release --package \"${crate_name}\" --bin \"${crate_name}\" --target x86_64-unknown-linux-musl" 33 | docker cp "builder:/usr/src/target/x86_64-unknown-linux-musl/release/${crate_name}" "${artifacts_path}" 34 | 35 | docker stop builder 36 | -------------------------------------------------------------------------------- /.circleci/release/get_crate_name.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Returns a crate name to build from a git tag name. 4 | # The tag name is assumed to be output by `cargo release` or be tagged manually. 5 | 6 | # The regex means "(something)-(semantic version)" 7 | if [[ $1 =~ ^(.*)-v([0-9]+)\.([0-9]+)\.([0-9]+)(-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?(\+[0-9A-Za-z-]+)?$ ]]; then 8 | echo ${BASH_REMATCH[1]} 9 | elif [[ $1 =~ ^ilp-node-.*$ ]]; then 10 | echo "ilp-node" 11 | elif [[ $1 =~ ^ilp-cli-.*$ ]]; then 12 | echo "ilp-cli" 13 | fi 14 | -------------------------------------------------------------------------------- /.circleci/release/get_docker_image_tag.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Returns `latest` or crate version. If git_tag ($2) argument is given, it is considered as that the new version 4 | # is published. If the tag is the form of semantic version like "ilp-node-0.4.1-beta.3", this script returns 5 | # the version of crate like "0.4.1-beta.3" because tag names generated by `cargo release` look a bit redundant. 6 | # If the tag is not one of semantic version, just returns the tag itself and the docker image will be tagged 7 | # with the git tag. 8 | # If no tag is given, it is considered as a `latest` (or possibly could be said `nightly`) build. 9 | # This script requires `jq` 10 | 11 | crate_name=$1 12 | git_tag=$2 13 | 14 | if [ -n "$git_tag" ]; then 15 | # If it is a tag of semantic version expression 16 | if [[ "$git_tag" =~ ^.*v([0-9]+)\.([0-9]+)\.([0-9]+)(-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?(\+[0-9A-Za-z-]+)?$ ]] ; then 17 | cargo read-manifest --manifest-path crates/${crate_name}/Cargo.toml | jq -r .version 18 | else 19 | printf "$git_tag" 20 | fi 21 | else 22 | printf "latest" 23 | fi 24 | -------------------------------------------------------------------------------- /.circleci/release/github_release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Intended to be run in the top directory. 4 | # 5 | # This script creates a GitHub release and attach specified asset files to the release. 6 | # [WARNING] If there is any release that has the same name, it will be replaced. 7 | # 8 | # Env var: 9 | # GITHUB_OAUTH_TOKEN: OAuth token for GitHub 10 | # Arguments: 11 | # [tag_name] [release_name] [release_note_path] [asset_path].. 12 | # Note: 13 | # - We need to set Authorization and User-Agent headers. 14 | # - You can generate OAuth tokens from https://github.com/settings/tokens 15 | 16 | function push_release() { 17 | local repository="interledger-rs/interledger-rs" 18 | local user_agent="curl-on-CircleCI" 19 | local tag_name="$1" 20 | local release_name="$2" 21 | local release_note_path="$3" 22 | local log_dir=logs/${release_name} 23 | shift 3 24 | 25 | if [ -z "${tag_name}" ]; then 26 | printf "%s\n" "tag name is required." 27 | exit 1 28 | fi 29 | if [ -z "${release_name}" ]; then 30 | printf "%s\n" "release name is required." 31 | exit 1 32 | fi 33 | if [ -z "${release_note_path}" ]; then 34 | printf "%s\n" "release note path is required." 35 | exit 1 36 | fi 37 | if [ ! -e "${release_note_path}" ] || [ ! -f "${release_note_path}" ]; then 38 | printf "%s\n" "release note file was not found." 39 | exit 1 40 | fi 41 | if [ ! $# -ge 1 ]; then 42 | printf "%s\n" "asset path(s) is required." 43 | exit 1 44 | fi 45 | 46 | mkdir -p ${log_dir} 47 | 48 | # check if there is any release of the same name 49 | curl \ 50 | -X GET \ 51 | -H "User-Agent: ${user_agent}" \ 52 | -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \ 53 | -H "Accept: application/vnd.github.v3+json" \ 54 | https://api.github.com/repos/${repository}/releases/tags/${release_name} 2>/dev/null >${log_dir}/prev_release.json || exit 2 55 | local release_id=$(jq -r .id < "${log_dir}/prev_release.json") 56 | 57 | # delete it if found 58 | if [ "${release_id}" != "null" ]; then 59 | printf "%s%d%s\n" "Found a release of the same name: " "${release_id}" ", deleting..." 60 | curl \ 61 | -X DELETE \ 62 | -H "User-Agent: ${user_agent}" \ 63 | -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \ 64 | -H "Accept: application/vnd.github.v3+json" \ 65 | https://api.github.com/repos/${repository}/releases/${release_id} 2>/dev/null >${log_dir}/delete_release.json || exit 2 66 | fi 67 | 68 | # create a release 69 | json=$(printf '{ 70 | "tag_name": "%s", 71 | "name": "%s", 72 | "body": "" 73 | }' "${tag_name}" "${release_name}" | jq --arg release_note "$(cat ${release_note_path})" '.body=$release_note') 74 | 75 | printf "%s" "Creating a release: ${release_name}..." 76 | curl \ 77 | -X POST \ 78 | -H "User-Agent: ${user_agent}" \ 79 | -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \ 80 | -H "Accept: application/vnd.github.v3+json" \ 81 | -d "${json}" \ 82 | https://api.github.com/repos/${repository}/releases 2>/dev/null >${log_dir}/release.json || exit 2 83 | printf "%s\n" "done" 84 | 85 | asset_upload_url=$(jq -r ".upload_url" < "${log_dir}/release.json") 86 | asset_upload_url=${asset_upload_url/\{\?name,label\}/} 87 | 88 | for asset_path in $@ 89 | do 90 | file_name=$(basename "${asset_path}") 91 | content_type=$(file -b --mime-type "${asset_path}") 92 | printf "%s" "Uploading an asset: ${file_name}..." 93 | curl \ 94 | -X POST \ 95 | -H "User-Agent: curl-on-CircleCI" \ 96 | -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \ 97 | -H "Content-Type: $(file -b --mime-type ${content_type})" \ 98 | --data-binary @${asset_path} \ 99 | ${asset_upload_url}?name=${file_name} 2>/dev/null >${log_dir}/asset_${file_name}.json || exit 2 100 | printf "%s\n" "done" 101 | done 102 | } 103 | 104 | if [ ! $# -ge 3 ]; then 105 | printf "%s\n" "missing parameter(s)." 106 | exit 1 107 | fi 108 | 109 | mkdir -p logs 110 | 111 | push_release "$@" 112 | -------------------------------------------------------------------------------- /.circleci/release/github_tag.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | function create_tag() { 4 | local repository="interledger-rs/interledger-rs" 5 | local user_agent="curl-on-CircleCI" 6 | local tag_name=$1 7 | local message=$2 8 | local object=$3 9 | local type=$4 10 | local log_dir=${LOG_DIR:-logs} 11 | 12 | if [ -z "${tag_name}" ]; then 13 | printf "%s\n" "tag name is required." 14 | exit 1 15 | fi 16 | if [ -z "${message}" ]; then 17 | printf "%s\n" "message name is required." 18 | exit 1 19 | fi 20 | if [ -z "${object}" ]; then 21 | printf "%s\n" "object is required." 22 | exit 1 23 | fi 24 | if [ -z "${type}" ]; then 25 | printf "%s\n" "type is required." 26 | exit 1 27 | fi 28 | 29 | mkdir -p "${log_dir}" 30 | 31 | # check if there is any release of the same tag 32 | curl \ 33 | -X GET \ 34 | -H "User-Agent: ${user_agent}" \ 35 | -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \ 36 | -H "Accept: application/vnd.github.v3+json" \ 37 | https://api.github.com/repos/${repository}/releases/tags/${tag_name} 2>/dev/null >${log_dir}/prev_tag.json || exit 2 38 | local release_id=$(jq -r .id < "${log_dir}/prev_tag.json") 39 | 40 | # delete it if found 41 | if [ "${release_id}" != "null" ]; then 42 | printf "%s%d%s\n" "Found a tag of the same name: " "${release_id}" ", deleting..." 43 | curl \ 44 | -X DELETE \ 45 | -H "User-Agent: ${user_agent}" \ 46 | -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \ 47 | -H "Accept: application/vnd.github.v3+json" \ 48 | https://api.github.com/repos/${repository}/releases/${tag_name} 2>/dev/null >${log_dir}/delete_tag.json || exit 2 49 | fi 50 | 51 | # create a new tag 52 | json=$(printf '{ 53 | "tag": "%s", 54 | "message": "%s", 55 | "object": "%s", 56 | "type": "%s" 57 | }' "${tag_name}" "${message}" "${object}" "${type}") 58 | 59 | printf "%s\n" "Creating a tag: ${tag_name}..." 60 | curl \ 61 | -X POST \ 62 | -H "User-Agent: ${user_agent}" \ 63 | -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \ 64 | -H "Accept: application/vnd.github.v3+json" \ 65 | -d "${json}" \ 66 | https://api.github.com/repos/${repository}/git/tags 2>/dev/null >${log_dir}/tag.json || exit 2 67 | } 68 | 69 | create_tag "$@" 70 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | target 2 | docs 3 | examples 4 | -------------------------------------------------------------------------------- /.github/config.yml: -------------------------------------------------------------------------------- 1 | # Use the commitizen / AngularJS commit message style 2 | # See https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines for more information 3 | COMMIT_MESSAGE_REGEX: /(?:^(feat|fix|docs|style|refactor|perf|test|chore|ci|build)(\(.{1,30}\))?:[ ].{5,100}$)(:?\n(?:\n{1,2}^.{1,100}$)+)?/m -------------------------------------------------------------------------------- /.github/workflows/commits.yml: -------------------------------------------------------------------------------- 1 | # Checks all commits in a PR follow the repo rules: 2 | # 3 | # 1. conventional commit messages 4 | # 2. used `git commit --signoff` 5 | # 3. no extra merge commits 6 | name: Commits 7 | 8 | on: 9 | workflow_dispatch: 10 | # Perform these checks on PRs into *any* branch. 11 | # 12 | # Motivation: 13 | # Commits which are not --signoff but merged into other branches 14 | # will likely make their way into PRs for master. At which 15 | # point it will be difficult to get the original author to --signoff. 16 | pull_request: 17 | 18 | jobs: 19 | commit-checks: 20 | runs-on: ubuntu-latest 21 | steps: 22 | - uses: actions/checkout@v2 23 | with: 24 | fetch-depth: 0 25 | 26 | - name: Set commit range variables 27 | # Finding the commit range is not as trivial as it may seem. 28 | # 29 | # At this stage git's HEAD does not refer to the latest commit in the PR, 30 | # but rather to the merge commit inserted by the PR. So instead we have 31 | # to get 'HEAD' from the PR event. 32 | # 33 | # One cannot use the number of commits (github.event.pull_request.commits) 34 | # to find the start commit i.e. HEAD~N does not work, this breaks if there 35 | # are merge commits. 36 | run: | 37 | echo "PR_HEAD=${{ github.event.pull_request.head.sha }}" >> $GITHUB_ENV 38 | echo "PR_BASE=${{ github.event.pull_request.base.sha }}" >> $GITHUB_ENV 39 | 40 | - name: Install conventional-commit linter 41 | run: | 42 | # Intall the linter and the conventional commits config 43 | npm install @commitlint/config-conventional @commitlint/cli 44 | 45 | # Extend the conventional commits config with the `--signoff` 46 | # requirement. 47 | echo "module.exports = { 48 | extends: ['@commitlint/config-conventional'], 49 | rules: { 50 | 'signed-off-by': [2, 'always', 'Signed-off-by:'], 51 | } 52 | }" > commitlint.config.js 53 | 54 | - name: Conventional commit check 55 | run: | 56 | npx commitlint --from $PR_BASE --to $PR_HEAD 57 | 58 | - name: No merge commits 59 | run: | 60 | # This will list any merge commits in the PR commit path 61 | MERGE=$(git log --merges --ancestry-path $PR_BASE..$PR_HEAD) 62 | 63 | # The merge list should be empty 64 | [[ ! -z "$MERGE" ]] && { 65 | echo "PR contains merge commits:"; 66 | echo $MERGE; 67 | exit 1; 68 | } 69 | exit 0; 70 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: Docker 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'master' 7 | tags: 8 | - 'ilp-node-*' 9 | - 'ilp-cli-*' 10 | 11 | jobs: 12 | update-docker-images: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout sources 16 | uses: actions/checkout@v2 17 | 18 | - name: Install dependencies 19 | run: | 20 | sudo apt-get update 21 | sudo apt-get install -y redis-server redis-tools libssl-dev 22 | 23 | - name: Install node 24 | uses: actions/setup-node@v2 25 | with: 26 | node-version: 'v12.18.4' 27 | 28 | - name: Get tags 29 | id: tags 30 | run: | 31 | TAG=${GITHUB_REF#refs/tags/} 32 | if [ $TAG = "refs/heads/master" ]; then 33 | TAG="" 34 | fi 35 | echo ::set-output name=tag::${TAG} 36 | 37 | ILP_NODE_IMAGE_TAG=$(./.circleci/release/get_docker_image_tag.sh ilp-node ${TAG}) 38 | echo ::set-output name=ilp_node_image_tag::${ILP_NODE_IMAGE_TAG} 39 | echo "ilp node image tag: ${ILP_NODE_IMAGE_TAG}" 40 | 41 | ILP_NODE_CLI_IMAGE_TAG=$(./.circleci/release/get_docker_image_tag.sh ilp-cli ${TAG}) 42 | echo ::set-output name=ilp_node_cli_image_tag::${ILP_NODE_CLI_IMAGE_TAG} 43 | 44 | - name: Login to Docker Hub 45 | uses: docker/login-action@v1 46 | with: 47 | username: ${{ secrets.DOCKER_HUB_USERNAME }} 48 | password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} 49 | 50 | # Build and push ilp-node in the case of push to master or tag with 'ilp-node-*' 51 | - name: Build ilp-node 52 | if: startsWith(steps.tags.outputs.tag, 'ilp-cli-') != true 53 | uses: docker/build-push-action@v2 54 | with: 55 | context: . 56 | file: ./docker/ilp-node.dockerfile 57 | push: true 58 | tags: interledgerrs/ilp-node:${{steps.tags.outputs.ilp_node_image_tag}} 59 | build-args: | 60 | CARGO_BUILD_OPTION=--release 61 | RUST_BIN_DIR_NAME=release 62 | 63 | # Build and push together with ilp-node in the case of push to master or tag with 'ilp-node-*' 64 | - name: Build ilp-testnet 65 | if: startsWith(steps.tags.outputs.tag, 'ilp-cli-') != true 66 | uses: docker/build-push-action@v2 67 | with: 68 | context: . 69 | file: ./docker/Dockerfile 70 | push: true 71 | tags: interledgerrs/testnet-bundle:${{steps.tags.outputs.ilp_node_image_tag}} 72 | 73 | # Build and push in the case of push to master or tag with `ilp-cli-*` 74 | - name: Build ilp-cli 75 | if: startsWith(steps.tags.outputs.tag, 'ilp-node-') != true 76 | uses: docker/build-push-action@v2 77 | with: 78 | context: . 79 | file: ./docker/ilp-cli.dockerfile 80 | push: true 81 | tags: interledgerrs/ilp-cli:${{steps.tags.outputs.ilp_node_cli_image_tag}} 82 | 83 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | **/*.rs.bk 3 | .vscode 4 | .idea 5 | *.code-workspace 6 | *.csv* 7 | *.ods* 8 | *.xls* 9 | *.rdb 10 | *.aof 11 | cmake-build-debug/ 12 | **/*.log 13 | .DS_Store 14 | 15 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | 3 | members = [ 4 | "./crates/ilp-cli", 5 | "./crates/ilp-node", 6 | "./crates/interledger", 7 | "./crates/interledger-api", 8 | "./crates/interledger-btp", 9 | "./crates/interledger-ccp", 10 | "./crates/interledger-http", 11 | "./crates/interledger-ildcp", 12 | "./crates/interledger-packet", 13 | "./crates/interledger-router", 14 | "./crates/interledger-rates", 15 | "./crates/interledger-service", 16 | "./crates/interledger-service-util", 17 | "./crates/interledger-settlement", 18 | "./crates/interledger-spsp", 19 | "./crates/interledger-store", 20 | "./crates/interledger-stream", 21 | "./crates/interledger-errors", 22 | ] 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2018-2019 Evan Schwartz and contributors 2 | Copyright 2017-2018 Evan Schwartz 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |