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

feat: add support for IOTA DID Method #54

Merged
merged 127 commits into from
May 14, 2024
Merged
Show file tree
Hide file tree
Changes from 120 commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
28a0b87
WIP
daniel-mader Jan 18, 2024
5b2477f
WIP
daniel-mader Jan 19, 2024
f877d6c
feat: re-introduce generics
daniel-mader Jan 20, 2024
6e25803
WIP
daniel-mader Jan 22, 2024
e93922b
feat: introduce `AppState`
nanderstabel Jan 23, 2024
724dc0a
style: rename `ApplicationState` and `AppState`
nanderstabel Jan 23, 2024
cceb007
feat: add `Domain` trait
nanderstabel Jan 23, 2024
35a937c
WIP
nanderstabel Feb 12, 2024
667af89
WIP
nanderstabel Feb 13, 2024
80512c5
style: remove unused code
nanderstabel Feb 13, 2024
ffb01aa
Merge branch 'dev' into refactor/aggregates
nanderstabel Feb 13, 2024
ed25069
fix: fix some `unwrap`s, clean code
nanderstabel Feb 13, 2024
ca4a9cc
refactor: simplify agent_store
nanderstabel Feb 14, 2024
9916ac3
feat: add `CommandHandlers` struct
nanderstabel Feb 14, 2024
01f5e45
style: fix clippy warnings
nanderstabel Feb 14, 2024
e372194
refactor: simplify Commands
nanderstabel Feb 14, 2024
bb18041
style: change name
nanderstabel Feb 15, 2024
4025f91
chore: add log messages
nanderstabel Feb 19, 2024
da407da
fix: only update view when `CredentialOfferCreated`
nanderstabel Feb 19, 2024
6966405
chore: add comments and logging
nanderstabel Feb 19, 2024
0254af3
refactor: separate queries
nanderstabel Feb 20, 2024
9e22cdc
fix: several fixes
nanderstabel Feb 20, 2024
3d8a34d
test: update postman collection
nanderstabel Feb 20, 2024
c0a2e12
fix: set `oid4vc` dependencies to specific `rev`
nanderstabel Feb 26, 2024
88467a9
chore: set `rust-version` and use `workspace.package` settings
nanderstabel Feb 26, 2024
5e62ffb
feat: add `GET` method for `credentials` endpoint
nanderstabel Feb 27, 2024
84824a0
test: add `GET` method for `credentials` endpoint in postman collection
nanderstabel Feb 27, 2024
4ed0275
chore: add `/v1/credentials/{credential_id}` to `openapi.yaml` file
nanderstabel Feb 27, 2024
224b924
chore: bump `axum` dependency to `0.7`
nanderstabel Feb 28, 2024
ca32971
chore: update `axum` related code to version `0.7`
nanderstabel Feb 28, 2024
d23a4b0
feat: add `log_error_response` macro for cleaner logging of error res…
nanderstabel Feb 28, 2024
c0a488d
chore: update POST request to a valid OBv3 `credentialSubject`
nanderstabel Mar 4, 2024
41f9a60
chore: use `TraceLayer` for proper tracing in `agent_api_rest`
nanderstabel Mar 6, 2024
882631c
fix: remove obsolete `log_error_response` macro
nanderstabel Mar 6, 2024
45569d0
refactor: use `if` + `is_err()` rather than `match` for `command_hand…
nanderstabel Mar 6, 2024
7aae22a
feat: add `NOT_FOUND` response option
nanderstabel Mar 6, 2024
aa0491a
fix: set tokio version to `1`
nanderstabel Mar 7, 2024
5074e0c
feat: initialize module
daniel-mader Mar 8, 2024
036dd44
WIP
daniel-mader Mar 8, 2024
0914830
Merge remote-tracking branch 'origin/dev' into feat/event-publisher-http
daniel-mader Mar 11, 2024
92910be
refactor: move `ApplicationState` to `agent_shared`
nanderstabel Mar 18, 2024
bf0a17f
feat: add `agent_verification`
nanderstabel Mar 19, 2024
739b3d9
style: rename `AuthorizationRequestTestFramework` to `ConnectionTestF…
nanderstabel Mar 19, 2024
dd906da
feat: add `VerificationState` to `ApplicationState`
nanderstabel Mar 19, 2024
8019606
chore: add `Cargo.lock` file
nanderstabel Mar 19, 2024
f532142
feat: add verification endpoints
nanderstabel Mar 19, 2024
308cbfd
refactor: remove `ApplicationState` struct and replace it for a tuple
nanderstabel Mar 19, 2024
d06b3e2
Merge branch 'refactor/shared-application-state' into feat/add-agent-…
nanderstabel Mar 19, 2024
73c01a4
fix: remove `ConnectionNotificationSent`
nanderstabel Mar 19, 2024
ddb4bdb
feat: add `VerificationState` to `ApplicationState`
nanderstabel Mar 19, 2024
88cab68
feat: add `authorization_request` and `connection` tables to `init.sql`
nanderstabel Mar 20, 2024
45c2c30
Merge branch 'feat/add-verification-to-state' into feat/event-publish…
nanderstabel Mar 20, 2024
7699bd3
feat: add `EventPublisherHttp`
nanderstabel Mar 20, 2024
48f24ba
Merge branch 'dev' into feat/event-publisher-http
nanderstabel Mar 22, 2024
8a64bf4
feat: add `OutboundAdapter` trait
nanderstabel Mar 25, 2024
b73e237
test: add default parameters to tests in `agent_api_rest`
nanderstabel Mar 25, 2024
91ec8a2
feat: make `EventPublisherHttp` support all different aggregates
nanderstabel Mar 25, 2024
9be53bf
test: adjust test for `EventPublisherHttp`
nanderstabel Mar 25, 2024
b35a948
feat: add `EventPublisherHttp` to `agent_application`
nanderstabel Mar 25, 2024
64a7fda
test: fix `Mutex`
nanderstabel Mar 25, 2024
85c52a1
chore: remove unused environment variables from `.env.example`
nanderstabel Mar 25, 2024
e083bfd
Merge branch 'feat/event-publisher-http' into feat/verification-api
nanderstabel Mar 25, 2024
d298326
fix: rename aggregate event publishers
nanderstabel Mar 25, 2024
6decc5d
Merge branch 'feat/event-publisher-http' into feat/verification-api
nanderstabel Mar 25, 2024
74f27ee
test: improve tests for Verification in `agent_api_rest`
nanderstabel Mar 25, 2024
3c3e9ba
fix: rename siopv2 endpoints, add `path`
nanderstabel Mar 25, 2024
60ace7e
feat: move `client_metadata` to `VerificationServices`
nanderstabel Mar 25, 2024
47bc8a6
docs: add `README.md` file for `agent_event_publisher`, remove `confi…
nanderstabel Mar 25, 2024
b14b195
Merge branch 'feat/event-publisher-http' into feat/verification-api
nanderstabel Mar 25, 2024
8ddea31
fix: default to empty `EventPublisherHttp` when `config.yml` does not…
nanderstabel Mar 26, 2024
5fb13a9
Merge branch 'feat/event-publisher-http' into feat/verification-api
nanderstabel Mar 26, 2024
f0bbe3e
fix: use `client_id` for the `connection_id`
nanderstabel Mar 26, 2024
4d1ab4b
fix: return `text/plain` instead of `application/json`
nanderstabel Mar 26, 2024
ed2cf4f
fix: add `InvalidSIOPv2AuthorizationResponse` error
nanderstabel Mar 26, 2024
1825233
docs: add comments to Verification endpoints
nanderstabel Mar 26, 2024
4f1806b
fix: fix the path to the `config.yml` file
nanderstabel Mar 26, 2024
cfef783
test: fix test
nanderstabel Mar 26, 2024
1cda540
feat: enable `agent_event_publisher_http` in docker environment
nanderstabel Mar 27, 2024
7a346d2
docs: add documentation for `SecretManager` and `EventPublisherHttp`
nanderstabel Mar 27, 2024
e20ae8f
style: use `pub type`s for adapters
nanderstabel Mar 27, 2024
c30683d
Merge branch 'feat/event-publisher-http' into feat/verification-api
nanderstabel Mar 27, 2024
2ff41cb
feat: change content-type to application/json
nanderstabel Mar 27, 2024
d090626
style: replace closure for enum variant
nanderstabel Mar 27, 2024
5dcdd05
fix: change `authorization_requests` endpoints response content-type …
nanderstabel Mar 27, 2024
e1cf09d
docs: add verification related endpoints to `openapi.yml`
nanderstabel Mar 27, 2024
ad76815
style: rename `OutboundAdapter` to `EventPublisher`
nanderstabel Mar 27, 2024
f53a9de
Merge branch 'feat/event-publisher-http' into feat/verification-api
nanderstabel Mar 27, 2024
2fd8a60
docs: specify that the default Stronghold option is temporary
nanderstabel Mar 27, 2024
fc79cd5
refactor: move `secret_manager` function to `agent_secret_manager`
nanderstabel Mar 27, 2024
2f02857
feat: add `get_authorization_requests` endpoint
nanderstabel Mar 27, 2024
ef6682b
docs: fix example link
nanderstabel Mar 27, 2024
ed9ba0c
Merge branch 'dev' into feat/verification-api
nanderstabel Apr 2, 2024
da5831a
fix: fix `SecretManager` import
nanderstabel Apr 3, 2024
d5328a5
chore: update `did-manager` and `oid4vc` dependencies
nanderstabel Apr 8, 2024
fdeb07b
fix: reset `format-lint-test` workflow
nanderstabel Apr 9, 2024
7c7faee
test: add verification endpoints to Postman collection
nanderstabel Apr 10, 2024
c3aef9e
WIP
nanderstabel Apr 9, 2024
6a79666
Merge branch 'dev' into chore/bump-oid4vc
nanderstabel Apr 17, 2024
f190ada
feat: add `default_did_method`
nanderstabel Apr 19, 2024
f1c5c6e
style: remove unnecessary `let` binding
nanderstabel Apr 19, 2024
3a9949c
feat: support just-in-time external credential signing
nanderstabel Apr 22, 2024
ca0258d
Merge branch 'dev' into feat/oid4vci-events
nanderstabel Apr 24, 2024
93c14fe
style: fix clippy
nanderstabel Apr 24, 2024
dcb45f9
WIP
nanderstabel Apr 27, 2024
699cdc4
feat: add `did:iota`
nanderstabel Apr 29, 2024
af50e98
WIP
nanderstabel May 8, 2024
835a785
feat: implement `Subject` responsible for singing and verifying data
nanderstabel May 8, 2024
b24e404
feat: add `oid4vp` support
nanderstabel May 9, 2024
3e6c088
docs: update `/v1/authorization_request` in `openapi` file
nanderstabel May 9, 2024
b477a75
Merge branch 'dev' into feat/oid4vp
nanderstabel May 9, 2024
a7972a4
chore: update postman collection
nanderstabel May 9, 2024
f750c75
fix: set `presentation_definition` to contain `VerifiableCredential`
nanderstabel May 9, 2024
63c6ab9
fix: use slice directly
nanderstabel May 9, 2024
2321126
Merge branch 'feat/oid4vp' into feat/did-manager-iota
nanderstabel May 9, 2024
791d3ac
fix: use `did:iota:rms`
nanderstabel May 9, 2024
8593f9a
style: several cleanups
nanderstabel May 9, 2024
996e6ab
docs: add documentation for using the IOTA DID Method
nanderstabel May 9, 2024
045f130
feat: update docker-compose
nanderstabel May 9, 2024
bec2356
chore: update `oid4vc` dependencies
nanderstabel May 9, 2024
a32e0bd
fix: remove `test_definition.json`
nanderstabel May 9, 2024
f2e097d
style: rename endpoint deserialization helpers
nanderstabel May 13, 2024
f86a4b4
style: rename endpoint deserialization helpers
nanderstabel May 13, 2024
3ca4abe
docs: add comment for `GenericAuthorizationResponse`
nanderstabel May 13, 2024
d5a0a45
docs: improve the IOTA DID Method related documentation
nanderstabel May 13, 2024
f164ada
style: add newline
nanderstabel May 13, 2024
8950954
Merge branch 'feat/oid4vp' into feat/did-manager-iota
nanderstabel May 13, 2024
b0ddfdc
Merge branch 'dev' into feat/did-manager-iota
nanderstabel May 13, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 49 additions & 13 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 5 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@ rust-version = "1.76.0"

[workspace.dependencies]
did_manager = { git = "https://[email protected]/impierce/did-manager.git", rev = "c70c0f1" }
siopv2 = { git = "https://[email protected]/impierce/openid4vc.git", rev = "a932af7" }
oid4vci = { git = "https://[email protected]/impierce/openid4vc.git", rev = "a932af7" }
oid4vc-core = { git = "https://[email protected]/impierce/openid4vc.git", rev = "a932af7" }
oid4vc-manager = { git = "https://[email protected]/impierce/openid4vc.git", rev = "a932af7" }
siopv2 = { git = "https://[email protected]/impierce/openid4vc.git", rev = "7fdd207" }
oid4vci = { git = "https://[email protected]/impierce/openid4vc.git", rev = "7fdd207" }
oid4vc-core = { git = "https://[email protected]/impierce/openid4vc.git", rev = "7fdd207" }
oid4vc-manager = { git = "https://[email protected]/impierce/openid4vc.git", rev = "7fdd207" }
oid4vp = { git = "https://[email protected]/impierce/openid4vc.git", rev = "7fdd207" }

async-trait = "0.1"
axum = { version = "0.7", features = ["tracing"] }
Expand Down
1 change: 1 addition & 0 deletions agent_api_rest/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ http-api-problem = "0.57"
hyper = { version = "1.2" }
oid4vc-core.workspace = true
oid4vci.workspace = true
oid4vp.workspace = true
serde.workspace = true
serde_json.workspace = true
siopv2.workspace = true
Expand Down
6 changes: 6 additions & 0 deletions agent_api_rest/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,12 @@ paths:
nonce:
type: string
example: "0d520cbe176ab9e1f7888c70888020d84a69672a4baabd3ce1c6aaad8f6420c0"
state:
type: string
example: "84266fdbd31d4c2c6d0665f7e8380fa3"
presentation_definition_id:
type: string
example: "presentation_definition"
required:
- nonce
responses:
Expand Down
5 changes: 3 additions & 2 deletions agent_api_rest/postman/ssi-agent.postman_collection.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
"}",
""
],
"type": "text/javascript"
"type": "text/javascript",
"packages": {}
}
}
],
Expand Down Expand Up @@ -251,7 +252,7 @@
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"nonce\": \"this is a nonce\"\n}",
"raw": "{\n \"nonce\": \"this is a nonce\",\n \"presentation_definition_id\": \"presentation_definition\"\n}",
"options": {
"raw": {
"language": "json"
Expand Down
40 changes: 21 additions & 19 deletions agent_api_rest/src/issuance/credential_issuer/credential.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,25 @@ mod tests {
Mock, MockServer, ResponseTemplate,
};

const CREDENTIAL_JWT: &str = "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2dF\
ODROQ01wTWVBeDlqSzljZjVXNEc4Z2NaOXh1d0p2RzFlN3dOazhLQ2d0I3o2TWtn\
RTg0TkNNcE1lQXg5aks5Y2Y1VzRHOGdjWjl4dXdKdkcxZTd3Tms4S0NndCJ9.eyJ\
pc3MiOiJkaWQ6a2V5Ono2TWtnRTg0TkNNcE1lQXg5aks5Y2Y1VzRHOGdjWjl4dXd\
KdkcxZTd3Tms4S0NndCIsInN1YiI6ImRpZDprZXk6ejZNa2lpZXlvTE1TVnNKQVp\
2N0pqZTV3V1NrREV5bVVna3lGOGtiY3JqWnBYM3FkIiwiZXhwIjo5OTk5OTk5OTk\
5LCJpYXQiOjAsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8\
yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly9wdXJsLmltc2dsb2JhbC5vcmc\
vc3BlYy9vYi92M3AwL2NvbnRleHQtMy4wLjIuanNvbiJdLCJpZCI6Imh0dHA6Ly9\
leGFtcGxlLmNvbS9jcmVkZW50aWFscy8zNTI3IiwidHlwZSI6WyJWZXJpZmlhYmx\
lQ3JlZGVudGlhbCIsIk9wZW5CYWRnZUNyZWRlbnRpYWwiXSwiaXNzdWVyIjoiZGl\
kOmtleTp6Nk1rZ0U4NE5DTXBNZUF4OWpLOWNmNVc0RzhnY1o5eHV3SnZHMWU3d05\
rOEtDZ3QiLCJpc3N1YW5jZURhdGUiOiIyMDEwLTAxLTAxVDAwOjAwOjAwWiIsIm5\
hbWUiOiJUZWFtd29yayBCYWRnZSIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImZpcnN\
0X25hbWUiOiJGZXJyaXMiLCJsYXN0X25hbWUiOiJSdXN0YWNlYW4iLCJpZCI6ImR\
pZDprZXk6ejZNa2lpZXlvTE1TVnNKQVp2N0pqZTV3V1NrREV5bVVna3lGOGtiY3J\
qWnBYM3FkIn19fQ.MzHsluxKNsnA01df0kUyXVBIzkBJajKhHbuG-_vNGz0QAPQ1\
6jZ4IwAtEwt6XfbV9luFalRL3qtsmDvaNBf7CA";

trait CredentialEventTrigger {
async fn prepare_credential_event_trigger(&self, app: Arc<Mutex<Option<Router>>>, is_self_signed: bool);
}
Expand Down Expand Up @@ -172,7 +191,7 @@ mod tests {
let credentials_endpoint_request = if is_self_signed {
CredentialsRequest {
offer_id: offer_id.clone(),
credential: json!("eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2lpZXlvTE1TVnNKQVp2N0pqZTV3V1NrREV5bVVna3lGOGtiY3JqWnBYM3FkI3o2TWtpaWV5b0xNU1ZzSkFadjdKamU1d1dTa0RFeW1VZ2t5RjhrYmNyalpwWDNxZCJ9.eyJpc3MiOiJkaWQ6a2V5Ono2TWtpaWV5b0xNU1ZzSkFadjdKamU1d1dTa0RFeW1VZ2t5RjhrYmNyalpwWDNxZCIsInN1YiI6ImRpZDprZXk6ejZNa2lpZXlvTE1TVnNKQVp2N0pqZTV3V1NrREV5bVVna3lGOGtiY3JqWnBYM3FkIiwiZXhwIjo5OTk5OTk5OTk5LCJpYXQiOjAsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly9wdXJsLmltc2dsb2JhbC5vcmcvc3BlYy9vYi92M3AwL2NvbnRleHQtMy4wLjIuanNvbiJdLCJpZCI6Imh0dHA6Ly9leGFtcGxlLmNvbS9jcmVkZW50aWFscy8zNTI3IiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIk9wZW5CYWRnZUNyZWRlbnRpYWwiXSwiaXNzdWVyIjoiZGlkOmtleTp6Nk1raWlleW9MTVNWc0pBWnY3SmplNXdXU2tERXltVWdreUY4a2JjcmpacFgzcWQiLCJpc3N1YW5jZURhdGUiOiIyMDEwLTAxLTAxVDAwOjAwOjAwWiIsIm5hbWUiOiJUZWFtd29yayBCYWRnZSIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImZpcnN0X25hbWUiOiJGZXJyaXMiLCJsYXN0X25hbWUiOiJSdXN0YWNlYW4iLCJpZCI6ImRpZDprZXk6ejZNa2lpZXlvTE1TVnNKQVp2N0pqZTV3V1NrREV5bVVna3lGOGtiY3JqWnBYM3FkIn19fQ.r7T_zOXP7E2k7eAPq5EF20shwrnPKK0mOCfNaB0phPEXVkYSG_sf6QygUDuJ8-P0yU4EEajgE0dxJuRfdMVDAQ"),
credential: json!(CREDENTIAL_JWT),
is_signed: true,
}
} else {
Expand Down Expand Up @@ -328,24 +347,7 @@ mod tests {
assert_eq!(
body,
json!({
"credential": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2lp\
ZXlvTE1TVnNKQVp2N0pqZTV3V1NrREV5bVVna3lGOGtiY3JqWnBYM3FkI3o2TWtp\
aWV5b0xNU1ZzSkFadjdKamU1d1dTa0RFeW1VZ2t5RjhrYmNyalpwWDNxZCJ9.eyJ\
pc3MiOiJkaWQ6a2V5Ono2TWtpaWV5b0xNU1ZzSkFadjdKamU1d1dTa0RFeW1VZ2t\
5RjhrYmNyalpwWDNxZCIsInN1YiI6ImRpZDprZXk6ejZNa2lpZXlvTE1TVnNKQVp\
2N0pqZTV3V1NrREV5bVVna3lGOGtiY3JqWnBYM3FkIiwiZXhwIjo5OTk5OTk5OTk\
5LCJpYXQiOjAsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8\
yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly9wdXJsLmltc2dsb2JhbC5vcmc\
vc3BlYy9vYi92M3AwL2NvbnRleHQtMy4wLjIuanNvbiJdLCJpZCI6Imh0dHA6Ly9\
leGFtcGxlLmNvbS9jcmVkZW50aWFscy8zNTI3IiwidHlwZSI6WyJWZXJpZmlhYmx\
lQ3JlZGVudGlhbCIsIk9wZW5CYWRnZUNyZWRlbnRpYWwiXSwiaXNzdWVyIjoiZGl\
kOmtleTp6Nk1raWlleW9MTVNWc0pBWnY3SmplNXdXU2tERXltVWdreUY4a2Jjcmp\
acFgzcWQiLCJpc3N1YW5jZURhdGUiOiIyMDEwLTAxLTAxVDAwOjAwOjAwWiIsIm5\
hbWUiOiJUZWFtd29yayBCYWRnZSIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImZpcnN\
0X25hbWUiOiJGZXJyaXMiLCJsYXN0X25hbWUiOiJSdXN0YWNlYW4iLCJpZCI6ImR\
pZDprZXk6ejZNa2lpZXlvTE1TVnNKQVp2N0pqZTV3V1NrREV5bVVna3lGOGtiY3J\
qWnBYM3FkIn19fQ.r7T_zOXP7E2k7eAPq5EF20shwrnPKK0mOCfNaB0phPEXVkYS\
G_sf6QygUDuJ8-P0yU4EEajgE0dxJuRfdMVDAQ"
"credential": CREDENTIAL_JWT
}
)
);
Expand Down
Loading