From deba46125d7b2f9066c3bdd251ce075f75718490 Mon Sep 17 00:00:00 2001
From: Hugo Trentesaux <hugo@trentesaux.fr>
Date: Thu, 28 Nov 2024 17:38:53 +0100
Subject: [PATCH] fix rpc dockerfile and add rpc cesium plus example

---
 docker/Dockerfile.KuboRpc              |   2 +-
 logo.png                               | Bin 0 -> 8710 bytes
 package.json                           |   5 +-
 pnpm-lock.yaml                         | 256 ++++++++++++++-----------
 scripts/configure-rpc-addresses.sh     |  19 ++
 src/scripts/datapod-profile-example.ts |  79 ++++++++
 6 files changed, 241 insertions(+), 120 deletions(-)
 create mode 100644 logo.png
 create mode 100644 scripts/configure-rpc-addresses.sh
 create mode 100644 src/scripts/datapod-profile-example.ts

diff --git a/docker/Dockerfile.KuboRpc b/docker/Dockerfile.KuboRpc
index 32dda23..ae3fa49 100644
--- a/docker/Dockerfile.KuboRpc
+++ b/docker/Dockerfile.KuboRpc
@@ -1,6 +1,6 @@
 # kubo config suited for unsafe remote RPC instance
 FROM ipfs/kubo:v0.32.1
-COPY ./scripts/configure-addresses.sh /container-init.d/001-configure.sh
+COPY ./scripts/configure-rpc-addresses.sh /container-init.d/001-configure.sh
 COPY ./scripts/configure-bootstrap.sh /container-init.d/002-configure.sh
 COPY ./scripts/configure-peering.sh /container-init.d/003-configure.sh
 COPY ./scripts/configure-rpc-public.sh /container-init.d/004-configure.sh
diff --git a/logo.png b/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..cfbe1faf31e9d6d43e5baba1d3fe94e180ce484b
GIT binary patch
literal 8710
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
CxyA<o

literal 0
HcmV?d00001

diff --git a/package.json b/package.json
index 97dcfa1..3e409d1 100644
--- a/package.json
+++ b/package.json
@@ -18,8 +18,8 @@
   "dependencies": {
     "@libp2p/peer-id": "^4.1.0",
     "@multiformats/multiaddr": "^12.2.1",
-    "@polkadot/util": "^12.6.2",
-    "@polkadot/util-crypto": "^12.6.2",
+    "@polkadot/util": "^13.2.3",
+    "@polkadot/util-crypto": "^13.2.3",
     "bs58": "^5.0.0",
     "kubo-rpc-client": "^4.1.1",
     "multiformats": "^13.1.0",
@@ -27,6 +27,7 @@
   },
   "devDependencies": {
     "@libp2p/interface": "^1.3.0",
+    "@polkadot/keyring": "^13.2.3",
     "@rushstack/eslint-patch": "^1.10.2",
     "@tsconfig/node20": "^20.1.4",
     "@types/node": "^20.12.7",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3041677..3693589 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -15,11 +15,11 @@ importers:
         specifier: ^12.2.1
         version: 12.2.1
       '@polkadot/util':
-        specifier: ^12.6.2
-        version: 12.6.2
+        specifier: ^13.2.3
+        version: 13.2.3
       '@polkadot/util-crypto':
-        specifier: ^12.6.2
-        version: 12.6.2(@polkadot/util@12.6.2)
+        specifier: ^13.2.3
+        version: 13.2.3(@polkadot/util@13.2.3)
       bs58:
         specifier: ^5.0.0
         version: 5.0.0
@@ -36,6 +36,9 @@ importers:
       '@libp2p/interface':
         specifier: ^1.3.0
         version: 1.3.0
+      '@polkadot/keyring':
+        specifier: ^13.2.3
+        version: 13.2.3(@polkadot/util-crypto@13.2.3(@polkadot/util@13.2.3))(@polkadot/util@13.2.3)
       '@rushstack/eslint-patch':
         specifier: ^1.10.2
         version: 1.10.2
@@ -423,6 +426,7 @@ packages:
   '@humanwhocodes/config-array@0.11.14':
     resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
     engines: {node: '>=10.10.0'}
+    deprecated: Use @eslint/config-array instead
 
   '@humanwhocodes/module-importer@1.0.1':
     resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
@@ -430,6 +434,7 @@ packages:
 
   '@humanwhocodes/object-schema@2.0.3':
     resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+    deprecated: Use @eslint/object-schema instead
 
   '@ipld/dag-cbor@9.2.0':
     resolution: {integrity: sha512-N14oMy0q4gM6OuZkIpisKe0JBSjf1Jb39VI+7jMLiWX9124u1Z3Fdj/Tag1NA0cVxxqWDh0CqsjcVfOKtelPDA==}
@@ -490,80 +495,87 @@ packages:
     resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
     engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
 
-  '@polkadot/networks@12.6.2':
-    resolution: {integrity: sha512-1oWtZm1IvPWqvMrldVH6NI2gBoCndl5GEwx7lAuQWGr7eNL+6Bdc5K3Z9T0MzFvDGoi2/CBqjX9dRKo39pDC/w==}
+  '@polkadot/keyring@13.2.3':
+    resolution: {integrity: sha512-pgTo6DXNXub0wGD+MnVHYhKxf80Jl+QMOCb818ioGdXz++Uw4mTueFAwtB+N7TGo0HafhChUiNJDxFdlDkcAng==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@polkadot/util': 13.2.3
+      '@polkadot/util-crypto': 13.2.3
+
+  '@polkadot/networks@13.2.3':
+    resolution: {integrity: sha512-mG+zkXg/33AyPrkv2xBbAo3LBUwOwBn6qznBU/4jxiZPnVvCwMaxE7xHM22B5riItbNJ169FXv3wy0v6ZmkFbw==}
     engines: {node: '>=18'}
 
-  '@polkadot/util-crypto@12.6.2':
-    resolution: {integrity: sha512-FEWI/dJ7wDMNN1WOzZAjQoIcCP/3vz3wvAp5QQm+lOrzOLj0iDmaIGIcBkz8HVm3ErfSe/uKP0KS4jgV/ib+Mg==}
+  '@polkadot/util-crypto@13.2.3':
+    resolution: {integrity: sha512-5sbggmLbn5eiuVMyPROPlT5roHRqdKHOfSpioNbGvGIZ1qIWVoC1RfsK0NWJOVGDzy6DpQe0KYT/kgcU5Xsrzw==}
     engines: {node: '>=18'}
     peerDependencies:
-      '@polkadot/util': 12.6.2
+      '@polkadot/util': 13.2.3
 
-  '@polkadot/util@12.6.2':
-    resolution: {integrity: sha512-l8TubR7CLEY47240uki0TQzFvtnxFIO7uI/0GoWzpYD/O62EIAMRsuY01N4DuwgKq2ZWD59WhzsLYmA5K6ksdw==}
+  '@polkadot/util@13.2.3':
+    resolution: {integrity: sha512-pioNnsig3qHXrfOKMe4Yqos8B8N3/EZUpS+WfTpWnn1VjYban/0GrTXeavPlAwggnY27b8fS6rBzQBhnVYDw8g==}
     engines: {node: '>=18'}
 
-  '@polkadot/wasm-bridge@7.3.2':
-    resolution: {integrity: sha512-AJEXChcf/nKXd5Q/YLEV5dXQMle3UNT7jcXYmIffZAo/KI394a+/24PaISyQjoNC0fkzS1Q8T5pnGGHmXiVz2g==}
+  '@polkadot/wasm-bridge@7.4.1':
+    resolution: {integrity: sha512-tdkJaV453tezBxhF39r4oeG0A39sPKGDJmN81LYLf+Fihb7astzwju+u75BRmDrHZjZIv00un3razJEWCxze6g==}
     engines: {node: '>=18'}
     peerDependencies:
       '@polkadot/util': '*'
       '@polkadot/x-randomvalues': '*'
 
-  '@polkadot/wasm-crypto-asmjs@7.3.2':
-    resolution: {integrity: sha512-QP5eiUqUFur/2UoF2KKKYJcesc71fXhQFLT3D4ZjG28Mfk2ZPI0QNRUfpcxVQmIUpV5USHg4geCBNuCYsMm20Q==}
+  '@polkadot/wasm-crypto-asmjs@7.4.1':
+    resolution: {integrity: sha512-pwU8QXhUW7IberyHJIQr37IhbB6DPkCG5FhozCiNTq4vFBsFPjm9q8aZh7oX1QHQaiAZa2m2/VjIVE+FHGbvHQ==}
     engines: {node: '>=18'}
     peerDependencies:
       '@polkadot/util': '*'
 
-  '@polkadot/wasm-crypto-init@7.3.2':
-    resolution: {integrity: sha512-FPq73zGmvZtnuJaFV44brze3Lkrki3b4PebxCy9Fplw8nTmisKo9Xxtfew08r0njyYh+uiJRAxPCXadkC9sc8g==}
+  '@polkadot/wasm-crypto-init@7.4.1':
+    resolution: {integrity: sha512-AVka33+f7MvXEEIGq5U0dhaA2SaXMXnxVCQyhJTaCnJ5bRDj0Xlm3ijwDEQUiaDql7EikbkkRtmlvs95eSUWYQ==}
     engines: {node: '>=18'}
     peerDependencies:
       '@polkadot/util': '*'
       '@polkadot/x-randomvalues': '*'
 
-  '@polkadot/wasm-crypto-wasm@7.3.2':
-    resolution: {integrity: sha512-15wd0EMv9IXs5Abp1ZKpKKAVyZPhATIAHfKsyoWCEFDLSOA0/K0QGOxzrAlsrdUkiKZOq7uzSIgIDgW8okx2Mw==}
+  '@polkadot/wasm-crypto-wasm@7.4.1':
+    resolution: {integrity: sha512-PE1OAoupFR0ZOV2O8tr7D1FEUAwaggzxtfs3Aa5gr+yxlSOaWUKeqsOYe1KdrcjmZVV3iINEAXxgrbzCmiuONg==}
     engines: {node: '>=18'}
     peerDependencies:
       '@polkadot/util': '*'
 
-  '@polkadot/wasm-crypto@7.3.2':
-    resolution: {integrity: sha512-+neIDLSJ6jjVXsjyZ5oLSv16oIpwp+PxFqTUaZdZDoA2EyFRQB8pP7+qLsMNk+WJuhuJ4qXil/7XiOnZYZ+wxw==}
+  '@polkadot/wasm-crypto@7.4.1':
+    resolution: {integrity: sha512-kHN/kF7hYxm1y0WeFLWeWir6oTzvcFmR4N8fJJokR+ajYbdmrafPN+6iLgQVbhZnDdxyv9jWDuRRsDnBx8tPMQ==}
     engines: {node: '>=18'}
     peerDependencies:
       '@polkadot/util': '*'
       '@polkadot/x-randomvalues': '*'
 
-  '@polkadot/wasm-util@7.3.2':
-    resolution: {integrity: sha512-bmD+Dxo1lTZyZNxbyPE380wd82QsX+43mgCm40boyKrRppXEyQmWT98v/Poc7chLuskYb6X8IQ6lvvK2bGR4Tg==}
+  '@polkadot/wasm-util@7.4.1':
+    resolution: {integrity: sha512-RAcxNFf3zzpkr+LX/ItAsvj+QyM56TomJ0xjUMo4wKkHjwsxkz4dWJtx5knIgQz/OthqSDMR59VNEycQeNuXzA==}
     engines: {node: '>=18'}
     peerDependencies:
       '@polkadot/util': '*'
 
-  '@polkadot/x-bigint@12.6.2':
-    resolution: {integrity: sha512-HSIk60uFPX4GOFZSnIF7VYJz7WZA7tpFJsne7SzxOooRwMTWEtw3fUpFy5cYYOeLh17/kHH1Y7SVcuxzVLc74Q==}
+  '@polkadot/x-bigint@13.2.3':
+    resolution: {integrity: sha512-VKgEAh0LsxTd/Hg517Tt5ZU4CySjBwMpaojbkjgv3fOdg1cN7t4eFEUxpyj7mlO0cp22SzDh7nmy4TO98qhLQA==}
     engines: {node: '>=18'}
 
-  '@polkadot/x-global@12.6.2':
-    resolution: {integrity: sha512-a8d6m+PW98jmsYDtAWp88qS4dl8DyqUBsd0S+WgyfSMtpEXu6v9nXDgPZgwF5xdDvXhm+P0ZfVkVTnIGrScb5g==}
+  '@polkadot/x-global@13.2.3':
+    resolution: {integrity: sha512-7MYQIAEwBkRcNrgqac5PbB0kNPlI6ISJEy6/Nb+crj8BFjQ8rf11PF49fq0QsvDeuYM1aNLigrvYZNptQs4lbw==}
     engines: {node: '>=18'}
 
-  '@polkadot/x-randomvalues@12.6.2':
-    resolution: {integrity: sha512-Vr8uG7rH2IcNJwtyf5ebdODMcr0XjoCpUbI91Zv6AlKVYOGKZlKLYJHIwpTaKKB+7KPWyQrk4Mlym/rS7v9feg==}
+  '@polkadot/x-randomvalues@13.2.3':
+    resolution: {integrity: sha512-Zf0GTfLmVk+VzPUmcQSpXjjmFzMTjPhXoLuIoE7xIu73T+vQ+TX9j7DvorN6bIRsnZ9l1SyTZsSf/NTjNZKIZg==}
     engines: {node: '>=18'}
     peerDependencies:
-      '@polkadot/util': 12.6.2
+      '@polkadot/util': 13.2.3
       '@polkadot/wasm-util': '*'
 
-  '@polkadot/x-textdecoder@12.6.2':
-    resolution: {integrity: sha512-M1Bir7tYvNappfpFWXOJcnxUhBUFWkUFIdJSyH0zs5LmFtFdbKAeiDXxSp2Swp5ddOZdZgPac294/o2TnQKN1w==}
+  '@polkadot/x-textdecoder@13.2.3':
+    resolution: {integrity: sha512-i8hRXPtGknmdm3FYv6/94I52VXHJZa5sgYNw1+Hqb4Jqmq4awUjea35CKXd/+aw70Qn8Ngg31l2GoiH494fa+Q==}
     engines: {node: '>=18'}
 
-  '@polkadot/x-textencoder@12.6.2':
-    resolution: {integrity: sha512-4N+3UVCpI489tUJ6cv3uf0PjOHvgGp9Dl+SZRLgFGt9mvxnvpW/7+XBADRMtlG4xi5gaRK7bgl5bmY6OMDsNdw==}
+  '@polkadot/x-textencoder@13.2.3':
+    resolution: {integrity: sha512-wJI3Bb/dC4zyBXJFm5+ZhyBXWoI5wvP8k8qX0/ZC0PQsgSAqs7LVhiofk4Wd94n0P41W5re58LrGXLyziSAshw==}
     engines: {node: '>=18'}
 
   '@rollup/rollup-android-arm-eabi@4.16.4':
@@ -649,17 +661,17 @@ packages:
   '@rushstack/eslint-patch@1.10.2':
     resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==}
 
-  '@scure/base@1.1.6':
-    resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==}
+  '@scure/base@1.2.1':
+    resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==}
 
-  '@substrate/ss58-registry@1.47.0':
-    resolution: {integrity: sha512-6kuIJedRcisUJS2pgksEH2jZf3hfSIVzqtFzs/AyjTW3ETbMg5q1Bb7VWa0WYaT6dTrEXp/6UoXM5B9pSIUmcw==}
+  '@substrate/ss58-registry@1.51.0':
+    resolution: {integrity: sha512-TWDurLiPxndFgKjVavCniytBIw+t4ViOi7TYp9h/D0NMmkEc9klFTo+827eyEJ0lELpqO207Ey7uGxUa+BS1jQ==}
 
   '@tsconfig/node20@20.1.4':
     resolution: {integrity: sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==}
 
-  '@types/bn.js@5.1.5':
-    resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==}
+  '@types/bn.js@5.1.6':
+    resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==}
 
   '@types/dns-packet@5.6.5':
     resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==}
@@ -1042,6 +1054,7 @@ packages:
   eslint@8.57.0:
     resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
     hasBin: true
 
   espree@9.6.1:
@@ -1144,6 +1157,7 @@ packages:
 
   glob@7.2.3:
     resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+    deprecated: Glob versions prior to v9 are no longer supported
 
   globals@13.24.0:
     resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
@@ -1197,6 +1211,7 @@ packages:
 
   inflight@1.0.6:
     resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+    deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
 
   inherits@2.0.4:
     resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@@ -1593,6 +1608,7 @@ packages:
 
   rimraf@3.0.2:
     resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+    deprecated: Rimraf versions prior to v4 are no longer supported
     hasBin: true
 
   rollup@4.16.4:
@@ -1680,8 +1696,8 @@ packages:
     peerDependencies:
       typescript: '>=4.2.0'
 
-  tslib@2.6.2:
-    resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+  tslib@2.8.1:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
 
   tsx@4.7.3:
     resolution: {integrity: sha512-+fQnMqIp/jxZEXLcj6WzYy9FhcS5/Dfk8y4AtzJ6ejKcKqmfTF8Gso/jtrzDggCF2zTU20gJa6n8XqPYwDAUYQ==}
@@ -2090,104 +2106,110 @@ snapshots:
 
   '@pkgr/core@0.1.1': {}
 
-  '@polkadot/networks@12.6.2':
+  '@polkadot/keyring@13.2.3(@polkadot/util-crypto@13.2.3(@polkadot/util@13.2.3))(@polkadot/util@13.2.3)':
+    dependencies:
+      '@polkadot/util': 13.2.3
+      '@polkadot/util-crypto': 13.2.3(@polkadot/util@13.2.3)
+      tslib: 2.8.1
+
+  '@polkadot/networks@13.2.3':
     dependencies:
-      '@polkadot/util': 12.6.2
-      '@substrate/ss58-registry': 1.47.0
-      tslib: 2.6.2
+      '@polkadot/util': 13.2.3
+      '@substrate/ss58-registry': 1.51.0
+      tslib: 2.8.1
 
-  '@polkadot/util-crypto@12.6.2(@polkadot/util@12.6.2)':
+  '@polkadot/util-crypto@13.2.3(@polkadot/util@13.2.3)':
     dependencies:
       '@noble/curves': 1.4.0
       '@noble/hashes': 1.4.0
-      '@polkadot/networks': 12.6.2
-      '@polkadot/util': 12.6.2
-      '@polkadot/wasm-crypto': 7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)))
-      '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2)
-      '@polkadot/x-bigint': 12.6.2
-      '@polkadot/x-randomvalues': 12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))
-      '@scure/base': 1.1.6
-      tslib: 2.6.2
-
-  '@polkadot/util@12.6.2':
-    dependencies:
-      '@polkadot/x-bigint': 12.6.2
-      '@polkadot/x-global': 12.6.2
-      '@polkadot/x-textdecoder': 12.6.2
-      '@polkadot/x-textencoder': 12.6.2
-      '@types/bn.js': 5.1.5
+      '@polkadot/networks': 13.2.3
+      '@polkadot/util': 13.2.3
+      '@polkadot/wasm-crypto': 7.4.1(@polkadot/util@13.2.3)(@polkadot/x-randomvalues@13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3)))
+      '@polkadot/wasm-util': 7.4.1(@polkadot/util@13.2.3)
+      '@polkadot/x-bigint': 13.2.3
+      '@polkadot/x-randomvalues': 13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3))
+      '@scure/base': 1.2.1
+      tslib: 2.8.1
+
+  '@polkadot/util@13.2.3':
+    dependencies:
+      '@polkadot/x-bigint': 13.2.3
+      '@polkadot/x-global': 13.2.3
+      '@polkadot/x-textdecoder': 13.2.3
+      '@polkadot/x-textencoder': 13.2.3
+      '@types/bn.js': 5.1.6
       bn.js: 5.2.1
-      tslib: 2.6.2
+      tslib: 2.8.1
 
-  '@polkadot/wasm-bridge@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)))':
+  '@polkadot/wasm-bridge@7.4.1(@polkadot/util@13.2.3)(@polkadot/x-randomvalues@13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3)))':
     dependencies:
-      '@polkadot/util': 12.6.2
-      '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2)
-      '@polkadot/x-randomvalues': 12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))
-      tslib: 2.6.2
+      '@polkadot/util': 13.2.3
+      '@polkadot/wasm-util': 7.4.1(@polkadot/util@13.2.3)
+      '@polkadot/x-randomvalues': 13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3))
+      tslib: 2.8.1
 
-  '@polkadot/wasm-crypto-asmjs@7.3.2(@polkadot/util@12.6.2)':
+  '@polkadot/wasm-crypto-asmjs@7.4.1(@polkadot/util@13.2.3)':
     dependencies:
-      '@polkadot/util': 12.6.2
-      tslib: 2.6.2
+      '@polkadot/util': 13.2.3
+      tslib: 2.8.1
 
-  '@polkadot/wasm-crypto-init@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)))':
+  '@polkadot/wasm-crypto-init@7.4.1(@polkadot/util@13.2.3)(@polkadot/x-randomvalues@13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3)))':
     dependencies:
-      '@polkadot/util': 12.6.2
-      '@polkadot/wasm-bridge': 7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)))
-      '@polkadot/wasm-crypto-asmjs': 7.3.2(@polkadot/util@12.6.2)
-      '@polkadot/wasm-crypto-wasm': 7.3.2(@polkadot/util@12.6.2)
-      '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2)
-      '@polkadot/x-randomvalues': 12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))
-      tslib: 2.6.2
+      '@polkadot/util': 13.2.3
+      '@polkadot/wasm-bridge': 7.4.1(@polkadot/util@13.2.3)(@polkadot/x-randomvalues@13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3)))
+      '@polkadot/wasm-crypto-asmjs': 7.4.1(@polkadot/util@13.2.3)
+      '@polkadot/wasm-crypto-wasm': 7.4.1(@polkadot/util@13.2.3)
+      '@polkadot/wasm-util': 7.4.1(@polkadot/util@13.2.3)
+      '@polkadot/x-randomvalues': 13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3))
+      tslib: 2.8.1
 
-  '@polkadot/wasm-crypto-wasm@7.3.2(@polkadot/util@12.6.2)':
+  '@polkadot/wasm-crypto-wasm@7.4.1(@polkadot/util@13.2.3)':
     dependencies:
-      '@polkadot/util': 12.6.2
-      '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2)
-      tslib: 2.6.2
+      '@polkadot/util': 13.2.3
+      '@polkadot/wasm-util': 7.4.1(@polkadot/util@13.2.3)
+      tslib: 2.8.1
 
-  '@polkadot/wasm-crypto@7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)))':
+  '@polkadot/wasm-crypto@7.4.1(@polkadot/util@13.2.3)(@polkadot/x-randomvalues@13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3)))':
     dependencies:
-      '@polkadot/util': 12.6.2
-      '@polkadot/wasm-bridge': 7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)))
-      '@polkadot/wasm-crypto-asmjs': 7.3.2(@polkadot/util@12.6.2)
-      '@polkadot/wasm-crypto-init': 7.3.2(@polkadot/util@12.6.2)(@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)))
-      '@polkadot/wasm-crypto-wasm': 7.3.2(@polkadot/util@12.6.2)
-      '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2)
-      '@polkadot/x-randomvalues': 12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))
-      tslib: 2.6.2
+      '@polkadot/util': 13.2.3
+      '@polkadot/wasm-bridge': 7.4.1(@polkadot/util@13.2.3)(@polkadot/x-randomvalues@13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3)))
+      '@polkadot/wasm-crypto-asmjs': 7.4.1(@polkadot/util@13.2.3)
+      '@polkadot/wasm-crypto-init': 7.4.1(@polkadot/util@13.2.3)(@polkadot/x-randomvalues@13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3)))
+      '@polkadot/wasm-crypto-wasm': 7.4.1(@polkadot/util@13.2.3)
+      '@polkadot/wasm-util': 7.4.1(@polkadot/util@13.2.3)
+      '@polkadot/x-randomvalues': 13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3))
+      tslib: 2.8.1
 
-  '@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2)':
+  '@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3)':
     dependencies:
-      '@polkadot/util': 12.6.2
-      tslib: 2.6.2
+      '@polkadot/util': 13.2.3
+      tslib: 2.8.1
 
-  '@polkadot/x-bigint@12.6.2':
+  '@polkadot/x-bigint@13.2.3':
     dependencies:
-      '@polkadot/x-global': 12.6.2
-      tslib: 2.6.2
+      '@polkadot/x-global': 13.2.3
+      tslib: 2.8.1
 
-  '@polkadot/x-global@12.6.2':
+  '@polkadot/x-global@13.2.3':
     dependencies:
-      tslib: 2.6.2
+      tslib: 2.8.1
 
-  '@polkadot/x-randomvalues@12.6.2(@polkadot/util@12.6.2)(@polkadot/wasm-util@7.3.2(@polkadot/util@12.6.2))':
+  '@polkadot/x-randomvalues@13.2.3(@polkadot/util@13.2.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.2.3))':
     dependencies:
-      '@polkadot/util': 12.6.2
-      '@polkadot/wasm-util': 7.3.2(@polkadot/util@12.6.2)
-      '@polkadot/x-global': 12.6.2
-      tslib: 2.6.2
+      '@polkadot/util': 13.2.3
+      '@polkadot/wasm-util': 7.4.1(@polkadot/util@13.2.3)
+      '@polkadot/x-global': 13.2.3
+      tslib: 2.8.1
 
-  '@polkadot/x-textdecoder@12.6.2':
+  '@polkadot/x-textdecoder@13.2.3':
     dependencies:
-      '@polkadot/x-global': 12.6.2
-      tslib: 2.6.2
+      '@polkadot/x-global': 13.2.3
+      tslib: 2.8.1
 
-  '@polkadot/x-textencoder@12.6.2':
+  '@polkadot/x-textencoder@13.2.3':
     dependencies:
-      '@polkadot/x-global': 12.6.2
-      tslib: 2.6.2
+      '@polkadot/x-global': 13.2.3
+      tslib: 2.8.1
 
   '@rollup/rollup-android-arm-eabi@4.16.4':
     optional: true
@@ -2239,13 +2261,13 @@ snapshots:
 
   '@rushstack/eslint-patch@1.10.2': {}
 
-  '@scure/base@1.1.6': {}
+  '@scure/base@1.2.1': {}
 
-  '@substrate/ss58-registry@1.47.0': {}
+  '@substrate/ss58-registry@1.51.0': {}
 
   '@tsconfig/node20@20.1.4': {}
 
-  '@types/bn.js@5.1.5':
+  '@types/bn.js@5.1.6':
     dependencies:
       '@types/node': 20.12.7
 
@@ -3353,7 +3375,7 @@ snapshots:
   synckit@0.8.8:
     dependencies:
       '@pkgr/core': 0.1.1
-      tslib: 2.6.2
+      tslib: 2.8.1
 
   text-table@0.2.0: {}
 
@@ -3367,7 +3389,7 @@ snapshots:
     dependencies:
       typescript: 5.4.5
 
-  tslib@2.6.2: {}
+  tslib@2.8.1: {}
 
   tsx@4.7.3:
     dependencies:
