Skip to content

Elastic Labs - Polkadot Agent Kit - Milestone 2#1299

Merged
diogo-w3f merged 2 commits intow3f:masterfrom
elasticlabs-org:elastic-labs-milestone-2
Jan 6, 2026
Merged

Elastic Labs - Polkadot Agent Kit - Milestone 2#1299
diogo-w3f merged 2 commits intow3f:masterfrom
elasticlabs-org:elastic-labs-milestone-2

Conversation

@chungquantin
Copy link
Contributor

@chungquantin chungquantin commented Nov 14, 2025

Milestone Delivery Checklist

  • The milestone-delivery-template.md has been copied and updated.
  • This pull request is being made by the same account as the accepted application.
  • I have disclosed any and all sources of reused code in the submitted repositories and have done my due diligence to meet its license requirements.
  • In case of acceptance, invoices must be submitted and payments will be transferred to the Polkadot AssetHub and/or fiat account provided in the application.
  • The delivery is according to the Guidelines for Milestone Deliverables.

Link to the application pull request: https://github.com/w3f/Grants-Program/blob/master/applications/polkadot_agent_kit.md < please fill this in with the PR number of your application.

@chungquantin chungquantin changed the title feat: upload delivery proposal for agent kit milestone 2 Elastic Labs - Polkadot Agent Kit - Milestone 2 Nov 14, 2025
@diogo-w3f
Copy link
Contributor

@chungquantin and @tin-thebc thanks for the milestone delivery. I've tried to run the tests but some are failing. Furthermore, I was not able to measure the testing coverage. Please see the evaluation document and provide proper answers and fixes. Let me know when I can test it again.

@CocDap
Copy link

CocDap commented Dec 11, 2025

Due to the recent Asset Hub migration, there have been runtime changes on both Asset Hub and RelayChain that caused several issues:

Some public RPCs are unstable.

  1. All assets on RelayChain have migrated to Asset Hub.
  2. Paraspell updated its logic to accommodate the migration.
  3. This explains why the setup worked when we collaborated 2-3 weeks ago but is failing now.

I have addressed these changes in elasticlabs-org/polkadot-agent-kit#126 . Please checkout the main branch and re-run the tests on both testnet and mainnet.

It is working from my side

Testnet

pnpm run test:integration:testnet
image

Mainnet

pnpm run test:integration:mainnet
image

CC: @chungquantin @diogo-w3f

@diogo-w3f
Copy link
Contributor

@CocDap thanks for the improvements and fixes. The integration tests now run on testnet. However, they don't show the full requirements for this milestones are met. Please update the tests to be able to show all them. See the details in the evaluation document. Let me know when I can check again.

@CocDap
Copy link

CocDap commented Dec 11, 2025

Hi @diogo-w3f

Thank you for the feedback. I have reviewed the current integration tests, and from my perspective, all the requirements appear to be covered by the existing test cases.

  1. Hydration swap tooling : https://github.com/elasticlabs-org/polkadot-agent-kit/blob/main/packages/sdk/tests/integration-tests/sdk.mainnet.itest.ts#L41

-> Implementation exists, but we could not confirm behavior on testnet/mainnet due to failing integration suites.
-> My answer: To confirm, did this test case fail for you?

  1. Bifrost vDOT tooling: https://github.com/elasticlabs-org/polkadot-agent-kit/blob/main/packages/sdk/tests/integration-tests/sdk.mainnet.itest.ts#L102