diff --git a/scripts/configure-rpc-addresses.sh b/scripts/configure-rpc-addresses.sh
new file mode 100644
index 0000000..7d078d0
--- /dev/null
+++ b/scripts/configure-rpc-addresses.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+set -ex
+
+# --- addresses ---
+# enable p2p, quic, webtransport, webrtc 
+# ipfs config Swarm.Transports.Network.Websocket --json true
+# internal port is always 4001
+ipfs config Addresses.Swarm --json '[
+  "/ip4/0.0.0.0/tcp/4001",
+  "/ip6/::/tcp/4001",
+  "/ip4/0.0.0.0/udp/4001/quic-v1",
+  "/ip6/::/udp/4001/quic-v1"
+]'
+# configure the addresses to announce
+# KUBO_PORT is external port mapped in docker compose to 4001
+ipfs config Addresses.Announce --json "[
+    \"/dns/$KUBO_DOMAIN/tcp/$KUBO_PORT\",
+    \"/dns/$KUBO_DOMAIN/udp/$KUBO_PORT/quic-v1\"
+]"
diff --git a/src/scripts/datapod-profile-example.ts b/src/scripts/datapod-profile-example.ts
new file mode 100644
index 0000000..014f849
--- /dev/null
+++ b/src/scripts/datapod-profile-example.ts
@@ -0,0 +1,79 @@
+// This script shows a minimal working example to publish a datapod profile
+
+import { readFileSync } from 'fs'
+import { CESIUM_PLUS_PROFILE_INSERT } from '../consts'
+import type { IndexRequest } from '../types'
+import { create } from 'kubo-rpc-client'
+import type { ImportCandidate, KuboRPCClient } from 'kubo-rpc-client'
+import { buildStringPayload } from '../collector'
+import { Keyring } from '@polkadot/keyring'
+import { u8aToHex } from '@polkadot/util'
+
+// This public Kubo node exposes features necessary to upload data and relay to datapod network
+// This is a simple alternative to embedding an ipfs node when it is not possible or suited
+const KUBO_RPC = 'https://rpc.datapod.gyroi.de/'
+
+const kubo: KuboRPCClient = create({
+  url: new URL(KUBO_RPC)
+})
+
+async function main() {
+  // 0. keyring
+  const keyring = new Keyring({ type: 'ed25519', ss58Format: 42 })
+  const alice = keyring.addFromUri('//Alice')
+
+  // 1. profile picture
+  // simply get image as buffer for demo
+  const img = getImage()
+  // upload the image and get its CID
+  const img_cid = (await kubo.add(img)).cid
+
+  // 2. profile
+  // build the profile
+  const data = { title: 'Alice Example', description: 'This is a demo', avatar: img_cid }
+  // upload the profile and get its CID
+  const data_cid = await kubo.dag.put(data)
+
+  // 3. partial index request
+  // build the index request
+  const ir: IndexRequest = {
+    pubkey: alice.address,
+    time: Date.now(),
+    kind: CESIUM_PLUS_PROFILE_INSERT,
+    data: data_cid,
+    sig: null
+  }
+
+  // 4. signature
+  // define the binary payload
+  const payload = buildStringPayload(ir)
+  // sign the payload
+  const signature = alice.sign(payload)
+  // put signature in partial index request
+  ir.sig = u8aToHex(signature)
+
+  // 5. index request
+  // upload index request
+  const ir_cid = await kubo.dag.put(ir)
+
+  // 6. broadcast index request CID on pubsub
+  const enc = new TextEncoder()
+  await kubo.pubsub.publish('ddd', enc.encode(ir_cid.toString() + '\n'))
+
+  console.log(`➡️ published ${ir_cid} on pubsub`)
+  console.log('➡️ corresponding to the following index request')
+  console.log(ir)
+  console.log('➡️ that has the given profile')
+  console.log(data)
+  console.log('➡️ you can visit the following link to confirm that data has been indexed')
+  console.log('https://duniter--vue-coinduf-eu.ipns.pagu.re/#/data/' + alice.address)
+}
+
+main()
+
+// get image for demo purpose
+function getImage(): ImportCandidate {
+  const buffer = readFileSync('logo.png')
+  const bytearray = new Uint8Array(buffer)
+  return { content: bytearray }
+}
-- 
GitLab