-> Implementation exists, but minting flow could not be exercised (tests blocked).
-> My answer: I think we have some assertions that make sure the logic correctly when agent trigger (https://github.com/elasticlabs-org/polkadot-agent-kit/blob/main/packages/sdk/tests/integration-tests/sdk.mainnet.itest.ts#L208)

  1. Nomination pool tooling: https://github.com/elasticlabs-org/polkadot-agent-kit/blob/main/packages/sdk/tests/integration-tests/sdk.itest.ts#L242

-> Only part of the staking suite succeeds; withdraw path currently fails.
-> My answer: It is expectation behavior, because we need to wait for the unbonding duration to pass and call withdraw_unbonded.

  1. MCP server: https://github.com/CocDap/polkadot-agent-kit-testing/blob/main/src/mcp.ts
    How to run MCP server: https://github.com/CocDap/polkadot-agent-kit-testing/blob/main/README.md#polkadot-agent-kit-testing-mcp-server

  2. You are right—I realized I missed the LangChain conversion. I have now updated the tests to cover this (elasticlabs-org/polkadot-agent-kit@dee3770)
    But it is also including the Telegram bot and MCP server examples ( working such as https://github.com/elasticlabs-org/polkadot-agent-kit/blob/main/examples/telegram-bot/src/TelegramBot.ts#L91)

Could you please specify which exact requirements from the evaluation document you feel are missing or not clearly demonstrated? This will help me ensure I address the specific gaps you are seeing.

@diogo-w3f
Copy link
Contributor

@CocDap I see that some tests are only available on mainnet. Is it possible to make them available on a testnet? This would make our verification easier, since we wouldn’t need mainnet tokens. It’s not usual to use mainnet for testing, in fact.

For each test, it would be helpful if you could provide some evidence, such as the transaction hash, so I can verify each transaction on-chain.

Please let me know if it will be possible to run all tests on a testnet with the corresponding evidence for verification. Otherwise, advise what tokens we need to have to be able to run these tests.

@CocDap
Copy link

CocDap commented Dec 16, 2025

Hi @diogo-w3f

Status Update: Testnet Limitations & Mainnet Verification

Currently, I am facing some blockers with the Testnet environment, so I have verified the integration on Mainnet instead.

1. Current Issues (Testnet)

  • Paraspell SDK: @paraspell does not currently support the XCM Router on Testnet.
  • Bifrost Faucet: I am blocked on acquiring PAS testing tokens on Bifrost (awaiting support from the Bifrost team).

2. Mainnet Verification

I have successfully run the integration tests on Mainnet. Below are the transaction hashes for reference:

3. How to Replicate (Mainnet)

To replicate these test cases manually against Mainnet, please follow these steps:

Prerequisites:

  • For Swap: Ensure you have sufficient DOT balance on Polkadot Asset Hub.
  • For Mint vDOT: Ensure you have sufficient DOT balance on Bifrost.

Run command:

pnpm run test:integration:mainnet

Full Result:

image

4. Testnet Verification

image image image image image image image image

@diogo-w3f
Copy link
Contributor

@CocDap thanks for the explanation. I funded this account 13nG3YW4JUe6XdnYiHXiYxzwCQRHvpzHdgUuQP7C3Q5QjMff on mainnet and tried to run the tests but they are failing. Can you help with that:

Swap Tokens Query Result (Polkadot Asset Hub → USDT on Hydration): {
  input: 'swap 0.1 DOT from Polkadot Asset Hub to USDT on Hydration',
  output: 'Okay, the user tried to swap 0.1 DOT from Polkadot Asset Hub to USDT on Hydration, but the swap failed due to insufficient balance. The first step was to check the balance on the source chain, AssetHubPolkadot. The check_balance function was called, and it returned a balance of 0.05 DOT. \n' +
    '\n' +
    "Since 0.05 is less than the required 0.1, the user doesn't have enough DOT in their wallet on the source chain. The next logical step is to inform the user about this insufficient balance and suggest they add more DOT to their wallet on Polkadot Asset Hub. \n" +
    '\n' +
    "Alternatively, if the user wants to proceed with a smaller amount, they could adjust the swap quantity. But since the user's original request was for 0.1, the main issue is the balance. There's no need to call another function here because the problem is clear. The response should guide the user to check their balance and add funds if necessary.\n" +
    'The swap failed because your wallet on **Polkadot Asset Hub** only has **0.05 DOT** available, but the swap requires **0.1 DOT**. \n' +
    '\n' +
    '### Next Steps:\n' +
    '1. **Add more DOT** to your Polkadot Asset Hub wallet to meet the required amount.\n' +
    "2. **Adjust the swap amount** if you'd like to proceed with a smaller quantity.\n" +
    '\n' +
    "Let me know how you'd like to proceed!",
  intermediateSteps: [
    {
      action: [Object],
      observation: '{"content":"{\\"success\\":true,\\"data\\":\\"Cross-chain swap failed: 0.1 DOT to USDT from AssetHubPolkadot to Hydration. Error: Unable to swap due to insufficient balance\\",\\"tool\\":\\"swap_tokens\\",\\"timestamp\\":\\"2025-12-17T19:36:36.463Z\\"}","tool_call_id":"swap_tokens_1766000196463"}'
    },
    { action: [Object], observation: '' },
    { action: [Object], observation: '' }
  ],
  provider: 'ollama',
  model: 'qwen3:latest'
}

stdout | tests/integration-tests/sdk.mainnet.itest.ts
[smoldot] Smoldot v2.0.40. Current memory usage: 35.8 MiB. Average download: 2.9 kiB/s. Average upload: 1.1 kiB/s. Average CPU cores: 0.01.

stdout | tests/integration-tests/sdk.mainnet.itest.ts
[smoldot] Smoldot v2.0.40. Current memory usage: 35.8 MiB. Average download: 2.5 kiB/s. Average upload: 1.2 kiB/s. Average CPU cores: 0.01.

stdout | tests/integration-tests/sdk.mainnet.itest.ts
[smoldot] Smoldot v2.0.40. Current memory usage: 35.8 MiB. Average download: 2.5 kiB/s. Average upload: 1.1 kiB/s. Average CPU cores: 0.01.

stdout | tests/integration-tests/sdk.mainnet.itest.ts
[runtime-polkadot] Finalized block runtime ready. Spec version: 2000001. Size of `:code`: 1.7 MiB.

stdout | tests/integration-tests/sdk.mainnet.itest.ts
[runtime-polkadot] Successfully compiled runtime. Spec version: 2000001. Size of `:code`: 1.7 MiB.

stdout | tests/integration-tests/sdk.mainnet.itest.ts
[runtime-asset-hub-polkadot] Successfully compiled runtime. Spec version: 2000003. Size of `:code`: 1.9 MiB.

stdout | tests/integration-tests/sdk.mainnet.itest.ts
Balance DOT After: {
  nonce: 0,
  consumers: 0,
  providers: 0,
  sufficients: 0,
  data: {
    free: 0n,
    reserved: 0n,
    frozen: 0n,
    flags: 170141183460469231731687303715884105728n
  }
}

stdout | tests/integration-tests/sdk.mainnet.itest.ts
Balance USDT After (Asset ID 10): { free: 0n, reserved: 0n, frozen: 0n }

 ❯ tests/integration-tests/sdk.mainnet.itest.ts (2 tests | 2 failed) 320505ms
   × PolkadotAgentKit Integration with LLM Agent Swap > should call swap_tokens tool for Polkadot to Polkadot Asset Hub swap 294437ms
     → expected 0 to be less than -1000000000
   × PolkadotAgentKit Integration with LLM Agent Bifrost > should call mint_vdot tool for minting vDOT on Bifrost 117387ms
     → expected 0n to deeply equal -5000000000n

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 2 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯

 FAIL  tests/integration-tests/sdk.mainnet.itest.ts > PolkadotAgentKit Integration with LLM Agent Swap > should call swap_tokens tool for Polkadot to Polkadot Asset Hub swap
AssertionError: expected 0 to be less than -1000000000
 ❯ tests/integration-tests/sdk.mainnet.itest.ts:88:43
     86| 
     87|         // compare the balance before and after swapping 
     88|         expect(balanceDotAfter.data.free).toBeLessThan(balanceDotBefore.data.free - amount);
       |                                           ^
     89|         
     90|         // Verify USDT balance increased after swap

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯

 FAIL  tests/integration-tests/sdk.mainnet.itest.ts > PolkadotAgentKit Integration with LLM Agent Bifrost > should call mint_vdot tool for minting vDOT on Bifrost
AssertionError: expected 0n to deeply equal -5000000000n

- Expected
+ Received

- -5000000000n
+ 0n

 ❯ tests/integration-tests/sdk.mainnet.itest.ts:208:33
    206| 
    207|         // we set fee asset default is BNC (Bifrost)
    208|         expect(balanceDotAfter).toEqual(balanceDotBefore - amount);
       |                                 ^
    209| 
    210|         expect(balancevDotAfter).toBeGreaterThan(balanceVDotBefore);

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯


 Test Files  1 failed (1)
      Tests  2 failed (2)
   Start at  16:34:53
   Duration  323.12s (transform 71ms, setup 0ms, collect 2.44s, tests 320.51s, environment 0ms, prepare 50ms)

/Users/diogo/workspace/grants/polkadot-agent-kit/packages/sdk:
 ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL  @polkadot-agent-kit/sdk@2.1.5 test:integration:mainnet: `vitest run --config ./vitest.config.mainnet.ts --sequence.concurrent`
Exit status 1

@CocDap
Copy link

CocDap commented Dec 18, 2025

hi @diogo-w3f . I reproduced the new funded account. it is working properly.

@polkadot-agent-kit/sdk:test:integration:mainnet: Swap Tokens Query Result (Polkadot Asset Hub → USDT on Hydration): {
@polkadot-agent-kit/sdk:test:integration:mainnet:   input: 'swap 0.1 DOT from Polkadot Asset Hub to USDT on Hydration',
@polkadot-agent-kit/sdk:test:integration:mainnet:   output: 'Okay, the user asked to swap 0.1 DOT from Polkadot Asset Hub to USDT on Hydration. I used the swap_tokens function with the converted chain names and currency symbols. The response from the tool indicates the swap was successful with a transaction hash. Now, I need to relay this information back to the user in a clear and friendly manner.\n' +
@polkadot-agent-kit/sdk:test:integration:mainnet:     '\n' +
@polkadot-agent-kit/sdk:test:integration:mainnet:     'First, confirm the success of the swap. Mention the amount, the source and destination chains, and the currencies involved. Include the transaction hash so they can verify it. Also, offer further assistance in case they need anything else. Keep the tone positive and helpful.\n' +
@polkadot-agent-kit/sdk:test:integration:mainnet:     'The cross-chain swap has been successfully executed!  \n' +
@polkadot-agent-kit/sdk:test:integration:mainnet:     '**0.1 DOT** has been converted to **USDT**  \n' +
@polkadot-agent-kit/sdk:test:integration:mainnet:     '- **From**: AssetHubPolkadot (Polkadot Asset Hub)  \n' +
@polkadot-agent-kit/sdk:test:integration:mainnet:     '- **To**: Hydration  \n' +
@polkadot-agent-kit/sdk:test:integration:mainnet:     '\n' +
@polkadot-agent-kit/sdk:test:integration:mainnet:     '✅ **Transaction Hash**: [0x1d8b342813b61dae3b7bd53aa1c4ea8e8cf73765f3ff06107852b8dd278a6bf0](https://scan.polkadot.org/tx/0x1d8b342813b61dae3b7bd53aa1c4ea8e8cf73765f3ff06107852b8dd278a6bf0)  \n' +
@polkadot-agent-kit/sdk:test:integration:mainnet:     '\n' +
@polkadot-agent-kit/sdk:test:integration:mainnet:     'Let me know if you need further assistance!',
@polkadot-agent-kit/sdk:test:integration:mainnet:   intermediateSteps: [
@polkadot-agent-kit/sdk:test:integration:mainnet:     {
@polkadot-agent-kit/sdk:test:integration:mainnet:       action: [Object],
@polkadot-agent-kit/sdk:test:integration:mainnet:       observation: '{"content":"{\\"success\\":true,\\"data\\":\\"Cross-chain swap successful: 0.1 DOT to USDT from AssetHubPolkadot to Hydration. Tx Hash: 0x1d8b342813b61dae3b7bd53aa1c4ea8e8cf73765f3ff06107852b8dd278a6bf0\\",\\"tool\\":\\"swap_tokens\\",\\"timestamp\\":\\"2025-12-18T05:22:10.086Z\\"}","tool_call_id":"swap_tokens_1766035330086"}'
@polkadot-agent-kit/sdk:test:integration:mainnet:     }
@polkadot-agent-kit/sdk:test:integration:mainnet:   ],
@polkadot-agent-kit/sdk:test:integration:mainnet:   provider: 'ollama',
@polkadot-agent-kit/sdk:test:integration:mainnet:   model: 'qwen3:latest'
@polkadot-agent-kit/sdk:test:integration:mainnet: }

This is my testing account: https://assethub-polkadot.subscan.io/account/12Sz5LM2MjA3Cs8eXPLNxNwoqNk5MCrdj2mCsN2yk1Atvty2?tab=extrinsic

Can you try to re-run again? Make sure that you have enough balance on Polkadot Asset Hub and Bifrost

Did you add your testing private key to .env (AGENT_PRIVATE_KEY_MAINNET)?

@diogo-w3f
Copy link
Contributor

diogo-w3f commented Dec 18, 2025

@CocDap Yes, I've added a private key for mainnet. I was able to run the tests using this address 14xSKfjciBCJjUt7QPyqkZyosnExbFB2qibBfaDFFvtzxN2g and see the effect on chain, however, one test is still failing. Can you check and fix this?

Balance USDT After (Asset ID 10): { free: 280985n, reserved: 0n, frozen: 0n }

 ❯ tests/integration-tests/sdk.mainnet.itest.ts (2 tests | 1 failed) 336437ms
   ✓ PolkadotAgentKit Integration with LLM Agent Swap > should call swap_tokens tool for Polkadot to Polkadot Asset Hub swap  312362ms
   × PolkadotAgentKit Integration with LLM Agent Bifrost > should call mint_vdot tool for minting vDOT on Bifrost 143003ms
     → expected 5000000000n to deeply equal -5000000000n

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯

 FAIL  tests/integration-tests/sdk.mainnet.itest.ts > PolkadotAgentKit Integration with LLM Agent Bifrost > should call mint_vdot tool for minting vDOT on Bifrost
AssertionError: expected 5000000000n to deeply equal -5000000000n

- Expected
+ Received

- -5000000000n
+ 5000000000n

 ❯ tests/integration-tests/sdk.mainnet.itest.ts:208:33
    206| 
    207|         // we set fee asset default is BNC (Bifrost)
    208|         expect(balanceDotAfter).toEqual(balanceDotBefore - amount);
       |                                 ^
    209| 
    210|         expect(balancevDotAfter).toBeGreaterThan(balanceVDotBefore);

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯


 Test Files  1 failed (1)
      Tests  1 failed | 1 passed (2)
   Start at  12:08:33
   Duration  338.80s (transform 71ms, setup 0ms, collect 2.17s, tests 336.44s, environment 0ms, prepare 42ms)

 ELIFECYCLE  Command failed with exit code 1.

@CocDap
Copy link

CocDap commented Dec 20, 2025

hi @diogo-w3f . i replicated multiple times, it is working properly from my side. I have checked your account again, it seems working now
image

@github-actions github-actions bot added the stale label Jan 3, 2026
@CocDap
Copy link

CocDap commented Jan 5, 2026

I hope you enjoyed the holiday break. Would you mind reviewing my comments once more at your convenience?
@diogo-w3f

@diogo-w3f
Copy link
Contributor

@CocDap thanks for the explanation. I've checked again and the tests failed due to an assertion that is only in my env. In this way, the milestone is accepted. See the details in the evaluation document. Great work!

@diogo-w3f diogo-w3f merged commit f87a446 into w3f:master Jan 6, 2026
3 checks passed
@github-actions
Copy link

github-actions bot commented Jan 6, 2026

🪙 Please fill out the invoice form in order to initiate the payment process. Please make sure that you follow the instructions and requirements as laid out in the form as well as our Terms & Conditions. Thank you!

@chungquantin
Copy link
Contributor Author

@diogo-w3f
Copy link
Contributor

@chungquantin the form was closed by mistake, now it is open. Please use it to submit your invoice.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants